回答編集履歴

1 回答を追記

KiyoshiMotoki

KiyoshiMotoki score 4687

2016/09/04 12:45  投稿

```php
$stmt = $mysqli->prepare($query);
```
の直後に以下の1行を追加してみてください。
```php
echo $mysqli->error;
```
おそらく、
```
Mixing of GROUP columns (MIN(),MAX(),COUNT(),...) with no GROUP columns is illegal if there is no GROUP BY clause
```
と、表示されるはずです。
これは、MySQL のSQLモードに ONLY_FULL_GROUP_BY が含まれていて、かつ SELECT句に集約関数と非集約カラムが混在しているときに発生するエラーです。
[https://dev.mysql.com/doc/refman/5.6/ja/sql-mode.html](https://dev.mysql.com/doc/refman/5.6/ja/sql-mode.html)
> ONLY_FULL_GROUP_BY
(中略)
クエリーに集約関数があって GROUP BY 句がない場合、ONLY_FULL_GROUP_BY が有効なときに、クエリーは選択リストまたは ORDER BY リストに非集約カラムを含めることができません。
実際、エラーになるクエリは SELECT 句に集約関数 (GROUP_CONCAT) と非集約カラム (test_item.id) が混在しており、GROUP BY 句がありません。
---
エクスポート元の MySQL とインポート先の MySQL のバージョンは、それぞれ
- エクスポート元 : 5.6 か、それ以前
- インポート先 : 5.7
になっていませんか?
MySQL 5.6 とそれ以前のバージョンの SQLモードは、デフォルトで ONLY_FULL_GROUP_BY を含んでおらず、
MySQL 5.7 では、デフォルトでそれを含んでいます。
[https://dev.mysql.com/doc/refman/5.6/ja/faqs-sql-modes.html#idm140652876272144](https://dev.mysql.com/doc/refman/5.6/ja/faqs-sql-modes.html#idm140652876272144)
> MySQL 5.6.6 の時点では、デフォルトの SQL モードは NO_ENGINE_SUBSTITUTION です。5.6.6 より前は、デフォルトのモードは空でした (どのモードも有効にされません)。
[https://dev.mysql.com/doc/refman/5.7/en/faqs-sql-modes.html#faq-mysql-what-default-mode](https://dev.mysql.com/doc/refman/5.7/en/faqs-sql-modes.html#faq-mysql-what-default-mode)
> The default SQL mode in MySQL 5.7 includes these modes: **ONLY_FULL_GROUP_BY**, STRICT_TRANS_TABLES, NO_ZERO_IN_DATE, NO_ZERO_DATE, ERROR_FOR_DIVISION_BY_ZERO, NO_AUTO_CREATE_USER, and NO_ENGINE_SUBSTITUTION.
---
もし、MySQL のバージョンが上述の通りであれば、インポート先の MySQL の SQLモードをエクスポート元のそれに合わせてやるのがよいでしょう。
Cloud SQL では、SQLモードの確認および変更は、いずれもコンソール画面から実行できるようです。
以下のリンクの
"Setting a MySQL flag"
および
"Viewing current values of MySQL flags"
という項を参照してください。
[https://cloud.google.com/sql/docs/mysql-flags](https://cloud.google.com/sql/docs/mysql-flags)
SQLモードは、`sql_mode`という名称のフラグのようです。
SQLモードは、`sql_mode`という名称のフラグのようです。
# 追記
> $stmt = $mysqli->prepare($query);
> の直後に
> echo $mysqli->error;
> を設置しても何も表示されませんでした。
では、 echo $mysqli->error; の代わりに以下2行を追加すると、どのように表示されるか確認していただけますか?
```php
var_dump($mysqli);
exit(1);
```
`$stmt->bind_param('s', $company);`が実行された行で
> Fatal error: Call to a member function bind_param() on boolean
と表示されるのは、`$mysqli->prepare($query)` の実行に失敗し、変数 $stmt に boolean型の FALSE が代入されているからです。
[http://php.net/manual/ja/mysqli.prepare.php](http://php.net/manual/ja/mysqli.prepare.php)
> 返り値
> mysqli_prepare() はステートメントオブジェクトを返します。 エラー時には FALSE を返します。
その場合、`$mysqli->error` というプロパティに何らかのエラーメッセージが格納されているはずです。
---
> MySQL5.6で新たにSQLインスタンスを作成してみましたが、結果は変わりませんでした。。。
もしかすると ONLY_FULL_GROUP_BY とは別の問題の可能性もありますが、
いずれにせよ、エラーメッセージを確認しないことには調査を進めることができません。
頑張ってください。

思考するエンジニアのためのQ&Aサイト「teratail」について詳しく知る