PHPとMYSQLi-ループを使用してパラメーターをバインドし、配列に格納しますか?

StackOverflow https://stackoverflow.com/questions/627763

質問

次のコードで説明する方が簡単です(ちなみに間違っています):

        $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;
 }
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top