Mysql
 sql >> Database >  >> RDS >> Mysql

Impossibile ottenere il numero di righe e recuperare quando si utilizza l'istruzione preparata MySQLi

Se vuoi usare mysqli_stmt::$num_rows (ovvero, controlla il numero di righe sull'istruzione preparata), devi usare $stmt->store_result() dopo aver eseguito l'istruzione preparata prima di poter controllare il numero di righe. Ciò significa che il risultato viene archiviato in memoria prima di controllare quante righe sono state restituite.

$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) {
    // ...

Tuttavia, se vuoi usare mysqli_result::$num_rows (sul risultato MySQLi che converti dal risultato dell'istruzione), devi farlo dopo aver eseguito $result = $stmt->get_result(); e usa $result->num_rows; , come mostrato di seguito.

$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()) {
    // ....

Alla fine, entrambi dovrebbero finire per fare la stessa cosa:fornire un numero di righe restituite dalla query preparata originale.

Nota
È importante notare che non puoi utilizzare store_result() e get_result() sulla stessa affermazione. Ciò significa che nel primo esempio, non puoi convertire in un oggetto mysqli-result (usando get_result() , che ti consente di utilizzare lo standard fetch_assoc() metodo). Come store_result() memorizza il risultato in memoria, non c'è nulla per get_result() convertire e viceversa.

Ciò significa che se utilizzi store_result() , devi recuperare tramite l'istruzione-fetch, mysqli_stmt::fetch() e associa i risultati tramite mysqli_stmt::bind_result() . Se usi get_result() , dovresti controllare il numero di righe sull'oggetto MySQLi-result risultante (come mostrato nel secondo esempio).

Dovresti quindi costruire il tuo codice in modo tale che tu debba usarne solo uno.

Detto questo, usando affected_rows come suggerito nei commenti, non è lo strumento giusto per il lavoro - come da manuale su mysqli_stmt::$affected_rows (la stessa cosa vale per una query normale, mysqli::$affected_rows ):