2009-04-21 21 views
12

estoy en movimiento algo de código antigua a la nueva interfaz de MSQLI usando declaraciones preparadas, estoy teniendo problemas con las sentencias SQL que contienen la cláusula IN. Me gustaría simplemente normalmente hacer esto:¿Cómo se utiliza en las cláusulas con mysqli declaraciones preparadas

$ids = '123,535,345,567,878' 
$sql = "SELECT * FROM table WHERE id IN ($ids)"; 
$res = mysql_query($sql); 

Convirtiendo esto a Mysqli y declaraciones preparadas He intentado varias soluciones:

$ids = '123,535,345,567,878' 
$ids = implode($ids,','); 
$result = $msqli->prepare("SELECT foo,blar FROM table WHERE id IN (?)); 
$result->bind_param("i", $ids); 
$result->execute(); 

lo anterior falla y calculando el número de elementos en la matriz y la alteración número de signos de interrogación en la cadena SQL y llamar bind_parm para cada elemento en la matriz también falla. Solo usar la secuencia separada por comas también falla.

No puedo encontrar ninguna buena documentación de Google en esto, así que ¿Cómo se ha resuelto el problema?

+0

duplicado posible de [? PreparedStatement en la cláusula alternativas] (https://stackoverflow.com/questions/178479/preparedstatement -in-clause-alternatives) – bfavaretto

Respuesta

9

No es posible enlazar una lista de longitud variable a una única variable ligada.

Del mismo modo, si usted fuera a obligar a la cadena $ids que realmente va a terminar con:

SELECT foo,blar FROM table WHERE id IN ('123,535,345,567,878') 

(Tenga en cuenta las comillas alrededor de la lista de ID).

Crear su propia consulta con el número correcto de signos de interrogación y los parámetros vinculados debería haber funcionado realmente; puede que tenga que intentarlo de nuevo e informar sobre el error real.

Alternativamente, esta puede ser una de esas ocasiones en las que, lamentablemente, es necesario crear manualmente su propio SQL y no utilizar parámetros vinculados.

-1

me pareció que el punto de declaraciones preparadas fue así en esta situación sólo podría hacer:

$stmt = $this->mysqli->prepare("UPDATE radcheck SET attribute = ?, value = ? WHERE username = ? AND attribute LIKE 'CS-Total-Octets%'"); 
foreach ($usernames as $username) 
{ 
    $stmt->bind_param('sss', $bandwidth_types[$bandwidth_type], $bandwidth_bytes, $username); 
    $stmt->execute(); 
} 
$stmt->close(); 
+0

Su respuesta es más como una pregunta, creo. Además, el problema será que en las sentencias IN escapará a múltiples valores en una sola cadena. –

Cuestiones relacionadas