質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
87.20%
MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

mysqli

MySQLiはPHP5より導入されているデータベース用のドライバです。MySQL 4.1.3以降の新しい機能の利点をまとめています。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

解決済

データベースを移行するとプリペアードステートメントを利用できなくなってしまいました

RyuichiTani
RyuichiTani

総合スコア0

MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

mysqli

MySQLiはPHP5より導入されているデータベース用のドライバです。MySQL 4.1.3以降の新しい機能の利点をまとめています。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

1回答

0評価

0クリップ

2442閲覧

投稿2016/09/03 19:33

###前提、問題点
GCP(Compute Engine + SQL)でWEBサイトを構築しているのですが、
Cloud SQLインスタンスを別のものに移行すると一部のプリペアードステートメントを利用しているクエリが実行できなくなってしまいました。

原因を特定したいのですが、まったく掴めないためお力をお借りしたいです。

###問題勃発までの経緯
新しいSQLインスタンスに変更したいと考え、既存のインスタンスから必要なデータベース情報をエクスポートし、新なSQLインスタンスにインポートさせました。
データの移行は正常に行われたように見えましたが、一部のWEBページ以下のエラー文が表示されました。

PHP

Fatal error: Call to a member function bind_param\(\) on boolean

このエラーが発生している箇所のクエリは以下の通りです。

PHP

\$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"; \$stmt = \$mysqli->prepare\(\$query\); \$stmt->bind_param\('s', \$company\); \$company = 4; \$stmt->execute\(\); \$stmt->bind_result\(\$t1, \$t2, \$t3\); while\(\$stmt->fetch\(\)\){ }

テーブル構造は以下の通りです。

MySQL

MySQL \[database\]> desc test_item; \+-------\+--------------\+------\+-----\+---------\+----------------\+ | Field | Type | Null | Key | Default | Extra | \+-------\+--------------\+------\+-----\+---------\+----------------\+ | id | int\(11\) | NO | PRI | NULL | auto_increment | | name | varchar\(255\) | YES | | NULL | | \+-------\+--------------\+------\+-----\+---------\+----------------\+ 2 rows in set \(0\.01 sec\) MySQL \[atabase\]> desc test_tag; \+---------\+--------------\+------\+-----\+---------\+----------------\+ | Field | Type | Null | Key | Default | Extra | \+---------\+--------------\+------\+-----\+---------\+----------------\+ | id | int\(11\) | NO | PRI | NULL | auto_increment | | name | varchar\(255\) | YES | | NULL | | | itemnum | int\(11\) | YES | | NULL | | \+---------\+--------------\+------\+-----\+---------\+----------------\+ 3 rows in set \(0\.00 sec\)

###不明点①
プリペアードステートメントを利用しているクエリのすべてが同じ状況ではありません。
むしろごく一部のクエリのみです。

PHP

// エラーになるクエリ \$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"; // エラーがでないクエリ \$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"; \$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上のクエリも構文チェックを何度もしましたが問題が見当たりませんでした。これは不明点①からもわかると思います。
問題原因を探ろうと手は尽くしてみたのですが自分の力だけでは解決できませんでした。

良い質問の評価を上げる

以下のような質問は評価を上げましょう

  • 質問内容が明確
  • 自分も答えを知りたい
  • 質問者以外のユーザにも役立つ

評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

気になる質問をクリップする

クリップした質問は、後からいつでもマイページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

  • プログラミングに関係のない質問
  • やってほしいことだけを記載した丸投げの質問
  • 問題・課題が含まれていない質問
  • 意図的に内容が抹消された質問
  • 過去に投稿した質問と同じ内容の質問
  • 広告と受け取られるような投稿

評価を下げると、トップページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

まだ回答がついていません

会員登録して回答してみよう

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
87.20%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問

同じタグがついた質問を見る

MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

mysqli

MySQLiはPHP5より導入されているデータベース用のドライバです。MySQL 4.1.3以降の新しい機能の利点をまとめています。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。