mysql_fetch_array () / mysql_fetch_assoc () / mysql_fetch_row () / mysql_num_rows ecc … si aspetta che il parametro 1 sia risorsa

Sto cercando di selezionare i dati da una tabella MySQL, ma ottengo uno dei seguenti messaggi di errore:

mysql_fetch_array () si aspetta che il parametro 1 sia risorsa, dato booleano

o

mysqli_fetch_array () si aspetta che il parametro 1 sia mysqli_result, dato booleano

o

Chiama una funzione membro fetch_array () su booleano / non-object

Questo è il mio codice:

$username = $_POST['username']; $password = $_POST['password']; $result = mysql_query('SELECT * FROM Users WHERE UserName LIKE $username'); while($row = mysql_fetch_array($result)) { echo $row['FirstName']; } 

Lo stesso vale per il codice come

 $result = mysqli_query($mysqli, 'SELECT ...'); // mysqli_fetch_array() expects parameter 1 to be mysqli_result, boolean given while( $row=mysqli_fetch_array($result) ) { ... 

e

 $result = $mysqli->query($mysqli, 'SELECT ...'); // Call to a member function fetch_assoc() on a non-object while( $row=$result->fetch_assoc($result) ) { ... 

e

 $result = $pdo->query('SELECT ...', PDO::FETCH_ASSOC); // Invalid argument supplied for foreach() foreach( $result as $row ) { ... 

e

 $stmt = $mysqli->prepare('SELECT ...'); // Call to a member function bind_param() on a non-object $stmt->bind_param(...); 

e

 $stmt = $pdo->prepare('SELECT ...'); // Call to a member function bindParam() on a non-object $stmt->bindParam(...); 

Una query potrebbe non riuscire per vari motivi, nel qual caso sia l’estensione mysql_ * che l’estensione mysqli restituiranno false dalle rispettive funzioni / metodi di query. È necessario verificare la condizione di errore e gestirla di conseguenza.

estensione mysql_ * :

NOTA Le funzioni mysql_ sono deprecate e sono state rimosse in php versione 7.

Controlla $result prima di passarlo a mysql_fetch_array . Scoprirai che è false perché la query non è riuscita. Vedere la documentazione di mysql_query per possibili valori di ritorno e suggerimenti su come gestirli.

 $username = mysql_real_escape_string($_POST['username']); $password = $_POST['password']; $result = mysql_query("SELECT * FROM Users WHERE UserName LIKE '$username'"); if($result === FALSE) { die(mysql_error()); // TODO: better error handling } while($row = mysql_fetch_array($result)) { echo $row['FirstName']; } 

estensione mysqli
stile procedurale :

 $username = mysqli_real_escape_string($mysqli, $_POST['username']); $result = mysqli_query($mysqli, "SELECT * FROM Users WHERE UserName LIKE '$username'"); // mysqli_query returns false if something went wrong with the query if($result === FALSE) { yourErrorHandler(mysqli_error($mysqli)); } else { // as of php 5.4 mysqli_result implements Traversable, so you can use it with foreach foreach( $result as $row ) { ... 

oo-stile :

 $username = $mysqli->escape_string($_POST['username']); $result = $mysqli->query("SELECT * FROM Users WHERE UserName LIKE '$username'"); if($result === FALSE) { yourErrorHandler($mysqli->error); // or $mysqli->error_list } else { // as of php 5.4 mysqli_result implements Traversable, so you can use it with foreach foreach( $result as $row ) { ... 

usando una dichiarazione preparata:

 $stmt = $mysqli->prepare('SELECT * FROM Users WHERE UserName LIKE ?'); if ( !$stmt ) { yourErrorHandler($mysqli->error); // or $mysqli->error_list } else if ( !$stmt->bind_param('s', $_POST['username']) ) { yourErrorHandler($stmt->error); // or $stmt->error_list } else if ( !$stmt->execute() ) { yourErrorHandler($stmt->error); // or $stmt->error_list } else { $result = $stmt->get_result(); // as of php 5.4 mysqli_result implements Traversable, so you can use it with foreach foreach( $result as $row ) { ... 

Questi esempi illustrano solo cosa dovrebbe essere fatto (gestione degli errori), non come farlo. Il codice di produzione non dovrebbe essere utilizzato or die durante l’output HTML, altrimenti genererà (almeno) un codice HTML non valido. Inoltre, i messaggi di errore del database non devono essere visualizzati dagli utenti non amministratori, in quanto rivelano troppe informazioni .

Questo messaggio di errore viene visualizzato quando si verifica un errore nella query che ha causato un errore. Si manifesterà quando si usa:

  • mysqli_fetch_array() / mysqli_fetch_array()
  • mysql_fetch_assoc() / mysqli_fetch_assoc()
  • mysql_num_rows() / mysqli_num_rows()

Nota : questo errore non viene visualizzato se nessuna riga è interessata dalla query. Solo una query con una syntax non valida genererà questo errore.

Risoluzione dei problemi

  • Assicurati di avere il tuo server di sviluppo configurato per visualizzare tutti gli errori. Puoi farlo posizionandolo nella parte superiore dei tuoi file o nel tuo file di configurazione: error_reporting(-1); . Se hai errori di syntax, questo li indicherà a te.

  • Usa mysql_error() . mysql_error() riporterà qualsiasi errore rilevato da MySQL durante l’esecuzione della query.

    Esempio di utilizzo:

     mysql_connect($host, $username, $password) or die("cannot connect"); mysql_select_db($db_name) or die("cannot select DB"); $sql = "SELECT * FROM table_name"; $result = mysql_query($sql); if (false === $result) { echo mysql_error(); } 
  • Esegui la tua query dalla riga di comando MySQL o uno strumento come phpMyAdmin . Se hai un errore di syntax nella tua query questo ti dirà di cosa si tratta.

  • Assicurati che le tue virgolette siano corrette. Un preventivo mancante attorno alla query o un valore può causare il fallimento di una query.

  • Assicurati di sfuggire ai tuoi valori. Le virgolette nella tua query possono causare il fallimento di una query (e anche lasciarti aperto a iniezioni SQL). Usa mysql_real_escape_string() per sfuggire al tuo input.

  • Assicurati di non mescolare le mysqli_* e mysql_* . Non sono la stessa cosa e non possono essere usati insieme. (Se sceglierai l’uno o l’altro stick con mysqli_* . Vedi sotto per il perché.)

Altri suggerimenti

mysql_* funzioni mysql_* non dovrebbero essere usate per il nuovo codice. Non vengono più mantenuti e la comunità ha iniziato il processo di deprecazione . Invece dovresti conoscere le dichiarazioni preparate e usare PDO o MySQLi . Se non puoi decidere, questo articolo ti aiuterà a scegliere. Se ti interessa imparare, ecco un buon tutorial su PDO .

L’errore che si è verificato qui era dovuto all’uso di virgolette singole ( ' ). Puoi inserire la tua query in questo modo:

 mysql_query(" SELECT * FROM Users WHERE UserName LIKE '".mysql_real_escape_string ($username)."' "); 

Sta usando mysql_real_escape_string per la prevenzione dell’iniezione SQL. Anche se dovremmo usare l’estensione MySQLi o PDO_MYSQL per la versione aggiornata di PHP (PHP 5.5.0 e versioni successive), ma per le versioni precedenti mysql_real_escape_string farà il trucco.

Come spiegato da scompt.com , la query potrebbe non riuscire. Utilizza questo codice per ottenere l’errore della query o il risultato corretto:

 $username = $_POST['username']; $password = $_POST['password']; $result = mysql_query(" SELECT * FROM Users WHERE UserName LIKE '".mysql_real_escape_string($username)."' "); if($result) { while($row = mysql_fetch_array($result)) { echo $row['FirstName']; } } else { echo 'Invalid query: ' . mysql_error() . "\n"; echo 'Whole query: ' . $query; } 

Vedere la documentazione di mysql_query() per ulteriori informazioni.

L’errore effettivo erano le virgolette singole in modo che la variabile $username non fosse analizzata. Ma dovresti davvero usare mysql_real_escape_string($username) per evitare iniezioni SQL.

Metti virgolette attorno a $username . I valori stringa, al contrario dei valori numerici, devono essere racchiusi tra virgolette.

 $result = mysql_query("SELECT * FROM Users WHERE UserName LIKE '$username'"); 

Inoltre, non è necessario utilizzare la condizione LIKE se non si utilizzano i caratteri jolly: se è necessario utilizzare una corrispondenza esatta = anziché LIKE .

Si prega di verificare una volta che il database selezionato non è perché alcune volte il database non è selezionato

Dai un’occhiata

 mysql_select_db('database name ')or DIE('Database name is not available!'); 

prima della query MySQL e quindi andare al passaggio successivo

 $result = mysql_query('SELECT * FROM Users WHERE UserName LIKE $username'); f($result === FALSE) { die(mysql_error()); 

Il tuo codice dovrebbe essere qualcosa di simile

 $username = $_POST['username']; $password = $_POST['password']; $query = "SELECT * FROM Users WHERE UserName LIKE '$username'"; echo $query; $result = mysql_query($query); if($result === FALSE) { die(mysql_error("error message for the user")); } while($row = mysql_fetch_array($result)) { echo $row['FirstName']; } 

Una volta fatto, otterresti la query stampata sullo schermo. Prova questa query sul tuo server e verifica se produce i risultati desiderati. La maggior parte delle volte l’errore è nella query. Il resto del codice è corretto.

 $result = mysql_query('SELECT * FROM Users WHERE UserName LIKE $username'); 

Si definisce la stringa usando le virgolette singole e PHP non analizza le stringhe delimitate da virgolette singole. Per ottenere l’interpolazione variabile è necessario utilizzare le virgolette doppie o la concatenazione di stringhe (o una combinazione di). Vedi http://php.net/manual/en/language.types.string.php per ulteriori informazioni.

Inoltre dovresti controllare che mysql_query abbia restituito una risorsa di risultato valida, altrimenti fetch_ *, num_rows, ecc non funzioneranno sul risultato in quanto non è un risultato! IE:

 $username = $_POST['username']; $password = $_POST['password']; $result = mysql_query('SELECT * FROM Users WHERE UserName LIKE $username'); if( $result === FALSE ) { trigger_error('Query failed returning error: '. mysql_error(),E_USER_ERROR); } else { while( $row = mysql_fetch_array($result) ) { echo $row['username']; } } 

http://us.php.net/manual/en/function.mysql-query.php per ulteriori informazioni.

Questa query dovrebbe funzionare:

 $result = mysql_query("SELECT * FROM Users WHERE UserName LIKE '%$username%'"); while($row = mysql_fetch_array($result)) { echo $row['FirstName']; } 

Il problema sono le virgolette singole, quindi la tua query fallisce e restituisce FALSE e il tuo ciclo WHILE non può essere eseguito. L’utilizzo di% ti consente di confrontare qualsiasi risultato contenente la tua stringa (come SomeText- $ username-SomeText).

Questa è semplicemente una risposta alla tua domanda, dovresti implementare le cose menzionate negli altri post: gestione degli errori, usare le stringhe di escape (gli utenti possono digitare qualsiasi cosa nel campo, e devi assicurarti che non sia un codice arbitrario), usare PDO invece mysql_connect che ora è privato.

 $username = $_POST['username']; $password = $_POST['password']; $result = mysql_query("SELECT * FROM Users WHERE UserName LIKE '%$username%'") or die(mysql_error()); while($row = mysql_fetch_array($result)) { echo $row['FirstName']; } 

A volte sopprimendo la query come @mysql_query(your query);

Se hai provato tutto qui, e non funziona, potresti voler controllare le tue regole di confronto del database MySQL. Il mio è stato impostato per una collazione svedese. Poi l’ho cambiato in utf8_general_ci e tutto è appena scattato.

Spero che questo aiuti qualcuno.

 $query = "SELECT Name,Mobile,Website,Rating FROM grand_table order by 4"; while( $data = mysql_fetch_array($query)) { echo("$data[0]$data[1]$data[2]$data[3]"); } 

Invece di utilizzare una query WHERE, puoi utilizzare questa query ORDER BY. È molto meglio di questo per l’uso di una query.

Ho fatto questa domanda e sto ricevendo errori come parametro o booleano.

Prova questo, deve funzionare, altrimenti devi stampare l’errore per specificare il tuo problema

 $username = $_POST['username']; $password = $_POST['password']; $sql = "SELECT * from Users WHERE UserName LIKE '$username'"; $result = mysql_query($sql,$con); while($row = mysql_fetch_array($result)) { echo $row['FirstName']; } 

Prova il seguente codice. Potrebbe funzionare bene.

 $username = $_POST['username']; $password = $_POST['password']; $result = mysql_query("SELECT * FROM Users WHERE UserName ='$username'"); while($row = mysql_fetch_array($result)) { echo $row['FirstName']; } 

Ci potrebbero essere due ragioni:

  1. Hai aperto la connessione al database prima di chiamare la funzione mysql_query? Non lo vedo nel tuo codice. Utilizzare mysql_connect prima di effettuare la query. Vedi php.net/manual/en/function.mysql-connect.php

  2. La variabile $ username viene utilizzata all’interno di una singola stringa di quotazione, quindi il suo valore non verrà valutato all’interno della query. La query fallirà sicuramente.

In terzo luogo, la struttura della query è soggetta all’iniezione SQL . È ansible utilizzare dichiarazioni preparate per evitare questa minaccia alla sicurezza.

Vai al tuo config.php . Ho avuto lo stesso problema. Verifica lo username e la password, e anche sql select è lo stesso nome della config.

 < ?php $username = $_POST['username']; $password = $_POST['password']; $result = mysql_query("SELECT * FROM Users WHERE UserName LIKE '".$username."'"); while($row = mysql_fetch_array($result)) { echo $row['FirstName']; } ?> 

E se c’è un utente con un nome utente univoco, puoi usare “=” per quello. Non c’è bisogno di piacere.

La tua richiesta sarà:

 mysql_query("SELECT * FROM Users WHERE UserName ='".$username."'"); 

Includere una variabile di stringa di connessione prima della query MySQL. Ad esempio, $connt in questo codice:

 $results = mysql_query($connt, "SELECT * FROM users"); 

Non usare la funzione privata mysql_ * (depredata in php 5.5 verrà rimossa in php 7). e puoi farlo con mysqli o pdo

ecco la query di selezione completa

 < ?php $servername = "localhost"; $username = "username"; $password = "password"; $dbname = "myDB"; // Create connection $conn = new mysqli($servername, $username, $password, $dbname); // Check connection if ($conn->connect_error) { die("Connection failed: " . $conn->connect_error); } $sql = "SELECT id, firstname, lastname FROM MyGuests"; $result = $conn->query($sql); if ($result->num_rows > 0) { // output data of each row while($row = $result->fetch_assoc()) { // code here } } else { echo "0 results"; } $conn->close(); ?> 

Prova questo

 $username = $_POST['username']; $password = $_POST['password']; $result = mysqli_query('SELECT * FROM Users WHERE UserName LIKE $username'); if($result){ while($row = mysqli_fetch_array($result)) { echo $row['FirstName']; } } 

Innanzitutto, controlla la tua connessione al database. È collegato correttamente o no?

Se è fatto, dopo di che ho scritto questo codice, e funziona bene:

 if (isset($_GET['q1mrks']) && isset($_GET['marks']) && isset($_GET['qt1'])) { $Q1mrks = $_GET['q1mrks']; $marks = $_GET['marks']; $qt1 = $_GET['qt1']; $qtype_qry = mysql_query(" SELECT * FROM s_questiontypes WHERE quetype_id = '$qt1' "); $row = mysql_fetch_assoc($qtype_qry); $qcode = $row['quetype_code']; $sq_qry = " SELECT * FROM s_question WHERE quetype_code = '$qcode' ORDER BY RAND() LIMIT $Q1mrks "; $sq_qry = mysql_query(" SELECT * FROM s_question WHERE quetype_code = '$qcode' LIMIT $Q1mrks "); while ($qrow = mysql_fetch_array($sq_qry)) { $qm = $qrow['marks'] . "
"; $total += $qm . "
"; } echo $total . "/" . $marks; }
 < ?php $username = $_POST['username']; $password = $_POST['password']; $result = mysql_query("SELECT * FROM Users WHERE UserName LIKE '".mysql_real_escape_string($username)."'")or die(mysql_error()); while($row=mysql_fetch_array($result)) { echo $row['FirstName']; } ?> 

Ogni volta che ottieni il …

“Attenzione: mysqli_fetch_object () si aspetta che il parametro 1 sia mysqli_result, booleano dato”

… è probabile perché c’è un problema con la tua query. Il prepare() o query() potrebbe restituire FALSE (un booleano), ma questo messaggio di errore generico non ti lascia molto in termini di indizi. Come scopri cosa c’è di sbagliato nella tua domanda? Chiedi !

Prima di tutto, assicurati che la segnalazione degli errori sia triggersta e visibile: aggiungi queste due righe all’inizio dei tuoi file subito dopo il tag < ?php apertura:

 error_reporting(E_ALL); ini_set('display_errors', 1); 

Se la segnalazione degli errori è stata impostata nel file php.ini, non dovrai preoccuparti di questo. Assicurati di gestire gli errori con garbo e non rivelare mai la vera causa di problemi ai tuoi utenti. Rivelare la vera causa al pubblico può essere un invito inciso in oro per coloro che vogliono danneggiare i tuoi siti e server. Se non si desidera inviare errori al browser, è sempre ansible monitorare i registri degli errori del server Web. Le posizioni dei registri variano da server a server, ad esempio, su Ubuntu il registro degli errori si trova in genere in /var/log/apache2/error.log . Se stai esaminando i log degli errori in un ambiente Linux, puoi usare tail -f /path/to/log in una finestra della console per vedere gli errori mentre si verificano in tempo reale .... o mentre li crei.

Una volta che sei in linea con la segnalazione di errori standard aggiungendo il controllo degli errori sulla tua connessione al database e le query ti forniranno molti più dettagli sui problemi in corso. Dai un'occhiata a questo esempio in cui il nome della colonna non è corretto. Innanzitutto, il codice che restituisce il messaggio di errore irreversibile generico:

 $sql = "SELECT `foo` FROM `weird_words` WHERE `definition` = ?"; $query = $mysqli->prepare($sql)); // assuming $mysqli is the connection $query->bind_param('s', $definition); $query->execute(); 

L'errore è generico e non è molto utile per te nel risolvere ciò che sta accadendo.

Con un paio di altre righe di codice è ansible ottenere informazioni molto dettagliate che è ansible utilizzare per risolvere immediatamente il problema. Controlla la dichiarazione di prepare() per verità e se è buona puoi procedere al binding e all'esecuzione.

 $sql = "SELECT `foo` FROM `weird_words` WHERE `definition` = ?"; if($query = $mysqli->prepare($sql)) { // assuming $mysqli is the connection $query->bind_param('s', $definition); $query->execute(); // any additional code you need would go here. } else { $error = $mysqli->errno . ' ' . $mysqli->error; echo $error; // 1054 Unknown column 'foo' in 'field list' } 

Se qualcosa non va, puoi sputare un messaggio di errore che ti porta direttamente al problema. In questo caso non c'è nessuna colonna foo nella tabella, la risoluzione del problema è banale.

Se si sceglie, è ansible includere questo controllo in una funzione o class ed estenderlo gestendo gli errori con garbo come accennato in precedenza.

Assicurarsi di non chiudere il database utilizzando db_close () prima di eseguire la query:

Se stai utilizzando più query in uno script, anche se includi altre pagine che contengono query o connessione al database, allora potrebbe essere ansible che in qualsiasi posto tu usi db_close () che chiuda la connessione al database, quindi assicurati di essere non fare questo errore nei tuoi script.

Controlla prima la tua connessione.

Quindi se si desidera recuperare il valore esatto dal database, è necessario scrivere:

 $username = $_POST['username']; $password = $_POST['password']; $result = mysql_query("SELECT * FROM Users WHERE UserName =`$usernam`"); 

O vuoi recuperare il tipo di valore LIKE , quindi dovresti scrivere:

 $result = mysql_query("SELECT * FROM Users WHERE UserName LIKE '%$username%'"); 

Se non si hanno errori di MySQL durante il controllo, assicurarsi di aver creato correttamente la tabella del database. Questo è successo a me. Cerca eventuali virgole o virgolette indesiderate.

Puoi anche controllare se $result sta fallendo in questo modo, prima di eseguire l’array fetch

 $username = $_POST['username']; $password = $_POST['password']; $result = mysql_query('SELECT * FROM Users WHERE UserName LIKE $username'); if(!$result) { echo "error executing query: "+mysql_error(); }else{ while($row = mysql_fetch_array($result)) { echo $row['FirstName']; } } 

Puoi provare questo codice. L’ho trovato prima quando ho riscontrato un problema simile al tuo.

 if (isset($_GET['q1mrks']) && isset($_GET['marks']) && isset($_GET['qt1'])) { $Q1mrks = $_GET['q1mrks']; $marks = $_GET['marks']; $qt1 = $_GET['qt1']; $qtype_qry = mysql_query(" SELECT * FROM s_questiontypes WHERE quetype_id = '$qt1' "); $row = mysql_fetch_assoc($qtype_qry); $qcode = $row['quetype_code']; $sq_qry = " SELECT * FROM s_question WHERE quetype_code = '$qcode' ORDER BY RAND() LIMIT $Q1mrks "; $sq_qry = mysql_query(" SELECT * FROM s_question WHERE quetype_code = '$qcode' LIMIT $Q1mrks "); while ($qrow = mysql_fetch_array($sq_qry)) { $qm = $qrow['marks'] . "
"; $total += $qm . "
"; } echo $total . "/" . $marks; }

Di solito si verifica un errore quando la conectivity del database fallisce, quindi assicurati di connettere il tuo database o di includere il file del database.

 include_once(db_connetc.php'); 

O

 // Create a connection $connection = mysql_connect("localhost", "root", "") or die(mysql_error()); //Select database mysql_select_db("db_name", $connection) or die(mysql_error()); $employee_query = "SELECT * FROM employee WHERE `id` ='".$_POST['id']."'; $employee_data = mysql_query($employee_query); if (mysql_num_rows($employee_data) > 0) { while ($row = mysql_fetch_array($employee_data)){ echo $row['emp_name']; } // end of while loop } // end of if 
  • È consigliabile eseguire la query in sqlyog e copiarla nel codice della pagina.
  • Memorizza sempre la tua query in una variabile e poi echo quella variabile. Quindi passare a mysql_query($query_variable); .

Prova questo codice funziona bene

assegna la variabile post alla variabile

  $username = $_POST['uname']; $password = $_POST['pass']; $result = mysql_query('SELECT * FROM userData WHERE UserName LIKE $username'); if(!empty($result)){ while($row = mysql_fetch_array($result)){ echo $row['FirstName']; } }