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


960

Sto provando a selezionare i dati da una tabella MySQL, ma ricevo uno dei seguenti messaggi di errore:

mysql_fetch_array () prevede che il parametro 1 sia una risorsa, dato booleano

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'];
}

15
puoi ottenere eroor msg più utili usando :: QUERY o die (mysql_error ());
nik,

123
Anche la nota obbligatoria: il tuo codice è soggetto all'iniezione SQL . È necessario convalidare e / o evitare l'input dell'utente. Dai un'occhiata mysql_real_escape_string. Non fidarti mai dei dati dell'utente.
Felix Kling

7
In realtà, il codice del PO causerà un errore di sintassi sul server MySQL, ma almeno è non vulnerabili a SQL Injection, perché le virgolette singole non ha l'interpolazione variabile.
szgal

4
@FelixKling Mi rendo conto che questo è molto vecchio, e probabilmente il più preciso possibile al momento, ma il tuo commento è ora pericolosamente sbagliato in un modo: mysql_real_escape_stringnon è il tutto e la fine della protezione dell'iniezione SQL; è ancora vulnerabile a numerosi attacchi. (No, non hai mai detto che è perfetto, ma hai insinuato che era l'unica soluzione richiesta) La soluzione migliore ora è DOP, per quanto ne so.
Fondi Monica's Lawsuit,

2
Gah. L'estensione di questa domanda per includere MySQLi e DOP è stata una cattiva idea. Ognuno di essi ha una propria sintassi e messaggi di errore leggermente diversi e potrebbe perfettamente avere le proprie domande. Combinare tutto in una gigantesca domanda in tre parti rende questo meno Googleable e costringe le persone che arrivano qui a guadare attraverso contenuti irrilevanti per arrivare a ciò che vogliono. Ha anche invalidato molte delle risposte di seguito e rende questa domanda "troppo ampia" per gli standard che normalmente applichiamo. È un disastro, secondo me, ma è troppo tardi per risolvere il problema ora.
Mark Amery,

Risposte:


667

Una query potrebbe non riuscire per vari motivi, nel qual caso sia l'estensione mysql_ * che mysqli torneranno falsedalle rispettive funzioni / metodi di query. È necessario verificare tale condizione di errore e gestirla di conseguenza.

estensione mysql_ * :

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

Controlla $resultprima di passarlo a mysql_fetch_array. Scoprirai falseperché la query non è riuscita. Consultare la mysql_querydocumentazione 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'];
}


stile procedurale estensione mysqli :

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

stile oo :

$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 si dovrebbe fare (gestione degli errori), non come farlo. Il codice di produzione non dovrebbe essere utilizzato or diequando si genera l'HTML, altrimenti genererà (almeno) HTML non valido. Inoltre, i messaggi di errore del database non devono essere visualizzati agli utenti non amministratori, poiché rivelano troppe informazioni .


9
Giusto, ma usare un die () se la query fallisce è un po 'troppo.
2ndkauboy,

28
Stavo progettando un intero meccanismo di gestione degli errori per il PO, ma ho deciso che potrebbe andare oltre lo scopo della mia risposta.
Edward Dale,

@ scompt.com Sì, è anche coperto da molte altre risposte. Immagino stavo solo sottolineando che, poiché questa è la risposta accettata su una domanda ad alta visibilità, oltre ai consigli (eccellenti) su come rilevare correttamente gli errori in futuro, dovrebbe (IMHO) effettivamente rispondere alla domanda specifica (ad es. spiegare perché c'è un errore in questo caso).
Sepster,

2
Invece di if($result === FALSE)te puoi usare if(! $result). Correggimi se sbaglio
anestv

1
mysql_query (): l'estensione mysql è obsoleta e verrà rimossa in futuro: usa mysqli
Greg il

165

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

  • mysql_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 query è interessata dalla query. Solo una query con una sintassi non valida genererà questo errore.

Passaggi per la risoluzione dei problemi

  • Assicurarsi che il server di sviluppo sia configurato per visualizzare tutti gli errori. È possibile farlo mettendo questo in cima i file o nel file di configurazione: error_reporting(-1);. Se si verificano errori di sintassi, questo verrà indicato a voi.

  • Usa mysql_error(). mysql_error()segnalerà eventuali errori riscontrati 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 di MySQL o da uno strumento come phpMyAdmin . Se hai un errore di sintassi nella tua query, questo ti dirà di cosa si tratta.

  • Assicurati che le tue citazioni siano corrette. Una citazione mancante attorno alla query o un valore può causare l'interruzione di una query.

  • Assicurati di sfuggire ai tuoi valori. Le virgolette nella tua query possono causare l'interruzione della query (e anche lasciarti aperto alle iniezioni di SQL). Utilizzare mysql_real_escape_string()per sfuggire al proprio input.

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

Altri consigli

mysql_*le funzioni non devono essere utilizzate per il nuovo codice. Non vengono più mantenuti e la comunità ha avviato il processo di ammortamento . Invece dovresti conoscere le dichiarazioni preparate e usare PDO o MySQLi . Se non riesci a decidere, questo articolo ti aiuterà a scegliere. Se ti interessa imparare, ecco un buon tutorial per DOP .


1
Data questa domanda oggi stackoverflow.com/q/43804651/1415724 e altri simili di recente; Penso che valga la pena aggiornare la tua risposta per contenere qualcosa del tipo "Quell'errore può anche essere causato dal non eseguire la query con mysql_query()/ mysqli_query($connection)ecc." ; pensieri? Dal momento che nessun'altra risposta in questo Q&A menziona questo.
Funk Forty Niner

111

Qui si è verificato un errore 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_stringper 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 successive), ma per le versioni precedenti mysql_real_escape_stringfarà il trucco.


5
Perché aggiungere rumore con la concatenazione di stringhe anziché semplicemente inserire la variabile nella stringa di query?
Matteo Riva,

1
@Matteo Riva Sì, ma ho pensato che questo fosse un modo poco più pulito di separare le variabili dalla stringa. :)
nik,

60

Come spiegato da scompt.com , la query potrebbe non riuscire. Utilizzare 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 documentazionemysql_query() per ulteriori informazioni.

L'errore reale era le virgolette singole in modo che la variabile $usernamenon fosse analizzata. Ma dovresti davvero usare mysql_real_escape_string($username)per evitare iniezioni di SQL.


52

Metti tra virgolette $username. I valori di stringa, a differenza dei valori numerici, devono essere racchiusi tra virgolette.

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

Inoltre, non ha senso utilizzare la LIKEcondizione se non si utilizzano i caratteri jolly: se è necessaria una corrispondenza esatta, utilizzare =invece di LIKE.


1
E se $ username fosse: "'; DROP TABLES;" ? Questo è il vantaggio dell'utilizzo di istruzioni preparate e valori associati, che penso che l'interlocutore vorrebbe conservare.
HoldOffHunger

42

Controllare una volta che il database selezionato non lo è 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());

40

Il tuo codice dovrebbe essere qualcosa del genere

$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 vedi se produce i risultati desiderati. Il più delle volte l'errore è nella query. Il resto del codice è corretto.


3
Non utilizzare questo codice. È aperto agli attacchi di iniezione SQL.
Brad,

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

Definisci la stringa usando virgolette singole e PHP non analizza stringhe delimitate da virgolette singole. Per ottenere l'interpolazione variabile dovrai usare virgolette doppie o concatenazione di stringhe (o una loro combinazione). Vedi http://php.net/manual/en/language.types.string.php per maggiori informazioni.

Inoltre, dovresti verificare 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.


2
Non utilizzare questo codice, anche se aggiungi virgolette. È aperto agli attacchi di iniezione SQL.
Brad,

33

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'uso di% ti consente di abbinare 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 stringhe di escape (gli utenti possono digitare qualsiasi cosa nel campo e DEVI assicurarti che non sia un codice arbitrario), usa PDO invece mysql_connect che ora è deprecato.


28
$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);


2
Non utilizzare questo codice. È aperto agli attacchi di iniezione SQL.
Brad,

27

Se hai provato tutto qui e non funziona, potresti voler controllare le regole di confronto del database MySQL. Il mio era destinato a una collazione svedese. Poi l'ho cambiato utf8_general_cie tutto è appena scattato in marcia.


25
$query = "SELECT Name,Mobile,Website,Rating FROM grand_table order by 4";

while( $data = mysql_fetch_array($query))
{
    echo("<tr><td>$data[0]</td><td>$data[1]</td><td>$data[2]</td><td>$data[3]</td></tr>");      
}

Invece di utilizzare una query WHERE, è possibile utilizzare questa query ORDER BY. È molto meglio di questo per l'uso di una query.

Ho fatto questa query e non ricevo errori come parametro o booleano.


Ricordarsi di utilizzare htmlspecialchars()quando si utilizzano dati arbitrari nel contesto di HTML. Altrimenti, rischi di creare un codice HTML valido quando vengono utilizzati caratteri riservati nei dati.
Brad,

25

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'];
}

8
1) Spalancata all'iniezione SQL, 2) non include la gestione degli errori che causa l'errore nel caso di OP.
ingannare

+1. @deceze Sì, è completamente aperto. Ma non più che il codice OP o il codice del risponditore accettato ;-) E non è la mancanza di gestione degli errori nel codice OP che causa l'errore ... è l'errore , e questa risposta almeno cerca di risolverlo (mettendo single virgolette attorno alla stringa letterale LIKEnell'espressione).
Sepster,

1
+1 Aggiungi uno spazio tra LIKE e '$ username', il resto sembra andare bene tranne l'iniezione SQL. Perché non usare = invece di LIKE il nome utente dell'operatore deve corrispondere esattamente
asim-ishaq

21

Potrebbero esserci due motivi:

  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. Vederephp.net/manual/en/function.mysql-connect.php

  2. La variabile $ username viene utilizzata all'interno di una singola stringa di virgolette, 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 . È possibile utilizzare dichiarazioni preparate per evitare questa minaccia alla sicurezza.


20

Prova il seguente codice. Potrebbe funzionare benissimo.

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

while($row = mysql_fetch_array($result))
{
    echo $row['FirstName'];
}

4
Questo codice è soggetto all'iniezione SQL e non deve essere utilizzato.
Brad,

15

Vai al tuo config.php. Ho avuto lo stesso problema. Verifica il nome utente e la password e anche sql select ha lo stesso nome della configurazione.


15

Non usare la funzione deprivata mysql_ * (la privazione 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();
?>

Il tuo post non affronta i problemi risolti dalla domanda, che sono una query non valida e una segnalazione errata degli errori. Questo post è fuori tema.
Paul Spiegel,

14
<?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 esiste 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."'");

3
Questo codice è aperto all'iniezione SQL e non deve essere utilizzato.
Brad,

@AnujGarg Questo codice accetta l'input diretto e lo concatena nella query. Qualcuno potrebbe scrivere il proprio SQL nei dati post per usernamee verrà eseguito.
Brad

Quindi cosa usare per impedire il codice dall'iniezione SQL?
Anuj Garg,

14

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

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

1
Questo non risolve i problemi della domanda. È anche sbagliato e genererebbe un altro errore.
Paul Spiegel,

12

Ogni volta che ottieni ...

"Avviso: mysqli_fetch_object () prevede che il parametro 1 sia mysqli_result, dato booleano"

... è probabile che ci sia 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 non va nella tua query? Tu chiedi !

Prima di tutto, assicurati che la segnalazione degli errori sia attiva e visibile: aggiungi queste due righe nella parte superiore dei tuoi file subito dopo il <?phptag di apertura :

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

Se la segnalazione degli errori è stata impostata in php.ini, non dovrai preoccuparti di questo. Assicurati solo di gestire gli errori con garbo e di non rivelare mai la vera causa di eventuali 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 possibile monitorare i log degli errori del server Web. Le posizioni dei registri variano da server a server, ad es. Su Ubuntu il registro degli errori si trova in genere /var/log/apache2/error.log. Se stai esaminando i log degli errori in un ambiente Linux, puoi usarli tail -f /path/to/login una finestra della console per vedere gli errori che si verificano in tempo reale .... o mentre li fai.

Una volta che sei al quadrato sulla segnalazione degli errori standard, l'aggiunta del controllo degli errori sulla connessione al database e le query ti forniranno molti più dettagli sui problemi che si verificano. 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 risolvere ciò che sta succedendo.

Con un paio di più righe di codice è possibile ottenere informazioni molto dettagliate che è possibile utilizzare per risolvere immediatamente il problema . Controlla l' prepare()affermazione per la verità e se è buona puoi procedere con l'associazione e l'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; // 1054 Unknown column 'foo' in 'field list'
    // handle error
}

Se qualcosa non va, puoi emettere un messaggio di errore che ti porta direttamente al problema. In questo caso, non c'è foocolonna nella tabella, la soluzione del problema è banale.

Se si sceglie, è possibile includere questo controllo in una funzione o in una classe ed estenderlo gestendo gli errori con garbo, come menzionato in precedenza.


2
Come puoi scrivere "Assicurati solo di gestire gli errori con garbo e di non rivelare mai la vera causa di eventuali problemi ai tuoi utenti". e echo $error;in un post?
Paul Spiegel,

Grazie per l'informazione @PaulSpiegel. Era da un po 'che non scrivevo o rivisitavo la risposta e mi mancava che avevo lasciato l'eco lì dentro.
Jay Blanchard,

11
<?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'];
 }
 ?>

11

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'];
}
}

4
@panjehra mysql_ * è deprecato ora e verrà rimosso da php 7. Usa invece mysqli_ *
Manoj Kumar

9

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

Se è fatto, allora 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'] . "<br />";
        $total += $qm . "<br />";
    }
    echo $total . "/" . $marks;
}

2
Non utilizzare questo codice. È aperto agli attacchi di iniezione SQL.
Brad,

9

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

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


8

Se non si verifica alcun errore MySQL durante il controllo, assicurarsi di aver creato correttamente la tabella del database. Questo mi è successo. Cerca virgole o virgolette indesiderate.


7

Controlla prima la 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 LIKEtipo di valore, allora dovresti scrivere:

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

3
Questo codice è aperto all'iniezione SQL e non deve essere utilizzato.
Brad,

6

È inoltre possibile verificare se $resultnon funziona in questo modo, prima di eseguire l'array di recupero

$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'];
       }
}

3
Non utilizzare questo codice. È aperto agli attacchi di iniezione SQL.
Brad,

Ma se il codice funziona, penso che dovresti modificare il codice e inserire i filtri necessari invece di castigare il codice.
user28864

L'uso semplice dei filtri non risolverà ciò che è sbagliato in questo codice. La soluzione migliore è utilizzare query preparate / parametrizzate con DOP o simili. Non vedo alcun motivo per risolverlo, poiché la risposta corretta è già stata pubblicata qui. Idealmente, questa risposta verrà eliminata. Tuttavia, sei il benvenuto per correggere la tua risposta e io la voterò felicemente se è corretta.
Brad,

Bene, se ritieni che la risposta non valga la pena, puoi andare avanti e leggerla. Tuttavia, ho pensato che il punto centrale di questa comunità fosse condividere e contribuire alla conoscenza. Se hai qualcosa da condividere invece di mostrare e scoraggiare le persone.
user28864

2
Hai ragione, il punto centrale di questa comunità è condividere la conoscenza. Ecco perché ho aggiunto una spiegazione con il mio downvote e spiegato ulteriormente perché il tuo suggerimento sul filtro non era sufficiente. Preferirei di gran lunga avvisarti, insieme a chiunque trovi la tua risposta, che il codice sopra riportato non è sicuro. È meglio per tutti imparare i metodi corretti piuttosto che perpetuare il codice errato. E non posso cancellare la tua risposta, né lo farei io. Dipende da te se decidi di farlo.
Brad,

4

Di solito si verifica un errore quando la connettività del database non riesce, quindi assicurarsi di connettere il 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 quindi copiarla nel codice della pagina.
  • Memorizza sempre la tua query in una variabile e fai eco a quella variabile. Quindi passa a mysql_query($query_variable);.

2
1) Non sai se ho o non ho votato su nessuna risposta qui, su o giù. 2) Come ho spiegato nel mio primo commento; la tua risposta non fa riferimento al problema ( booleano passato a mysql_fetch_array ) e hai errori di sintassi
Phil

2
Hai virgolette errate in entrambi i tuoi esempi di codice. L'evidenziazione della sintassi applicata al tuo secondo blocco di codice è una vera e propria donazione che qualcosa non va
Phil

4
Questo codice è soggetto all'iniezione SQL e non deve essere utilizzato. @EngrZardari se stai usando questo codice sui tuoi sistemi di produzione, sei stato senza dubbio hackerato e dovresti porre rimedio alla situazione acquistando usando query preparate / parametrizzate con PDO o simili. Ci sono robot che hanno test automatici per tali vulnerabilità.
Brad,

1
@EngrZardari Informazioni sul tuo "non c'è alcun errore, ho incollato qui il codice che sto attualmente utilizzando." commento sopra. C'era una citazione mancante nella query che ho corretto. Ciò avrebbe generato un errore di analisi (PHP).
Funk Forty Niner

2

Prova questo codice funziona bene

assegnare 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'];
     }
}

3
Questo codice è soggetto ad attacchi di iniezione SQL e non deve essere utilizzato.
Brad,

1

poiché $ username è una variabile php, dobbiamo passarla come stringa a mysqli, quindi poiché nella query hai iniziato con una singola virgoletta useremo la doppia virgoletta, la virgoletta singola e un fullstop ai fini della concaturazione ("'. $ username. '") se hai iniziato con una doppia virgoletta, invertiresti le virgolette ('". $ username. "').

$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'];
     }

$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'];
     }

ma l'uso di Mysql si è deprezzato molto, usare DOP invece è semplice ma molto sicuro


Ma l'uso di Mysql è deprezzato. puoi invece usare DOP. Lascia che ti dia un login di esempio.
Dennis Kiptugen,

2
Le password non devono MAI MAI essere archiviate in forma di testo semplice, utilizzare le funzioni incorporate di PHP per gestire l'hash delle password e la verifica delle password con hash!
SpacePhoenix,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.