PHPとMYSQLi-ループを使用してパラメーターをバインドし、配列に格納しますか?
質問
次のコードで説明する方が簡単です(ちなみに間違っています):
$selectGenre_sql = 'SELECT genreID FROM genres WHERE dbGenre = ?';
if ($stmt->prepare($selectGenre_sql)) {
// bind the query parameters
$stmt->bind_param('s', $genre);
// bind the results to variables
$stmt->bind_result($genres);
// execute the query
$stmt->execute();
$genre = array();
while ($stmt->fetch()) {
$genre[] = $genres;
}
}
上記のコードは、「dbGenre」が「$ genre」に等しい場合に「genreID」から値を取得します。そして、結果を配列に保存します。しかし、私は働いていません。どうして? 「$ genre」は配列であるため、毎回「genreID」とは異なる値を取得するためにループする必要があると思います。
$ genreは、映画のジャンルを含む列挙配列です。例:
[0] =>アクション[1] =>アドベンチャー[2] =>ファンタジー
de値を比較する必要があります(たとえば、「アクション」など)
「genres」テーブルには2つの列が含まれます: genreID(INT)および dbGenre(VARCHAR)
各genreID(数値)が必要です。...たとえば、dbGenreがActionと等しい場合、genreIDをarray1に格納し、$ genre配列をループして取得します。次の値のgenreIDを再度array1に保存します
どうすれば修正できますか?プログラミングは初めてなので、できるだけ詳しく説明してください。ありがとう!!
解決
配列をSQLパラメーターにバインドすることはできません。 単一のリテラル値の代わりに、SQLのパラメータを使用できます。値のリスト、式、列名、テーブル名ではありません。
タスクを解決するには、次の2つのソリューションのいずれかを使用できます。
最初の解決策: $ genre
配列をループし、各値を1つずつバインドし、各値に対してSQLクエリを実行します。
if ($stmt->prepare($selectGenre_sql)) {
$genre = array();
foreach ($gengre as $genreID) {
$stmt->bind_param('s', $genreID);
$stmt->execute();
$stmt->bind_result($genres);
while ($stmt->fetch()) {
$genre[] = $genres;
}
}
}
2番目の解決策:配列の各値に1つずつ、複数のパラメーターを使用して、クエリを1回実行します。これには、SQLクエリ内にコンマで区切られた可変数の?
プレースホルダーを作成するためのトリッキーなコードが必要です。
$selectGenre_sql = 'SELECT genreID FROM genres WHERE dbGenre IN ('
. join(',', array_fill(0, count($genre), '?')) . ')';
if ($stmt->prepare($selectGenre_sql)) {
$genre = array();
. . .
また、 $ genre
配列の要素に基づいて、可変数の引数を使用して bind_param()
を呼び出すのが難しい場合があります:
. . .
call_user_func_array( array($stmt, 'bind_param'),
array_unshift($genre, str_repeat('i', count($genre)));
$stmt->execute();
$stmt->bind_result($genres);
while ($stmt->fetch()) {
$genre[] = $genres;
}
}
配列からパラメータをバインドする方が簡単なので、 PDO :: mysql
の使用を検討することをお勧めします。この場合、MySQLiインターフェースはかなり扱いにくいです。
他のヒント
@ビルカーウィン
call_user_func_arrayは参照によって引数を渡さず、値を渡すため機能しません! stmt-> bind_paramエラーが発生します
pdoはより良い解決策ではありません...まだ回避策を講じる必要があります
これはur postで編集する必要があります:
if($stmt = ...same as yours) {
array_unshift($genre, str_repeat('i', count($genre)));
$temp = array();
foreach($genre as $key => $value) {
$temp[$key] = &$genre[$key];
}
call_user_func_array(array($stmt, 'bind_param'), $temp);
etc...
}
いくつかのこと。
- それは、$ genre varを上書きしているからではありませんか。sedondの場合は$ genreArrayに変更してみてください。
-
データベースが実際に返していることを確認します(phpMyAdminまたは同様のもので試してください)
-
次のような処理を試してください:
。
$genreId = -1;
$stmt->bind_results($genreId);
$stmt->execute();
while($stmt->fetch()){
$genreArray[] = $genreId;
}