PHPのmysqli_stmtでfetchAllっぽいものを実現する方法
mysqli_stmt::bind_resultの実装になじみが無く苦しんでいるphpユーザーの皆さんこんにちは。
いやー、面倒ですよね、bind_result。変数、どんだけ並ばすのかと。
できれば使いたくないですが、やんごとなき理由でmysqliを使い続けなければならないときに、さくっと連想配列で全ての結果を取得する方法を探したところ、StackOverflowの「How can I put the results of a MySQLi prepared statement into an associative array?(訳:どうやったらMysqliのプリペアドステートメントで連想配列で結果を受け取れるの?)」たどり着きました。
こちらの回答をまるっと使わせてもらって作った関数が以下の通りです。prepareしてexecuteさせたmysqliのステートメント(オブジェクト指向型)を渡すと、連想配列で結果が返ります。
function fetch_all(& $stmt) {
$hits = array();
$params = array();
$meta = $stmt->result_metadata();
while ($field = $meta->fetch_field()) {
$params[] = &$row[$field->name];
}
call_user_func_array(array($stmt, 'bind_result'), $params);
while ($stmt->fetch()) {
$c = array();
foreach($row as $key => $val) {
$c[$key] = $val;
}
$hits[] = $c;
}
return $hits;
}
関係ないですけど、最近、プログラミングの情報を検索しているとStackOverflowにたどり着くことが多くなってきましたねぇ...。
StackOverflowについては『Stack Overflow』から学ぶ最近のコミュニティ構築術 | IDEA*IDEAが参考になりますのでぜひどうぞ。
[…] ありがたくこちらを使わせていただきました。 […]