php mysqli DONDE EN (?,?,? …)

Según http://us2.php.net/manual/en/mysqli-stmt.bind-param.php , los diferentes tipos son:

i corresponding variable has type integer d corresponding variable has type double s corresponding variable has type string b corresponding variable is a blob and will be sent in packets 

Sin embargo, ¿cómo puedes manejar esto?

 ->prepare("SELECT blabla FROM foo WHERE id IN (?)") 

Dónde ? sería una lista de identificadores. Podría haber uno o más artículos:

 $ids = "3,4,78"; ->bind_param('s',$ids); 

¿Es eso posible?

Me gustaría utilizar declaraciones preparadas porque se ejecutará en un bucle.

La syntax correcta sería

 ->prepare("SELECT blabla FROM foo WHERE id IN (?, ?, ?)") 

para 3 elementos en esa matriz, por ejemplo. Luego, deberá vincular cada uno de esos elementos individualmente utilizando bind_param() .

Si no tiene una garantía de tamaño en la matriz, tendrá que escribir un par de funciones auxiliares para generar su SQL con el número adecuado de “?” Y declaraciones de vinculación.

Si tiene una lista de variables que difieren en tamaño en cada llamada que debe vincular a una statement IN , la forma más sencilla sería generar la cadena SQL programáticamente y usar un ciclo para vincular las variables:

 /** * @param array $values * @param mysqli $db * @return mysqli_stmt */ function bindInValues(array $values, mysqli $db) { $sql = sprintf('SELECT blabla FROM foo WHERE id IN (%s)', implode(', ', array_fill(0, count($values), '?')) ); $stmt = $db->prepare($sql); foreach ($values as $value) { $stmt->bind_param('s', $value); } return $stmt; } 

Si le gusta call_user_func_array , puede usar la invocación de método dynamic y continuar sin un bucle.

 /** * @param array $values * @param mysqli $db * @return mysqli_stmt */ function bindInValues(array $values, mysqli $db) { $sql = sprintf('SELECT blabla FROM foo WHERE id IN (%s)', implode(', ', array_fill(0, count($values), '?')) ); $stmt = $db->prepare($sql); array_unshift($values, implode('', array_fill(0, count($values), 's'))); call_user_func_array(array($stmt, 'bind_param'), $values); return $stmt; } 

¿Qué tal hacer esto?

 $sql = sprintf("SELECT blabla FROM foo WHERE id IN(%s) ", $ids); $stmt = $mysqli->prepare($sql); if (!$stmt) { $this->throwException(); } if (!$stmt->execute()) { $this->throwException(); } 

Si no es bueno, por favor dígame por qué puedo aprender de mis errores. ¡Gracias!

Creo que encontré la respuesta a mi pregunta:

 ->prepare("SELECT stuff FROM table_name WHERE id IN (?)"); $itemList = implode(',',$items); $children->bind_param('s',$itemList); 

Parece estar funcionando bien cuando se usa una cuerda con valores separados por coma. Todavía estoy comprobando si los resultados son realmente precisos …