• ベストアンサー
  • 困ってます

PDOでMYSQL

  • 質問No.7282020
  • 閲覧数447
  • ありがとう数1
  • 気になる数0
  • 回答数3
  • コメント数0

お礼率 33% (214/636)

WHERE区の値をbindValueしているのですが、結果が取得できません。
ちなみにエラーになるわけでも文字化けを起こすわけでもありません。

$name = '太郎';

$sql = 'SELECT * FROM table WHERE name = :name;
$sth = $dbh->prepare($sql);
$sth->bindValue(':name', $name, PDO::PARAM_STR);
$sth->execute();
$result = $sth->fetchAll();

print_r($result);

いろいろ試してたところ、日本語だと結果を取得しないようで
SQLデータの「太郎」となっていた箇所を「tarou」に変更し
変数の部分だけ変更したところ結果を取得できました。

$name = 'tarou;

基本の構文は合っていると思うのですが単純に日本語の指定が
できないのでしょうか?

PHPとMYSQLは全てUTF-8でバージョンは下記の通りです。

PHP:5.3.8
MYSQL:Client API version mysqlnd 5.0.8-dev - 20102224 - $Revision: 310735 $
PDO:
PDO drivers mysql, odbc, sqlite, sqlite2
Client API version mysqlnd 5.0.8-dev - 20102224 - $Revision: 310735 $

質問者が選んだベストアンサー

  • 回答No.2
  • ベストアンサー

ベストアンサー率 47% (436/922)

こんばんは。

>bindValueだと型を指定できるので
確かにそうですな・・・。
$sth->execute(array($name));
この書き方は、全部STRINGなんでね。

まぁ、MySQLなので、気にしてないです・・・はい。

その他の回答 (全2件)

  • 回答No.3

ベストアンサー率 74% (169/227)

データ型が問題になるのは、paging のために limit 句にplaceholder を置くときと、null値をnullとして入れなければならないときでしょう。それ以外は、MySQL側で適宜型変換してくれるので文字列としていれても問題ないですけど。
「 limit 句用と決まってるなら、phpで intvalue() してからSQL文に入れれば、placeholderにしなくてもいいだろう」という考え方もあるけど。。。
  • 回答No.1

ベストアンサー率 47% (436/922)

こんばんは。

>$sql = 'SELECT * FROM table WHERE name = :name;
→$sql = "SELECT * FROM table WHERE name = '?'";
$sth->execute(array($name));

じゃダメなんかな?
私は普通に取得できてるので・・・。
後は文字コードが臭い・・・事ないわなぁ・・・。
お礼コメント
dcx147

お礼率 33% (214/636)

お返事ありがとうございます。
全く原因がわからず半分やけでxamppを再インストールしたところ
普通に結果を取得できました^^;

確かに方法としては「$sth->execute(array($name));」もありですよね!
自分で書いておきながらですが、executeの前にbindValueするメリットって
あるんでしょうか?

bindValueだと型を指定できるので、より厳密になるとかしか思いつきません・・・
投稿日時:2012/02/03 23:42
結果を報告する
このQ&Aにはまだコメントがありません。
あなたの思ったこと、知っていることをここにコメントしてみましょう。
AIエージェント「あい」

こんにちは。AIエージェントの「あい」です。
あなたの悩みに、OKWAVE 3,600万件のQ&Aを分析して最適な回答をご提案します。

関連するQ&A

その他の関連するQ&Aをキーワードで探す

ピックアップ

ページ先頭へ