中小企業の働き方改革をサポート>>

こんにちわ。
いつも拝見しております。

PHPでODBC接続によるSQL Serverへの問い合わせを行う部分でエラーが出て困っております。

odbc_exec()[function.odbc-exec]:SQL error:[Microsoft][ODBC SQL Server Driver][SQL Server][文字化けしたSQL文]SQL state 37000 in SQLExecDirect in C://.......

SJISの時は問題なかったのですがcharsetや保存形式をUTF-8に統一してから出るようになりました。

SQL文は下記のように日本語となっております。
$str = "select 担務,部課 from group by id";

解決策がありましたらご教示下さい。

よろしくお願い致します。

このQ&Aに関連する最新のQ&A

A 回答 (9件)

>SJISの時は問題なかったのですがcharsetや保存形式をUTF-8に統一してから出るようになりました。


SQL Serverの文字コードはUTF-8になっているということでしょうか。
また、PHPのマルチバイト文字関連の設定を詳しく教えてください。

この回答への補足

UmJammerさん

ありがとうございます。

SQL Serverの文字コードは恥ずかしながら確認方法が分かりませんでしたので調べてみます。

文字関連の設定を記載させて頂きます。
【php】
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
と記述してUTF-8で保存しました。
【php.ini】
magic_quotes_gpc = Off
extension_dir = "C:/php/ext"
extension=php_mbstring.dll
extension=php_mssql.dll
extension=php_pdo.dll
extension=php_pdo_mssql.dll
extension=php_pdo_odbc.dll

[ODBC]
odbc.allow_persistent = On
odbc.check_persistent = On
odbc.max_persistent = -1
odbc.max_links = -1
odbc.defaultlrl = 4096
odbc.defaultbinmode = 1

[mbstring]
mbstring.language = Japanese
mbstring.internal_encoding = UTF-8
mbstring.http_input = auto
mbstring.http_output = UTF-8
mbstring.encoding_translation = On
mbstring.detect_order = auto
mbstring.substitute_character = none

このような形になっております。
どうぞよろしくお願い致します。

補足日時:2009/07/03 18:41
    • good
    • 0

DBのデータはSJIS、内部エンコードおよび出力はUTF-8なので、取得したデータを正しく表示するにはやはり文字コードを変換しなければなりません。


というような意味で取り扱いには注意しましょうと書いたのですが、回りくどすぎましたね。

先ほどの回答の$clm1をUTF-8に変換して出力してみてください。

echo mb_convert_encoding($com1, "UTF-8", "SJIS");

これでPHPの設定に変更がなければこれで正しく表示されるはずです。

気になったのですが、
>DBのSJISの問題はまだ解決していないのですが
これはつまるところDBもUnicode(UTF-8)に変更するということでしょうか。であればそちらを優先しなくてはダメですよ。
というよりPHPのコーディングなどしてる場合ではないです。
というのも、DBがUnicode(UTF-8)になれば、文字コードの変換処理は不要になりますから。
まぁちょっとした勉強にはなったかもしれませんが。。
    • good
    • 0
この回答へのお礼

UmJammerさま

ありがとうございます。
うまく表示されました!

DBもUnicode(UTF-8)に変更しない予定のようですので今はPHP側で変換処理をしていこうと思います。

仰るとおりとてもいい勉強にもなりました!

数日に渡りご教示頂きましてありがとうございました。

感謝しております。

お礼日時:2009/07/07 14:03

ANo.1です。

たびたびすいません。

また訂正です。。
×$clm1 = odbc_result($r, mb_convert_encoding("0120担当者", "SJIS", "UF-8");
○$clm1 = odbc_result($r, mb_convert_encoding("0120担当者", "SJIS", "UTF-8"));

この回答への補足

UmJammerさん

ご教示ありがとうございます。

odbc_result($r, mb_convert_encoding("0120担当者", "SJIS", "UTF-8"));

でNot Fieldのエラーは解消しましたが文字化けしてしまっているようです。
「~??~??」みたいな感じです。

DBのSJISの問題はまだ解決していないのですがこちらを解決しなければこの文字化けは解消しないのでしょうか?

度々、すみませんがよろしくお願い致します。

ご教示のおかげでここまで来ることができました。
ありがとうございます。

補足日時:2009/07/07 11:25
    • good
    • 0

ANo.1です。



>mb_detect_encoding($clm1)
>としてみると「ASCII」と表示が出ました。
ここは一旦放っておいても平気です。

問題は、
>$clm1 = odbc_result($r,"0120担当者");
この「0120担当者」は内部エンコーディング(UTF-8)で記述されているので、SJISのDBのフィールド名とは合致しないのではないかと思うのですが、それともエラーは解決したのでしょうか。
未だエラーが出るようでしたら、ここを

$clm1 = odbc_result($r, mb_convert_encoding("0120担当者", "SJIS", "UTF-8");

と書きなおして実行してみてください。
#これならはじめの方に質問者様が書いたようにフィールド名ごとに文字コード変換をして変数に格納しておく方が効率的でしたね。。
#もしくはすべてAS句で半角英数の別名をつけた方がまだ楽かもしれないですね。

ところで、これで無事にDBからデータが取得できてもその値もやはりSJISなのでその取扱いには注意してください。
    • good
    • 0

ANo.1です。



補足説明ありがとうございました。
SQLが間違ってるのかと思っていたのですが、odbc_resultでエラーなので違いますね、こちらこそ申し訳ありませんでした。

で、ここからはコードが省略されているので予想ですが、
odbc_resultで「0120担当者」を取得するときにフィールド名で取得しに行っていると思うのですが、これがSJISでないということはないですか?
DBがSJISだとすると、フィールド名もSJISなので内部エンコーディング(UTF-8)で「0120担当者」と書いても通らないはずです。

この回答への補足

UmJammerさん

おはようございます。
仰るとおり
$clm1 = odbc_result($r,"0120担当者");
で取得しております。

mb_detect_encoding($clm1)
としてみると「ASCII」と表示が出ました。

どうぞ宜しくお願い致します。

補足日時:2009/07/07 10:11
    • good
    • 0

ANo.1です。

たびたびすいません。

訂正です。
>「担当者」というフィールドではなかったのですか?
ここ、「担当者」でなくて「担務」です。

この回答への補足

UmJammerさん

大変失礼致しました。
先ほど指示があり多少、項目が変更となってしまいました。

$str = "select [0120担当者],個数 AS Count from datatbl group by id";
こちらが確定版です。

エラーメッセージは抜粋ではないです。
画面にエラーだけが表示されているわけではなくCountについてはHTML表示されており先ほどのエラーメッセージが上に表示されている状態です。

SQL文のフィールドは確かに存在する事を確認しております。
わかりづらく申しわけございませんでした。

補足日時:2009/07/06 16:07
    • good
    • 0

>[function.odbc-result]:Fied 0120担当者 not found in


これって、「0120担当者」というフィールドがないってメッセージですかね。「担当者」というフィールドではなかったのですか?
エラーメッセージは抜粋ですか?であれば全部載せた方が回答が得られやすいと思います。
    • good
    • 0

ANo.1です。



>おっしゃっている内容は

>$clm1 = mb_convert_encoding("担務",'SJIS')
>$clm2 = mb_convert_encoding("部課",'SJIS')

>$str = "select $clm1,$clm2 from group by id";

>上記のようにするといった認識で宜しいでしょうか?
問題ないと思いますが、SQLを投げるだけだったら以下でもよいかと思います。

$str = "select 担務,部課 from group by id";
$str = mb_convert_encoding($str, "SJIS", "UTF-8");

これでSQLが通るようになるかもしれませんが、やはりDBの文字コードもUnicode(UTF-8)にした方がなにかと都合がよいです。
あとは、フィールド名などにマルチバイト文字を使うのはあまりよくないような。。

この回答への補足

UmJammerさん

どうもありがとうございます。
本日、やっと試すことができたのでお返事が遅くなりました。

ご教示頂いた記述でSQLは通りました。
しかしresultの部分で
***************************************************
[function.odbc-result]:Fied 0120担当者 not found in
***************************************************
と出てしまいました。

mb_detect_encodingをprintするとASCIIとなっていましたがこれはどの様にコーディングするといいのでしょうか?

同じようにmb_convert_encodingを使ってみましたが改善されませんでした。

度々の質問で恐縮ですがよろしくお願いします。

ソースは以下のようになっております。

-----------------------------------------------------
$db = odbc_connect("web","test","test");
$str = "select [0120担当者],部課 from group by id";
$str = mb_convert_encoding($str, "SJIS", "UTF-8");
$r = odbc_exec($db,$str);
while(odbc_fetch_row($r)){
$clm1 = odbc_result($r,"");
~HTMLで<?= $clm1 ?>を出力~
}
-----------------------------------------------------

補足日時:2009/07/06 11:38
    • good
    • 0

ANo.1です。



補足説明ありがとうございます。
PHPの方は完全にUTF-8に対応していますね。
もしかするとSQL Serverの文字コードがSJISなのかもしれません。
SQL文の文字コードを、発行される前にSJISに変換してみるとどうでしょうか。

この回答への補足

UmJammerさん

こちらこそご教示頂きありがとうございます。

おっしゃっている内容は

$clm1 = mb_convert_encoding("担務",'SJIS')
$clm2 = mb_convert_encoding("部課",'SJIS')

$str = "select $clm1,$clm2 from group by id";

上記のようにするといった認識で宜しいでしょうか?

知識不足の為、お手数をおかけしますがよろしくお願い致します。

補足日時:2009/07/04 01:57
    • good
    • 0

このQ&Aに関連する人気のQ&A

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

QSQL Server のキャラクターセット(内部文字コード)は何処で定義するのでしょうか?

SQL Server超初心者です。(Oracleについては約1年ちょっとの経験はあります)どうぞよろしくお願いします。
今回SQL Server2005 を使って簡単なシステムを構築する事になりました。
SQL Serverが扱う文字コートについて教えてください。
Oracleを使っていた時の経験としてDB内部のキャラクターセットと
クライアントで使う文字セット(NLS_LANG)を意識しておかないと、いろんな「文字化け」問題に遭遇した時に対応できませんでした。
きっとSQL Serverにおいても同じような事ではないかと思いここに質問させていただきます。
以下2点についてどなたかコメント願います。
1.(Oracleでいうキャラクターセット)はどこで定義するのでしょうか?
2.OracleでいうNLS_LANGに相当するものはあるのでしょうか?
 (ひょっとしたらマイクロソフト製品なのでサーバもクライアントもCP932固定なのでしょうか?)

根本的にはシステム構築する上で『極力文字化けに遭遇したくない』思い出このような質問をさせていただきました。
『文字化け』について注意点などありましたら合わせてコメントいただければ助かります。
以上よろしくお願いします。

SQL Server超初心者です。(Oracleについては約1年ちょっとの経験はあります)どうぞよろしくお願いします。
今回SQL Server2005 を使って簡単なシステムを構築する事になりました。
SQL Serverが扱う文字コートについて教えてください。
Oracleを使っていた時の経験としてDB内部のキャラクターセットと
クライアントで使う文字セット(NLS_LANG)を意識しておかないと、いろんな「文字化け」問題に遭遇した時に対応できませんでした。
きっとSQL Serverにおいても同じような事ではないかと思いここに質問...続きを読む

Aベストアンサー

Windowsのロケールの設定を日本語にした状態でSQLServerをインストールした場合、cp932がデフォルトの照合順序になります。照合順序については参考URLをご覧下さい。

SQLServerではわかりませんが、PostgresではJDBCドライバ部分で変換していたように記憶しています。ODBCドライバではAutoTranslateという機能があります。

このため、ODBC接続で何も考えずにvarcharを使用するとcp932になります。

参考URL:http://www.microsoft.com/japan/msdn/sqlserver/sql2005/bb330962.aspx

QUTF8のテーブルをODBCドライバ経由のMS Accessから開くと日本語が文字化けする

IIS5.1
MySQL 5.0.24a
PHP 5.2.2
phpMyAdmin 3.0.0

文字コードを全てUTF8に統一したよる簡単な会員管理DBの作り方を勉強しています。

このページを参考に、http://www.tryhp.net/ODBCMySQL.htm
ODBCドライバ(mysql-connector-odbc-3.51.27-win32.msi)をインストールし、
MS Access 2003で開いたところ、テーブルへのリンクはうまくいくのですが
日本語部分が文字化けしてしまいます。

テーブルをExcelに落としてリンクさせれば化けないのですけど、何か設定ミスを
してますでしょうか。

コントロールパネル→管理ツール→データソース(ODBC)→システムDSNタブ
→構成ボタン→Connect Optionsタブ→Chatacter Setは、UTF8にしてあります。

Aベストアンサー

Initial Statement に「set names cp932」をセットするとどうなりますか。

QPHPからMSSQLへの接続結果の文字化け

PHPからMicrosoft SQLserverのデータベースへ接続を行い、データベースの内容をブラウザへ表示したいのですが、日本語が文字化けして困っております。

導入するまでの手順を書きます。

参考にしたページ
http://chorusde.hatenablog.jp/entry/20120621/1340300814

(1)マイクロソフトのホームページより「SQL Server Driver for PHP」をダウンロード、解凍。

(2)自分のPHPバージョンを確認。

 Apache/2.4.4
  PHP/5.4.19
  MSVC9
  Thread Safety/enabled

 上記の環境からphp_pdo_sqlsrv_54_ts.dllとphp_sqlsrv_54_ts.dllを使用することを決定。

(3)C:\xampp\php\extの下に(1)で解凍したフォルダ内にあるphp_pdo_sqlsrv_54_ts.dllとphp_sqlsrv_54_ts.dllをコピー。

(4)C:\xampp\php\php.iniを開き、「extension=」と書いている951行あたりに
  「extension=php_pdo_sqlsrv_54_ts.dll」
  「extension=php_sqlsrv_54_ts.dll」
 を追加

  「mssql.secure_connection = OFF」を「ON」に修正

(5)XAMPPコントロール画面でApacheとMySQLを再起動。



その後、以下のコードで実行したところ日本語が文字化けしました。
以下のコードはこのページのサンプルコードをそのままコピペし少し修正したものです。
http://keicode.com/cgi/how-to-connect-to-mssql.php

<?php

$serverName = 'SQLEXPRESS';
$connectionInfo = array(
'UID' => 'username',
'PWD' => 'password',
'Database' => 'shop'
);

$conn = sqlsrv_connect( $serverName, $connectionInfo );

if( $conn === false ){
echo "Cound not connect.\n";
die( print_r( sqlsrv_errors(), true));
}

$tsql ="SELECT * from food";

$stmt = sqlsrv_query( $conn, $tsql );

if( !$stmt ) {
die( print_r( sqlsrv_errors(), true));
}

while( $row = sqlsrv_fetch_array( $stmt, SQLSRV_FETCH_NUMERIC)) {
print_r($row);
}

sqlsrv_free_stmt($stmt);
sqlsrv_close($conn);
?>

このソースを実行しますと日本語が文字化けしてしまいます。(データを英語表記にすれば問題なく表示できます)
文字化けせずにブラウザに結果を表示するためにはどのようにすればよいでしょうか?

またSQL文の「"SELECT * from food"」の"food"の部分(テーブル名)を「食品」と日本語名に変更するとsql文が実行できなくなりエラーを起こします。
おそらく文字化けしてSQL文を認識してしまうため「そんなテーブル名はありませんよ」と怒られてしまうのだと思います。

初心者で凝縮ですが、どなたかアドバイスをお願いいたします。

PHPからMicrosoft SQLserverのデータベースへ接続を行い、データベースの内容をブラウザへ表示したいのですが、日本語が文字化けして困っております。

導入するまでの手順を書きます。

参考にしたページ
http://chorusde.hatenablog.jp/entry/20120621/1340300814

(1)マイクロソフトのホームページより「SQL Server Driver for PHP」をダウンロード、解凍。

(2)自分のPHPバージョンを確認。

 Apache/2.4.4
  PHP/5.4.19
  MSVC9
  Thread Safety/enabled

 上記の環境からphp_pdo_sqlsrv_54_ts.dl...続きを読む

Aベストアンサー

>> 上記の環境からphp_pdo_sqlsrv_54_ts.dllとphp_sqlsrv_54_ts.dllを使用することを決定。

とありますが、実際にご利用になられているのは

PHP 用 Microsoft SQL Server ドライバ
http://php.net/manual/ja/book.sqlsrv.php

のほうみたいですね。こちらは日本語版マニュアルが存在しないほどマイナーな関数で、わざわざこれを利用するメリットは全くないと思います。せっかくなので

PHP Data Objects
http://www.php.net/manual/ja/book.pdo.php
Microsoft SQL Server 関数 (PDO_SQLSRV)
http://www.php.net/manual/ja/ref.pdo-sqlsrv.php

こっちで書きませんか?下の記事はMySQL向けに書いていますが、ある程度は参考になると思います。

PHPでデータベースに接続するときのまとめ
http://qiita.com/mpyw/items/b00b72c5c95aac573b71

DSNに関しては下記を参照してください。

PDO_SQLSRV DSN
http://php.net/manual/ja/ref.pdo-sqlsrv.connection.php

>> 上記の環境からphp_pdo_sqlsrv_54_ts.dllとphp_sqlsrv_54_ts.dllを使用することを決定。

とありますが、実際にご利用になられているのは

PHP 用 Microsoft SQL Server ドライバ
http://php.net/manual/ja/book.sqlsrv.php

のほうみたいですね。こちらは日本語版マニュアルが存在しないほどマイナーな関数で、わざわざこれを利用するメリットは全くないと思います。せっかくなので

PHP Data Objects
http://www.php.net/manual/ja/book.pdo.php
Microsoft SQL Server 関数 (PDO_SQLSRV)
http://www.php.net/...続きを読む

Qデータソース名および指定された既定のドライバが見つかりません。

データソース名および指定された既定のドライバが見つかりません。
オラクルに接続したのですが、上記のエラーが出て接続出来ません。
どなたか力を貸してください。

<環境>
WinXP
VS2005 Ver8.0.50727.42
Windowsアプリケーション
VB言語でオラクルに接続したいと思っています。

こちら(http://support.microsoft.com/kb/310985/ja)を参考に
オラクルに接続しようとしています。

Dim cn As OdbcConnection
cn = New OdbcConnection("Driver = {Microsoft ODBC for Oracle};" & _
"Data Source=ORA_TEST;uid=UID_TEST;pwd=PWD_TEST")

Try
cn.Open()
MsgBox("Connected")
Catch ex As Exception
MsgBox("NG")
Debug.Print(ex.Message, "Error") ←(A)
Finally
cn.Close()
End Try

(A)で「ERROR [IM002] [Microsoft][ODBC Driver Manager] データ ソース名および指定された既定のドライバが見つかりません。」

のメッセージが出ます。
VB2005の「ツール」-「サーバの接続」では接続確認が取れているのですが、
コードで書くとエラーになってします。

何か書き忘れているのでしょうか。。。
すみませんがよろしくお願いいたします。

データソース名および指定された既定のドライバが見つかりません。
オラクルに接続したのですが、上記のエラーが出て接続出来ません。
どなたか力を貸してください。

<環境>
WinXP
VS2005 Ver8.0.50727.42
Windowsアプリケーション
VB言語でオラクルに接続したいと思っています。

こちら(http://support.microsoft.com/kb/310985/ja)を参考に
オラクルに接続しようとしています。

Dim cn As OdbcConnection
cn = New OdbcConnection("Driver = {Microsoft ODBC for Oracle};" & _
...続きを読む

Aベストアンサー

>cn = New OdbcConnection("Driver = {Microsoft ODBC for Oracle};" & _
>"Data Source=ORA_TEST;uid=UID_TEST;pwd=PWD_TEST")

自分の環境に合わせないとね?????

これの意味はインポートしているんですよね? スクリプトはVBSの事ですかね。VBA? VBですよね?

Imports System.Data
Imports Microsoft.Data.ODBC


それと見るHPがちょこと違う。
http://msdn.microsoft.com/ja-jp/library/system.data.oracleclient.oraclelob.aspx

Q文字化けが解決できません。お願いします

文字化けが解決できません

使用データベースはSQLServer2008です
対象カラムはcharです
データベースの照合順序はJapanese_CI_ASです

ブラウザのエンコードをUTF-8にするとprint_r($row);の部分は文字化けせずに表示
されますprint("砂糖");は文字化けします
ブラウザの標準文字コード??SJISだとprint_r($row);文字化けします
print("砂糖");は文字化けしません

ということはSQLServerのデータの文字コードがUTF-8ということなのでしょうか
SJISだと思うのですが。
そこで、SQLServerがUTF-8だと仮定してprint_r(mb_convert_encoding($row, "SJIS","UTF-8"));
というプログラムを書いたのですが結果は同じでブラウザのエンコードをSJISにすると
文字化けしていまいます


どうすればブラウザのエンコードがSJISで文字化けしないようになるのでしょうか
教えてください。
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=Shift-SJIS">
<title>test</title>
</head>
<body>

<?php
try{

$dsn ='sqlsrv:server=.\sqlexpress;database=sample';
$dbname = "sample";
$user = "sa";
$password ="manager";
//$dbh = new PDO("mssql:host=.\\SQLEXPRESS;dbname=sample",$user,$password);
$dbh = new PDO($dsn,$user,$password);


$stmt = $dbh->prepare("select * from shohin");
$stmt->execute();
while($row = $stmt->fetch()){
//print_r($row);
//print_r(mb_convert_encoding($row, "SJIS","UTF-8"));
print_r($row);
}
unset($dbh);
unset($stmt);
// foreach($dbh -> query($sql) as $row)
// print($row["id"]);
// print($row["name"]);
// echo "接続できました";
// }
// $dbh = null;

print("砂糖");
}catch(PDOException $e){
print("Failed to get DB handle:aaakkka".$e->getMessage()."\n");
phpinfo();
exit();
}

?>
</body>
</html>

文字化けが解決できません

使用データベースはSQLServer2008です
対象カラムはcharです
データベースの照合順序はJapanese_CI_ASです

ブラウザのエンコードをUTF-8にするとprint_r($row);の部分は文字化けせずに表示
されますprint("砂糖");は文字化けします
ブラウザの標準文字コード??SJISだとprint_r($row);文字化けします
print("砂糖");は文字化けしません

ということはSQLServerのデータの文字コードがUTF-8ということなのでしょうか
SJISだと思うのですが。
そこで、SQLServerがUTF-8だと仮定してprin...続きを読む

Aベストアンサー

#2です。しょうこりもなくまたやってきました。おそらくこれが最後ですからもうちょっと付き合ってください。

> mb_detect_encoding($row) の実行結果は何も表示されませんでした

何も表示されない == 何も返ってこないじゃないですね。何が返ってるか確認しましょう。おそらく False なんだろうけど、その場合はエンコーディングが検出できなかったということらしい(マニュアル参照)。空文字ってあるのかな?

とここまで書いて気づいた。$row って文字列じゃないじゃん(ふつうは名前で気づく。いかに適当に読んでるかバレる)。フィールド数がいくつかわからんけど、$row[0] とかやらないと値が取れないよね?

QMS SQLServer のSQLで文字列の前にN:

MS SQLServer のSQLで文字列の前にN: をつけることをよく見かけますが、
「N:」とはいったいどんな意味なのでしょうか?
教えて下さい。

Aベストアンサー

T-SQLでの話かと思いますが・・・。NCHAR/NVARCHAR型という、型(タイプ)があるのですが、これらは、夫々、national character/national character varying(SQL-92での表記法)の意味を持っています。夫々、固定長文字列(Unicode)/可変長文字列(Unicode)です。
NVARCHARはSQL-Server2000では4000文字まで、VARCHAR2は8000文字まで格納可です。(つまり、1/2になるということです)

さて、N'***' とT-SQL内で書くと、''内の文字をUnicodeで表現されたものとして処理する、という意味になります。Nは、nationalの略です。ですから、日本語を使おうとするとNは必須になる、という事ですね。

こんな感じでつかいます。#N'Unicode 文字列'

QMAX値を条件にデータを取得するには?

SQL文で困っています。
ご教授下さい。


下記のようなデータがあった場合、それぞれの区分毎に
年月が最大(最新)のデータを取得したいです。
(実際には1レコードにその他項目があり、それらも取得します。)
<検索対象データ>
区分 年月   金額
-----------------------------
A   200412  600
A   200503  560
B   200311  600
B   200508  1000
B   200504  560
C   200508  400
C   200301  1100


<取得したいデータ>

区分 年月   金額
-----------------------------
A   200503  560
B   200508  1000
C   200508  400

よろしくお願いします。

Aベストアンサー

テーブル名をXXXとすると次のようなSQLでよいと思います。(最善の方法かどうかは自信がないですが)

select B.* from (select 区分, max(年月) as 年月 from XXX group by 区分) As A
inner join XXX as B on A.区分 = B.区分 and A.年月 = B.年月
order by B.区分

Qpingでポートの指定

pingでIPアドレスを指定して、通信できるかどうかというのは
よく使いますが、pingでポートを指定して応答するかどうかは調べられるのでしょうか?

よろしくお願いします

Aベストアンサー

pingを含むICMPというプロトコルは、OSIの7レイヤで言うところのL2(同一セグメント内通信)とL3(IPルーティングされた通信)の両方にまたがる、ちょっと珍しいプロトコルです。

IPアドレスは指定できますが、別サブネットに属するIPアドレスに到達できればL3通信、できなければゲートウェイと呼ばれる同一サブネットに属する中継装置からの回答を得るという点でL2(MAC通信ではなく、同一セグメント内通信という意味)通信です。

ポート番号はL4で使用されるアドレスですから、L4機能の疎通確認はping(を含むICMP)ではできません。

FTPの疎通確認であれば、クライアントからサーバに対するTCP/21通信(FTP-CMD)が可能であること(サーバからクライアントへのTCP/21からの応答を含む)+サーバからクライアントに対するTCP/20通信(FTP-DATA)が可能であること(クライアントからサーバへのTCP/21からの応答を含む)が必要でしょう。

監視ソフトによるものであれば、
・クライアントからサーバへのログイン(TCP/21)
・クライアントからサーバへのlsの結果(TCP/20)
で確認すればよいでしょう。

pingを含むICMPというプロトコルは、OSIの7レイヤで言うところのL2(同一セグメント内通信)とL3(IPルーティングされた通信)の両方にまたがる、ちょっと珍しいプロトコルです。

IPアドレスは指定できますが、別サブネットに属するIPアドレスに到達できればL3通信、できなければゲートウェイと呼ばれる同一サブネットに属する中継装置からの回答を得るという点でL2(MAC通信ではなく、同一セグメント内通信という意味)通信です。

ポート番号はL4で使用されるアドレスですから、L4機能の疎通確認はping(を含む...続きを読む

Q配列をPOSTで受けとる

タイトルのまんまですが
配列をformで送って
それをPOSTで受け取りたいのですが
うまくいきません

具体的に言うと
<?php
print"<form method=POST action=action.php>";

for($i=0; $i<$n; $i++){
   print"<input type=text name=foo[$i]>";
}
print"<input type=hidden name=n value=$n>";
print"<input type=submit value=go>";
print"<form>";
?>


///////////以下action.php//////////////////
<?php
$n = $_POST["n"];
for($j=0; $j<$n; $j++){
   $foo[$j] = $_POST["foo[$j]"];
   print"$foo[$j]";
}
?>


こんな感じのことがしたいのですが
うまくいきません
どうもPOSTされてないみたいでfoo[$j]はnullです
凡ミスな気がしなくもないんですが...プログラム初心者なんで↓↓
教えてください
よろしくお願いします

タイトルのまんまですが
配列をformで送って
それをPOSTで受け取りたいのですが
うまくいきません

具体的に言うと
<?php
print"<form method=POST action=action.php>";

for($i=0; $i<$n; $i++){
   print"<input type=text name=foo[$i]>";
}
print"<input type=hidden name=n value=$n>";
print"<input type=submit value=go>";
print"<form>";
?>


///////////以下action.php//////////////////
<?php
$n = $_POST["n"];
for($j=0; $j<$n; $j++){
   $foo[$j] = $_POST["foo[$j...続きを読む

Aベストアンサー

atsuGTさんこんにちは。


受け取り側は

$foo = $_POST["foo"];

とするだけで$fooに送信された配列が格納されます。


$_POST["foo[添え字]"] ではなく、
$_POST["foo"][添え字] となります。

QSQLServerへの出し入れで文字化け

WIN2000+IIS5+SQLServer2000で開発しています。
レンタルサーバーでやってるのですが、
ASPからSPを呼び出して挿入するとDBに文字化けして入力されてしまいます。(varcharの項目です)
これがASPからSQL文を丸投げすると文字化けしません。

が、文字化けしてないレコードをASPから参照するとまた文字化けしてしまいます。

が、自前の環境(WIN2000+SQLServer7)でテストするといずれも文字化けしません。

レンタルサーバーが海外のもの、というのが問題なのかもしれませんが、文字コード等には
何分詳しくないもので、解決案等ございましたらお教え願います。
キャンセル可能期間もせまっており、微妙に焦り気味です(泣)。
宜しくお願いします。

Aベストアンサー

"?A?・?A"と言う結果を見る限りどうもビット落ちしているみたいですね
もしかしてレンタルサーバ環境は英語版とかですか?
であればSQLServerのロケール設定を日本に設定する事で回避できるかもしれません。が、無理っぽいですよね(^^;

他の方法としてはストアドプロシージャに文字列を突っ込む前にbase64エンコード等で8bit目を使用しないデータに変換して格納し、出力時にデコードすると言う方法もあります。
またMicrosoft製品なので多分Unicode用のデータ型があるでしょうから、文字列はすべてUnicodeとして処理するようにするのも手だと思います(これが一番オススメ。後で他カ国語を扱ったりするのも楽ですから)。


このQ&Aを見た人がよく見るQ&A

人気Q&Aランキング

おすすめ情報