2011-08-12 17 views
11

Mi código:parámetros de unión para la cláusula WHERE IN con DOP

$myArray = implode($myArray, ','); 
$sth = $dbh->prepare('SELECT foo FROM bar WHERE ids IN (:ids)'); 
$sth->bindParam(':ids', $myArray); 
$sth->execute(); 
$result = $sth->fetch(); 
echo $sth->rowCount(); 

Siempre muestra un conteo de 1, pero cuando me salto la parametrización y simplemente añadir la propia variable en su lugar, me sale un recuento exacto. ¿Que está pasando aqui?

Respuesta

12

No se puede vincular un parámetro para la cláusula IN de esa manera. La cadena $ miMatriz sólo se contará como un valor, como si lo hiciera esto:

SELECT foo FROM bar WHERE ids IN ('1,2,3') 

A pesar de que hay tres valores delimitados por comas, la base de datos los lee como un solo valor de cadena.

Debe insertar manualmente la lista EN en la consulta, la forma de la vieja escuela.

'SELECT foo FROM bar WHERE ids IN (' . $myArray .')' 

Desafortunadamente, no hay otra manera. Por ahora.

+7

¿En serio? Las declaraciones preparadas no pueden manejar eso? Qué tonto es eso:/ – hoppa

+0

tenga cuidado con la inyección sql. – Dani

+5

@hoppa: pueden manejarlo así: 'id IN (: id1,: id2,: id3 ...)', obtienes el patrón. Estás mejor con el método de la vieja escuela. – Maerlyn

6

Sé que esta pregunta es antiguo, pero esto funciona para mí:

$arrayOfValues = array(1,2,3,4,5); 
$questionMarks = join(",", array_pad(array(), count($arrayOfValues), "?")); 
$stmt = $dbh->prepare("update some_table set end_date = today where value_no in ($questionMarks)"); 
$stmt->execute($arrayOfValues); 
0

¿Por qué no utilizar esta solución?

https://stackoverflow.com/a/39353278/1834212

Analiza una matriz de valores que son los pares de marcadores de posición de vinculación y sus elementos, en el caso de una IN sólo tiene que alimentar a un Array, y luego se analizará la matriz y modificar el cadena para usted que usa los nombres de enlace generados sobre la marcha, y luego alimentar esos valores de la matriz

Cuestiones relacionadas