Pregunta

He visto un par de preguntas en los últimos días que han usado mysqli pero donde las respuestas parecen no haber reconocido la diferencia entre $ stmt- > execute () y $ db- > query () .

Según tengo entendido, hay dos modelos diferentes para acceder a los resultados en mysqli .

Éste usa SQL sin procesar y requiere que el programador escape de la entrada para evitar ataques de inyección SQL, pero le permite al programador recuperar una matriz asociativa (o una matriz simple) que contiene column = > asignaciones de valor :

$result_set = $db->query("SAFE SQL QUERY HERE");
while ($row = $result_set->fetch_assoc()) {
     # do something with $row['fieldname'];
}  

Alternativamente, puede hacer esto, lo que permite un buen enlace de parámetros y resultados, pero no puede (AFAIK) darle ningún tipo de resultado de matriz simple:

$stmt = $db-prepare("SQL QUERY WITH ? PLACEHOLDERS");
$stmt->bind_param("s", $input_variable);
$stmt->execute();
$stmt->bind_results($output_col1, $output_col2);
while ($stmt->fetch()) {
     # do something with $output_col1 and $output_col2
}

Mi pregunta es: ¿hay alguna forma con mysqli para obtener la salida de matriz simple que se muestra en el primer patrón, pero mientras se siguen usando parámetros de entrada vinculados de forma segura según el segundo patrón?

No puedo encontrar de todos modos para hacer esto (¡aparte de usar PDO en su lugar!).

¿Fue útil?

Solución

Hay múltiples implementaciones de una función para hacer este tipo de cosas en los comentarios en esta página del manual de php: mysqli_stmt :: fetch

Otros consejos

Alnitak,

AFAIK, no puede vincular una matriz completa a los resultados obtenidos automáticamente. Desafortunadamente. Sin embargo, si está buscando un comportamiento de matriz (presumiblemente para que sea más fácil pasar los resultados), puede intentar esto:

<?php
 $dbh = new mysqli( ... );
 $arr = array();
 if( $stmt = $dbh->prepare( 'SELECT id, email FROM email_list' );
 {
  $stmt->execute();
  $stmt->bind_result( $arr['id'], $arr['email'] );

  while( $stmt->fetch() )
   DoSomething( $arr );
 }
?>

Esto le dará el comportamiento que solicitó anteriormente. Sin embargo, no vinculará dinámicamente los campos de la matriz a indeces asociativos en la matriz; es decir, debe especificar que la identificación esté vinculada a $ arr ['id'], etc.

Si su escenario realmente requiere un enlace dinámico a las indeces asociativas, siempre puede escribir una clase simple que primero analice la consulta para los campos seleccionados, luego configure las indeces de la matriz de asociación y luego realice la consulta.

Yo diría que no. Aunque no he trabajado con mysqli ni he preparado declaraciones por tonelada, creo que cada paso en su segundo ejemplo es discreto y necesario. El único consuelo que puedo darle es que su primer ejemplo pasó por alto un escape de SQL que puede ignorar de manera segura y verdadera en su segundo ejemplo.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top