$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; } }
The code above gets the value from genreID
when dbGenre
is equal to $genre
. And then store the results in an array. But it’s not working because $genre
is an array, so I need to loop through it to get a different value from genreID
each time.
The ‘genres’ table contains two columns: genreID (INT) and dbGenre (VARCHAR)
I just need each genreID (that is a number)… Let’s say when dbGenre is equal to Action, then store the genreID in an array1, and then loop the $genre array to get the genreID for the next value and store it again in array1.
How can I fix it?
Advertisement
Answer
You can’t bind an array to an SQL parameter. You can use a parameter in SQL in place of a single literal value. Not a list of values, or an expression, or a column name or table name.
To solve the task in your case, you can use either of two solutions:
First solution: loop over $genre
array, bind each value one at a time and execute the SQL query for each value.
$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; } }
Second solution: execute the query once, with multiple parameters, one for each value in the array. This requires some tricky code to build a variable number of ?
placeholders in the SQL query, separated by commas.
$selectGenre_sql = 'SELECT genreID FROM genres WHERE dbGenre IN (' . join(',', array_fill(0, count($genre), '?')) . ')';
Also you need to get tricky calling bind_param()
with a variable number of arguments based on the elements in your $genre
array:
$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; }
You might want to consider using PDO_MYSQL
because it’s easier to bind parameters from an array. The MySQLi interface is pretty awkward for this case.