Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

Como usar mysqli_query() em PHP?


Eu tenho que admitir, mysqli_query() entrada manual não contém um exemplo claro de como buscar várias linhas. Pode ser porque a rotina é tão rotineira, conhecida pelo pessoal do PHP há 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";
    }
}

Caso você queira imprimir os títulos das colunas, primeiro selecione seus dados em um array aninhado e depois use as teclas da primeira linha:
// 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>";
    }
}

Alguns hosts podem não ter suporte para fetch_all() função. Nesse caso, preencha o campo $data array da maneira usual:
$data = [];
$result = $link->query("DESC students");
while ($row = $result->fetch_assoc())
{
    $data[] = $row;
}

Duas notas importantes que devo acrescentar.


  1. Você precisa configurar o mysqli para lançar erros automaticamente em vez de verificá-los para cada instrução mysqli manualmente. Para fazer isso, adicione esta linha antes mysqli_connect() :
     mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
    

  2. A observação mais importante: ao contrário de mysql_query() , mysqli_query() tem um uso muito limitado. Você pode usar esta função apenas se nenhuma variável for usada na consulta. Se alguma variável PHP for usada, você nunca deve usar mysqli_query() , mas sempre siga as declarações preparadas , assim:
     $stmt = $mysqli->prepare("SELECT * FROM students WHERE class=?");
     $stmt->bind_param('i', $class);
     $stmt->execute();
     $data = $stmt->get_result()->fetch_all();
    

É um pouco prolixo, tenho que admitir. Para reduzir a quantidade de código, você pode usar o PDO ou adotar uma função auxiliar simples para fazer todo o negócio de preparação/vinculação/execução dentro:
$sql = "SELECT * FROM students WHERE class=?";
$data = prepared_select($mysqli, $sql, [$class])->fetch_all();