PHPでデータベースからデータを取得する際に、fetchAll()
を利用して配列を作成してforeach()
で取り出すということを行うことはよくやるかと思います。
SELECT文で一件のデータも取り出せなかった場合は空の配列が戻ってくるのですが、その挙動に少し戸惑ったので覚え書きとして書きたいと思います。
PHPの公式リファレンスにてfetchAll()
の戻り値についての説明は以下の通りです。
##返り値
PDOStatement::fetchAll() は、 結果セットに残っている全ての行を含む配列を返します。 この配列は、カラム値の配列もしくは各カラム名に対応するプロパティを持つオブジェクトとして各行を表します。 取得結果がゼロ件だった場合は空の配列を返し、 失敗した場合は FALSE を返します。
SELECT文でデータを取得する際にデータが一件も見つからなかった場合は、空の配列が戻ってくる、とのことなので、戻り値を受け取るときは配列型で受け取らなければならないと思い、以下のようにしてデータを受け取るようにしました。
// テーブルからデータを取り出すSQL文
$sql = 'SELECT id FROM test_table;';
$sth = $dbh->prepare($sql);
$sth->execute();
$id_list[] = $sth->fetchAll();
//データが取得されたかどうかの確認
if(empty($id_list)){
echo 'test_tableからidが取得できました';
}else{
echo 'test_tableからidを取得できませんでした';
}
empty()
を使ってfetchAll()
で取得した配列を検査しデータが取得できたときと、できなかったときで条件を分けることができるかと思っていましたが、実態は異なっていました。
print_r()
で配列の中身を確認してみたら以下のようになっていました。
Array
(
[0] => Array
(
)
)
空の配列を配列型で受け取っているため、空の配列が配列に格納されて、二次元配列のようになっていました。
上記の処理についてコメントをいただきました
そもそも、配列の受け取り方に根本的な間違いがありました。
PHPでは変数名[]で代入することで配列の最後に要素を追加する、という>意味になるため、上記のような結果となっていたようです。
配列で受け取った場合は、以下のように、受け取った配列の0番目の配列の中身を確認すればよいでしょう。
// テーブルからデータを取り出すSQL文
$sql = 'SELECT id FROM test_table;';
$sth = $dbh->prepare($sql);
$sth->execute();
$id_list[] = $sth->fetchAll();
//データが取得されたかどうかの確認
if(empty($id_list[0])){
echo 'test_tableからidが取得できました';
}else{
echo 'test_tableからidを取得できませんでした';
}
すごい初歩的なことですが、配列の中身を確認するまでずっと悩んでしまいました。
##参考
PDOStatement::fetchAll
http://php.net/manual/ja/pdostatement.fetchall.php