PHPからMySQLにSQLで問い合わせて受け取ったデータ内容は、すべて文字列として返されるのでしょうか?


例えば、MySQLのテーブルでIDのカラムをINTに指定した場合でも、PHP側で受け取った時は、文字列して返されてしまいます。

PHP側で対策すれば済む話ですが、もしINTでそのまま渡すやり方などありましたら教えて下さい。

回答の条件
  • 1人5回まで
  • 13歳以上
  • 登録:2011/06/02 10:48:47
  • 終了:2011/06/02 19:58:14

ベストアンサー

id:windofjuly No.3

うぃんど回答回数2625ベストアンサー獲得回数11492011/06/02 15:09:28

ポイント100pt

>INTでそのまま渡すやり方

 

mysql_fetch_field などで確認してみれば判りますが

結果セットのフィールドの型はINT型などとして認識することが出来ます

しかしながら、データベース側からの吐き出しが

(各種言語や環境での利用を考慮してか)テキストとなっていますので

データを受け取った変数は文字列型としてひとまず認識されます

 

文字列型として認識されても

計算式に組み込んでしまえば数値型として取り扱えてしまうので

とりあえず問題になることはないはずです

http://www.php.net/manual/ja/language.types.type-juggling.php

PHP は、変数定義時に明示的な型定義を必要と(または、サポート) しません。ある変数の型は、その変数が使用される文により定義されます。 これは、ある文字列を変数 var に代入した場合には、 var は文字列になることを意味しています。 ある整数値を var に代入した場合には、 その変数は整数になります。

 

どのような理由でINT型にしておきたいのかはわかりませんが

どうしても変数をINT型としておきたい場合は(面倒ですが)明示的にキャストしてやると良いでしょう

<?php
// MySQL
$con = mysql_connect(省略);
mysql_select_db(省略);
//
echo 'INTとTEXTフィールドを同時に求めた場合&lt;br />';
$res = mysql_query('SELECT id,title FROM j1');
echo mysql_fetch_field($res,0)->type . '<br />';
echo gettype(mysql_result($res,0,0)) . '<br />';
$a = mysql_fetch_row($res, 0); echo gettype($a[0]) . '<br />';
$a = (INT) mysql_result($res,0,0); echo gettype($a) . '<br />';
echo '<br />';
//
echo 'INTフィールドのみ求めた場合<br />';
$res = mysql_query('SELECT id FROM j1');
echo mysql_fetch_field($res,0)->type . '<br />';
echo gettype(mysql_result($res,0,0)) . '<br />';
$a = mysql_fetch_row($res, 0); echo gettype($a[0]) . '<br />';
$a = (INT) mysql_result($res,0,0); echo gettype($a) . '<br />';
echo '<br />';
//
$res = mysql_close($con);
id:xxmasaxx

つまり、データベース側からの出力は文字列型で、あとは受け取ったドライバ側で処理を行う、というわけですね。合点がいきました。

INT型にしたいのは、PHPでMySQLから返ってきた値を if($hoge === 0){}と厳密に比較する時の手間を省きたかったからです。

これからは仰るように明示的にキャストを行って対応したいと思います。回答どうも有り難うございました。

2011/06/02 19:56:15

その他の回答(2件)

id:deflation No.1

deflation回答回数1036ベストアンサー獲得回数1262011/06/02 11:16:24

ポイント100pt

PHPからMySQLにSQLで問い合わせて受け取ったデータ内容は、すべて文字列として返されるのでしょうか?

いいえ、違います。

MySQLのINT型のデータはPHPにintegerとして渡されます。

MySQLのINT型のカラムを $i に代入したとすると、その直後に $i + 1 の計算ができます。


PHPの変数はintegerとstringの区別をせずに扱うことができるので、ご質問のように感じられるのではないでしょうか。

id:xxmasaxx

MySQLから返ってきた値をvar_dump()で確認してみたらstring型だったので、ちょっと気になったので。

回答有り難うございます。参考にさせて頂きます。

2011/06/02 19:46:36
id:tnksaigon No.2

Saigon回答回数1ベストアンサー獲得回数02011/06/02 11:32:41

ポイント100pt

PHPでどのMySQLドライバを使っているかによって挙動が変わるかと思いますが、mysql_connect や PDO の場合はMySQL でintなカラムは integer として取得されるはずです。

id:xxmasaxx

なるほど、ドライバによっても変わるのですね。ちなみに使ってるドライバはmysqliでした。

回答有り難うございます。

2011/06/02 19:47:46
id:windofjuly No.3

うぃんど回答回数2625ベストアンサー獲得回数11492011/06/02 15:09:28ここでベストアンサー

ポイント100pt

>INTでそのまま渡すやり方

 

mysql_fetch_field などで確認してみれば判りますが

結果セットのフィールドの型はINT型などとして認識することが出来ます

しかしながら、データベース側からの吐き出しが

(各種言語や環境での利用を考慮してか)テキストとなっていますので

データを受け取った変数は文字列型としてひとまず認識されます

 

文字列型として認識されても

計算式に組み込んでしまえば数値型として取り扱えてしまうので

とりあえず問題になることはないはずです

http://www.php.net/manual/ja/language.types.type-juggling.php

PHP は、変数定義時に明示的な型定義を必要と(または、サポート) しません。ある変数の型は、その変数が使用される文により定義されます。 これは、ある文字列を変数 var に代入した場合には、 var は文字列になることを意味しています。 ある整数値を var に代入した場合には、 その変数は整数になります。

 

どのような理由でINT型にしておきたいのかはわかりませんが

どうしても変数をINT型としておきたい場合は(面倒ですが)明示的にキャストしてやると良いでしょう

<?php
// MySQL
$con = mysql_connect(省略);
mysql_select_db(省略);
//
echo 'INTとTEXTフィールドを同時に求めた場合&lt;br />';
$res = mysql_query('SELECT id,title FROM j1');
echo mysql_fetch_field($res,0)->type . '<br />';
echo gettype(mysql_result($res,0,0)) . '<br />';
$a = mysql_fetch_row($res, 0); echo gettype($a[0]) . '<br />';
$a = (INT) mysql_result($res,0,0); echo gettype($a) . '<br />';
echo '<br />';
//
echo 'INTフィールドのみ求めた場合<br />';
$res = mysql_query('SELECT id FROM j1');
echo mysql_fetch_field($res,0)->type . '<br />';
echo gettype(mysql_result($res,0,0)) . '<br />';
$a = mysql_fetch_row($res, 0); echo gettype($a[0]) . '<br />';
$a = (INT) mysql_result($res,0,0); echo gettype($a) . '<br />';
echo '<br />';
//
$res = mysql_close($con);
id:xxmasaxx

つまり、データベース側からの出力は文字列型で、あとは受け取ったドライバ側で処理を行う、というわけですね。合点がいきました。

INT型にしたいのは、PHPでMySQLから返ってきた値を if($hoge === 0){}と厳密に比較する時の手間を省きたかったからです。

これからは仰るように明示的にキャストを行って対応したいと思います。回答どうも有り難うございました。

2011/06/02 19:56:15

コメントはまだありません

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません