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

Não é possível obter o número de linhas e buscar ao usar a instrução preparada do MySQLi


Se você quiser usar mysqli_stmt::$num_rows (ou seja, verifique o número de linhas na instrução preparada), você precisa usar $stmt->store_result() depois de executar a instrução preparada antes de poder verificar o número de linhas. Isso significa que o resultado é armazenado na memória antes de verificarmos quantas linhas foram retornadas.
$stmt = $conn->prepare($sql);
$stmt->bind_param('ss',$log_username,$log_username);
$stmt->execute();
$stmt->store_result(); // Need to store the result into memory first
if ($stmt->num_rows) {
    // ...

No entanto, se você quiser usar mysqli_result::$num_rows (no MySQLi-result que você converte do resultado da instrução), você precisa fazer isso depois de fazer $result = $stmt->get_result(); , e use $result->num_rows; , como mostrado abaixo.
$stmt = $conn->prepare($sql);
$stmt->bind_param('ss',$log_username,$log_username);
$stmt->execute();
$result = $stmt->get_result();
if ($result->num_rows) {
    while ($row = $result->fetch_assoc()) {
    // ....

No final, ambos devem acabar fazendo a mesma coisa - forneça um número de linhas retornadas pela consulta preparada original.

Observação
É importante notar que você não pode usar store_result() e get_result() na mesma declaração. O que significa que no primeiro exemplo, você não pode converter para um objeto mysqli-result (usando get_result() , que permite usar o padrão fetch_assoc() método). Como store_result() armazena o resultado na memória, não há nada para get_result() converter e vice-versa.

Isso significa que se você usar store_result() , você precisa buscar através da instrução-fetch, mysqli_stmt::fetch() e vincule os resultados através de mysqli_stmt::bind_result() . Se você usar get_result() , você deve verificar o número de linhas no objeto resultante do MySQLi-result (como mostrado no segundo exemplo).

Você deve, portanto, construir seu código de forma que você só precise usar um deles.

Dito isto, usando affected_rows como sugerido nos comentários, não é a ferramenta certa para o trabalho - conforme o manual em mysqli_stmt::$affected_rows (a mesma coisa se aplica a uma consulta regular, mysqli::$affected_rows ):