5
$genre = array(
    'Action',
    'Adventure',
    'Fantasy'
);
$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();
    $array1 = array();
    while ($stmt->fetch()) {
        $array1[] = $genres;
    }
}

上記のコードは、が と等しいgenreIDときから値を取得します。そして、結果を配列に格納します。しかし、配列であるため機能しないため、ループして毎回異なる値を取得する必要があります。dbGenre$genre$genregenreID

「genres」テーブルには、 genreID (INT)dbGenre (VARCHAR)の 2 つの列が含まれています。

それぞれのgenreID(数字)が必要です... dbGenreがActionと等しい場合、そのgenreIDをarray1に保存し、$genre配列をループして次の値のgenreIDを取得し、再度保存します配列1で。

どうすれば修正できますか?

4

2 に答える 2

8

配列を SQL パラメーターにバインドすることはできません。SQL では、単一のリテラル値の代わりにパラメーターを使用できます。値のリスト、式、または列名またはテーブル名ではありません。

ケースのタスクを解決するには、次の 2 つのソリューションのいずれかを使用できます。

最初の解決策:配列をループし$genre、各値を一度に 1 つずつバインドし、各値に対して SQL クエリを実行します。

$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), '?')) . ')';

また、配列bind_param()内の要素に基づいて可変数の引数を使用して、トリッキーな呼び出しを行う必要があります。$genre

$stmt->prepare($selectGenre_sql);
$temp = array();
foreach ($genre as $key => $value) {
    $temp[] = &$genre[$key];
}

array_unshift($genre, str_repeat('i', count($genre)));
call_user_func_array(array($stmt, 'bind_param'), $genre);

$stmt->execute();

$stmt->bind_result($genres);

$array1 = array();
while ($stmt->fetch()) {
    $array1[] = $genres;
}

PDO_MYSQL配列からパラメーターをバインドする方が簡単なので、使用を検討することをお勧めします。この場合、MySQLi インターフェースはかなり厄介です。

于 2009-03-09T20:47:54.657 に答える
-1

いくつかのこと。

  • $genre 変数を上書きしたためではないでしょうか。sedond の場合は $genreArray に変更してみてください。
  • データベースが実際に何かを返していることを確認してください (phpMyAdmin などで試してください)。

  • 次のように処理してみてください。

.

 $genreId = -1;
 $stmt->bind_results($genreId);
 $stmt->execute();
 while($stmt->fetch()){
  $genreArray[] = $genreId;
 }
于 2009-03-09T20:03:47.870 に答える