###前提、問題点
GCP(Compute Engine + SQL)でWEBサイトを構築しているのですが、
Cloud SQLインスタンスを別のものに移行すると一部のプリペアードステートメントを利用しているクエリが実行できなくなってしまいました。
原因を特定したいのですが、まったく掴めないためお力をお借りしたいです。
###問題勃発までの経緯
新しいSQLインスタンスに変更したいと考え、既存のインスタンスから必要なデータベース情報をエクスポートし、新なSQLインスタンスにインポートさせました。
データの移行は正常に行われたように見えましたが、一部のWEBページ以下のエラー文が表示されました。
PHP
1Fatal error: Call to a member function bind_param() on boolean
このエラーが発生している箇所のクエリは以下の通りです。
PHP
1$query = "SELECT test_item.id, GROUP_CONCAT(test_tag.id SEPARATOR ','), GROUP_CONCAT(test_tag.name SEPARATOR ',') FROM test_item LEFT OUTER JOIN test_tag ON test_item.id = test_tag.itemnum WHERE test_item.id = ? LIMIT 1"; 2$stmt = $mysqli->prepare($query); 3$stmt->bind_param('s', $company); 4$company = 4; 5$stmt->execute(); 6$stmt->bind_result($t1, $t2, $t3); 7while($stmt->fetch()){ 8}
テーブル構造は以下の通りです。
MySQL
1MySQL [database]> desc test_item; 2+-------+--------------+------+-----+---------+----------------+ 3| Field | Type | Null | Key | Default | Extra | 4+-------+--------------+------+-----+---------+----------------+ 5| id | int(11) | NO | PRI | NULL | auto_increment | 6| name | varchar(255) | YES | | NULL | | 7+-------+--------------+------+-----+---------+----------------+ 82 rows in set (0.01 sec) 9 10MySQL [atabase]> desc test_tag; 11+---------+--------------+------+-----+---------+----------------+ 12| Field | Type | Null | Key | Default | Extra | 13+---------+--------------+------+-----+---------+----------------+ 14| id | int(11) | NO | PRI | NULL | auto_increment | 15| name | varchar(255) | YES | | NULL | | 16| itemnum | int(11) | YES | | NULL | | 17+---------+--------------+------+-----+---------+----------------+ 183 rows in set (0.00 sec)
###不明点①
プリペアードステートメントを利用しているクエリのすべてが同じ状況ではありません。
むしろごく一部のクエリのみです。
PHP
1// エラーになるクエリ 2$query = "SELECT test_item.id, GROUP_CONCAT(test_tag.id SEPARATOR ','), GROUP_CONCAT(test_tag.name SEPARATOR ',') FROM test_item LEFT OUTER JOIN test_tag ON test_item.id = test_tag.itemnum WHERE test_item.id = ? LIMIT 1"; 3 4// エラーがでないクエリ 5$query = "SELECT test_item.id FROM test_item LEFT OUTER JOIN test_tag ON test_item.id = test_tag.itemnum WHERE test_item.id = ? LIMIT 1"; 6$query = "SELECT GROUP_CONCAT(test_tag.id SEPARATOR ','), GROUP_CONCAT(test_tag.name SEPARATOR ',') FROM test_item LEFT OUTER JOIN test_tag ON test_item.id = test_tag.itemnum WHERE test_item.id = ? LIMIT 1";
###不明点②
エクスポート元のSQLインスタンスに戻すとエラーが発生しません。
問題なくすべてのページでプリぺアードステートメントを実行できます。
つまり、エクスポート元SQLインスタンスとインポート先SQLインスタンスのデータベースで相違があるということになると思います。
###不明点の検証
データベース構造を新旧インスタンス上で比較するとRow_formatがCompactとDynamicの違いはありましたがその他は見つけられませんでした。
テーブル構造も同じく比較しましたがまったく同じでした。
PHP上のクエリも構文チェックを何度もしましたが問題が見当たりませんでした。これは不明点①からもわかると思います。
問題原因を探ろうと手は尽くしてみたのですが自分の力だけでは解決できませんでした。

回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2016/09/04 02:37
2016/09/04 03:04
2016/09/04 03:20
2016/09/04 03:47