見出し

[SQL×php] HY000の2031が発生するので調べたら->query()は即実行だった

備忘録として。

追記17/6/6

このエラーはさまざまな状況で発生します。この記事はあくまで一例です。
どの状況でも基本的な部分が間違っていることが多いようなので、もう一度書いたコードを見直すと間違いが発見できるかもしれません。

書いていたコード

1
2
3
4
5
6
7
<?php
$q = "%" . date("Y/m/d",strtotime("-1 day")) . "%00%00%";
$stmt = $pdo->query('SELECT * FROM tableName WHERE time_str LIKE :likes ORDER BY time ASC');
$stmt->bindParam(":likes" , $q);

$stmt->execute();
var_dump($stmt->fetch());

こんなコードを書いていたら、「‘PDOException’ with message ‘SQLSTATE[HY000]: General error: 2031 ‘」が消えないので調べていたら、このエラーが色々な状況で発生するらしく見当違いな解決方法しか見つかりませんでした。

phpのマニュアルをもう一度読んでみたらquery()は渡した瞬間に実行するのでその後にbindParam()しようとexecute()しようと無駄らしい…。
よく読まないと駄目ですね。

正しいコード

正しくはこちら

1
2
3
4
5
6
7
<?php
$q = "%" . date("Y/m/d",strtotime("-1 day")) . "%00%00%";
$stmt = $pdo->prepare('SELECT * FROM tableName WHERE time_str LIKE :likes ORDER BY time ASC');
$stmt->bindParam(":likes" , $q);

$stmt->execute();
var_dump($stmt->fetch());

初歩的なミスでした。めでたしめでたし。