sql >> Base de Datos >  >> RDS >> Mysql

¿Cómo usar mysqli_query() en PHP?

Debo admitir, mysqli_query() la entrada manual no contiene un ejemplo limpio sobre cómo obtener varias filas. Puede ser porque la rutina es tan rutinaria, conocida por la gente de PHP durante décadas:

$result = $link->query("DESCRIBE students");
while ($row = $result->fetch_assoc()) {
    // to print all columns automatically:
    foreach ($row as $value) {
        echo "<td>$value</td>";
        // OR to print each column separately:
        echo "<td>",$row['Field'],"</td><td>",$row['Type'],"</td>\n";
    }
}

En caso de que desee imprimir los títulos de las columnas, primero debe seleccionar sus datos en una matriz anidada y luego usar las teclas de la primera fila:

// getting all the rows from the query
// note that handy feature of OOP syntax
$data = $link->query("DESC students")->fetch_all(MYSQLI_ASSOC);
// getting keys from the first row
$header = array_keys(reset($data));
// printing them
foreach ($header as $value) {
    echo "<td>$value</td>";
}
// finally printing the data
foreach ($data as $row) {
    foreach ($row as $value) {
        echo "<td>$value</td>";
    }
}

Es posible que algunos hosts no admitan fetch_all() función. En tal caso, complete el $data matriz de la forma habitual:

$data = [];
$result = $link->query("DESC students");
while ($row = $result->fetch_assoc())
{
    $data[] = $row;
}

Dos notas importantes que debo añadir.

  1. Debe configurar mysqli para arrojar errores automáticamente en lugar de verificarlos manualmente para cada declaración de mysqli. Para hacerlo, agregue esta línea antes mysqli_connect() :

     mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
    
  2. La nota más importante: a diferencia de mysql_query() , mysqli_query() tiene un uso muy limitado. Puede usar esta función solo si no se van a usar variables en la consulta. Si se va a usar alguna variable de PHP, nunca debe usar mysqli_query() , pero siempre apéguese a declaraciones preparadas , así:

     $stmt = $mysqli->prepare("SELECT * FROM students WHERE class=?");
     $stmt->bind_param('i', $class);
     $stmt->execute();
     $data = $stmt->get_result()->fetch_all();
    

Es un poco prolijo, tengo que admitirlo. Para reducir la cantidad de código, puede usar PDO o adoptar una función auxiliar simple para hacer todo el trabajo de preparación/vinculación/ejecución dentro:

$sql = "SELECT * FROM students WHERE class=?";
$data = prepared_select($mysqli, $sql, [$class])->fetch_all();