stmt mysqli_stmt bind_param array php mysql sql mysqli prepared-statement

php - array - mysqli_stmt:: bind_param():



Cómo usar bind_result() en lugar de get_result() en php (5)

Asumiendo que no puede usar get_result() y quiere una matriz de dispositivos, podría hacer:

public function getAllDevices($user_id) { $stmt = $this->conn->prepare("SELECT device_id, device_name, device_info FROM devices WHERE primary_owner_id = ?"); $stmt->bind_param("i", $user_id); $stmt->execute(); $stmt->bind_result($id, $name, $info); $devices = array(); while($stmt->fetch()) { $tmp = array(); $tmp["id"] = $id; $tmp["name"] = $name; $tmp["info"] = $info; array_push($devices, $tmp); } $stmt->close(); return $devices; }

Esto crea una matriz temporal y almacena los datos de cada fila en ella, y luego los empuja a la matriz principal. Por lo que sé, no puedes usar SELECT * en bind_result() . En cambio, tendrá que escribir de forma molesta todos los campos que desee después de SELECT

Estoy trabajando en un proyecto para uni y he estado usando el siguiente código en un testing server para get all devices de una tabla basada en un user_id :

public function getAllDevices($user_id) { $stmt = $this->conn->prepare("SELECT * FROM devices WHERE primary_owner_id = ?"); $stmt->bind_param("i", $user_id); $stmt->execute(); $devices = $stmt->get_result(); $stmt->close(); return $devices; }

Esto funcionó bien en mi servidor de prueba, pero devuelve este error al migrar al servidor de proyecto de la universidad:

Call to undefined method mysqli_stmt::get_result()

Algunos googlean sugieren usar bind_result() lugar de get_result() pero no tengo idea de cómo hacer esto en all fields de la tabla. La mayoría de los ejemplos solo muestran regresar one field

Cualquier ayuda sería muy apreciada


para usar bind_result() no puede usar consultas SELECT * .

en su lugar, debe seleccionar nombres de tablas individuales, luego vincular los resultados en el mismo orden. he aquí un ejemplo:

$stmt = $mysqli->prepare("SELECT foo, bar, what, why FROM table_name WHERE id = ?"); $stmt->bind_param("i", $id); if($stmt->execute()) { $stmt->bind_result($foo, $bar, $what, $why); if($stmt->fetch()) { $stmt->close(); }else{ //error binding result(no rows??) } }else{ //error with query }


A estas alturas, ciertamente ha captado la idea de vincularse a múltiples variables. Sin embargo, no crea las admoniciones sobre no usar "SELECT *" con bind_result (). Puede mantener sus instrucciones "SELECT *" ... incluso en su servidor requiriendo que use bind_result (), pero es un poco complicado porque tiene que usar PHP call_user_func_array () como una forma de pasar un arbitrario (debido a "SELECT" * ") número de parámetros para bind_result (). Otros antes que yo han publicado una función útil para hacer esto en otros lugares de estos foros. Lo incluyo aquí:

// Take a statement and bind its fields to an assoc array in PHP with the same fieldnames function stmt_bind_assoc (&$stmt, &$bound_assoc) { $metadata = $stmt->result_metadata(); $fields = array(); $bound_assoc = array(); $fields[] = $stmt; while($field = $metadata->fetch_field()) { $fields[] = &$bound_assoc[$field->name]; } call_user_func_array("mysqli_stmt_bind_result", $fields); }

Ahora, para usar esto, hacemos algo como:

function fetch_my_data() { $stmt = $conn->prepare("SELECT * FROM my_data_table"); $stmt->execute(); $result = array(); stmt_bind_assoc($stmt, $row); while ($stmt->fetch()) { $result[] = array_copy($row); } return $result; }

Ahora, fetch_my_data () devolverá una matriz de matrices asociativas ... todo configurado para codificar a JSON o lo que sea.

Es un poco astuto lo que está pasando, aquí. stmt_bind_assoc () construye una matriz asociativa vacía en la referencia que le pasa ($ bound_assoc). Utiliza result_metadata () y fetch_field () para obtener una lista de los campos devueltos y (con esa sola instrucción en el ciclo while) crea un elemento en $bound_assoc con ese nombre de campo y agrega una referencia a él en la matriz $ fields. La matriz $ fields se pasa luego a mysqli_stmt_bind_result. La parte realmente resbaladiza es que aún no se han pasado valores reales a $ bound_assoc . Toda la obtención de los datos de la consulta ocurre en fetch_my_data (), como se puede ver en el hecho de que stmt_bind_assoc() se llama antes del while($stmt->fetch()) .

Sin embargo, hay una trampa: como la declaración se ha vinculado a las referencias en $ bound_assoc, cambiarán con cada $stmt->fetch() . Entonces, necesitas hacer una copia profunda de $ row. Si no lo hace, todas las filas de su matriz $ result contendrán lo mismo: la última fila devuelta en su SELECCIÓN. Entonces, estoy usando una pequeña función array_copy () que encontré con Google:

function array_copy( array $array ) { $result = array(); foreach( $array as $key => $val ) { if( is_array( $val ) ) { $result[$key] = arrayCopy( $val ); } elseif ( is_object( $val ) ) { $result[$key] = clone $val; } else { $result[$key] = $val; } } return $result; }


get_result() ahora solo está disponible en PHP instalando el controlador nativo de MySQL (mysqlnd). En algunos entornos, puede que no sea posible o deseable instalar mysqlnd.

No obstante, puede utilizar mysqli para hacer consultas ''select *'' y obtener los resultados con los nombres de campo, aunque es un poco más complicado que usar get_result() , e implica el uso de la función call_user_func_array() php. Vea el ejemplo a continuación que hace una simple consulta ''select *'', y muestra los resultados (con los nombres de las columnas) en una tabla HTML:

$maxaccountid=100; $sql="select * from accounts where account_id<?"; $stmt = $mysqli->prepare($sql); $stmt->bind_param(''i'', $maxaccountid); $stmt->execute(); print "<table border=1>"; print "<thead><tr>"; $i=0; $meta = $stmt->result_metadata(); $query_data=array(); while ($field = $meta->fetch_field()) { print "<th>" . $field->name . "</th>"; $var = $i; $$var = null; $query_data[$var] = &$$var; $i++; } print "</tr></thead>"; $r=0; call_user_func_array(array($stmt,''bind_result''), $query_data); while ($stmt->fetch()) { print "<tr>"; for ($i=0; $i<count($query_data); $i++) { print "<td>" . $query_data[$i] . "</td>"; } print "</tr>"; $r++; } print "</table>"; $stmt->close(); print $r . " Records<BR>";


Su pregunta sugiere que tiene el controlador nativo de MySQL (MySQLnd) instalado en su servidor local, pero MySQLnd falta en el servidor del proyecto de la escuela. Porque get_result() requiere MySQLnd.

Por lo tanto, si aún desea usar get_result() lugar de bind_result() en el servidor del proyecto de la escuela, entonces debe instalar MySQLnd en el servidor del proyecto de la escuela.