mysql_fetch_array () / mysql_fetch_assoc () / mysql_fetch_row () / mysql_num_rows etc… s'attend à ce que le paramètre 1 soit une ressource


960

J'essaie de sélectionner des données dans une table MySQL, mais j'obtiens l'un des messages d'erreur suivants:

mysql_fetch_array () s'attend à ce que le paramètre 1 soit une ressource, booléen étant donné

Voici mon code:

$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
vous pouvez obtenir un msg eroor plus utile en utilisant :: QUERY ou die (mysql_error ());
nik

123
Aussi la note obligatoire: Votre code est sujet à l' injection SQL . Vous devez valider et / ou échapper l'entrée utilisateur. Jetez un oeil à mysql_real_escape_string. Ne faites jamais confiance aux données utilisateur.
Felix Kling

7
En fait, le code de l'OP provoquera une erreur de syntaxe sur le serveur MySQL, mais au moins il n'est pas vulnérable à l'injection SQL car les guillemets simples n'ont pas d'interpolation variable.
szgal

4
@FelixKling Je me rends compte que c'est très ancien, et probablement le plus précis possible à l'époque, mais votre commentaire est maintenant dangereusement faux dans un sens: ce mysql_real_escape_stringn'est pas le tout et la fin de la protection par injection SQL; il est toujours vulnérable à un certain nombre d'attaques. (Non, vous n'avez jamais dit que c'était parfait, mais vous avez laissé entendre que c'était la seule solution requise) La meilleure solution est maintenant AOP, à ma connaissance.
Fund Monica's Lawsuit

2
Gah. Étendre cette question pour inclure MySQLi et PDO était une mauvaise idée. Ils ont chacun leur propre syntaxe et messages d'erreur légèrement différents et ils auraient parfaitement pu avoir leurs propres questions. Tout combiner en une seule question géante en trois parties rend cela moins googleable et oblige les personnes qui arrivent ici à parcourir un contenu non pertinent pour arriver à ce qu'elles veulent. Il a également invalidé un grand nombre des réponses ci-dessous, et rend cette question "trop ​​large" selon les normes que nous appliquons normalement. C'est un gâchis, à mon avis, mais il est trop tard pour y remédier maintenant.
Mark Amery du

Réponses:


667

Une requête peut échouer pour diverses raisons, auquel cas à la fois mysql_ * et l'extension mysqli reviendront falsede leurs fonctions / méthodes de requête respectives. Vous devez tester cette condition d'erreur et la gérer en conséquence.

extension mysql_ * :

NOTE Les fonctions mysql_ sont obsolètes et ont été supprimées dans php version 7.

Vérifiez $resultavant de le passer à mysql_fetch_array. Vous constaterez que c'est falseparce que la requête a échoué. Consultez la mysql_querydocumentation pour les valeurs de retour possibles et des suggestions sur la façon de les traiter.

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


Style procédural de l' extension 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 ) {
        ...

oo-style :

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

en utilisant une déclaration préparée:

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

Ces exemples illustrent uniquement ce qui doit être fait (gestion des erreurs), pas comment le faire. Le code de production ne doit pas être utilisé or dielors de la sortie HTML, sinon il générera (au moins) du HTML non valide. De plus, les messages d'erreur de base de données ne doivent pas être affichés aux utilisateurs non administrateurs, car ils divulguent trop d'informations .


9
C'est vrai, mais utiliser un die () si la requête échoue est un peu trop.
2ndkauboy

28
J'allais concevoir un mécanisme complet de gestion des erreurs pour l'OP, mais j'ai décidé que cela pourrait dépasser la portée de ma réponse.
Edward Dale

@ scompt.com Oui, il est également couvert par plusieurs autres réponses. Je suppose que je faisais simplement remarquer que, puisqu'il s'agit de la réponse acceptée à une question à haute visibilité, en plus des (excellents) conseils sur la façon de détecter correctement les erreurs à l'avenir, il devrait (à mon humble avis) effectivement répondre à la question spécifique (c.-à-d. expliquer pourquoi il y a une erreur dans ce cas).
Sepster

2
Au lieu de if($result === FALSE)vous pouvez utiliser if(! $result). Corrigez-moi si je me trompe
anestv

1
mysql_query (): L'extension mysql est obsolète et sera supprimée à l'avenir: utilisez mysqli
Greg

165

Ce message d'erreur s'affiche lorsque vous avez une erreur dans votre requête qui a provoqué son échec. Il se manifestera lors de l'utilisation:

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

Remarque : cette erreur n'apparaît pas si aucune ligne n'est affectée par votre requête. Seule une requête avec une syntaxe non valide générera cette erreur.

Étapes de dépannage

  • Assurez-vous que votre serveur de développement est configuré pour afficher toutes les erreurs. Vous pouvez le faire en plaçant ce en haut de vos fichiers ou dans votre fichier de configuration: error_reporting(-1);. Si vous avez des erreurs de syntaxe, cela vous les signalera.

  • Utilisez mysql_error(). mysql_error()rapportera toute erreur rencontrée par MySQL lors de l'exécution de votre requête.

    Exemple d'utilisation:

    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();
    }
  • Exécutez votre requête à partir de la ligne de commande MySQL ou d'un outil comme phpMyAdmin . Si vous avez une erreur de syntaxe dans votre requête, cela vous dira de quoi il s'agit.

  • Assurez-vous que vos devis sont corrects. Une citation manquante autour de la requête ou d'une valeur peut entraîner l'échec d'une requête.

  • Assurez-vous que vous échappez à vos valeurs. Les citations de votre requête peuvent entraîner l'échec d'une requête (et vous laisser également ouvert aux injections SQL). Utilisez mysql_real_escape_string()pour échapper à votre saisie.

  • Assurez-vous que vous ne mixez pas mysqli_*et ne mysql_*fonctionne pas. Ils ne sont pas la même chose et ne peuvent être utilisés ensemble. (Si vous choisissez l'un ou l'autre bâton avec mysqli_*. Voir ci-dessous pourquoi.)

Autres astuces

mysql_*les fonctions ne doivent pas être utilisées pour le nouveau code. Ils ne sont plus entretenus et la communauté a entamé le processus de dépréciation . Au lieu de cela, vous devez vous renseigner sur les instructions préparées et utiliser PDO ou MySQLi . Si vous ne pouvez pas décider, cet article vous aidera à choisir. Si vous voulez apprendre, voici un bon tutoriel AOP .


1
Compte tenu de cette question aujourd'hui stackoverflow.com/q/43804651/1415724 et d'autres similaires récemment; Je pense qu'il peut être utile de mettre à jour votre réponse pour contenir quelque chose comme "Cette erreur peut également être causée par la non-exécution de la requête avec mysql_query()/ mysqli_query($connection)etc." ; pensées? Puisqu'aucune autre réponse dans ce Q&R ne le mentionne.
Funk Forty Niner

111

Une erreur s'est produite ici était due à l'utilisation de guillemets simples ( '). Vous pouvez poser votre requête comme ceci:

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

Il utilise mysql_real_escape_stringpour la prévention de l'injection SQL. Bien que nous devrions utiliser l'extension MySQLi ou PDO_MYSQL pour la version mise à niveau de PHP (PHP 5.5.0 et versions ultérieures), mais pour les versions plus anciennes, mysql_real_escape_stringcela fera l'affaire.


5
Pourquoi ajouter du bruit avec la concaténation de chaînes au lieu de simplement mettre la variable dans la chaîne de requête?
Matteo Riva

1
@Matteo Riva Oui, mais je pensais que c'était un moyen peu plus propre de séparer les variables de la chaîne. :)
nik

60

Comme l' explique scompt.com , la requête peut échouer. Utilisez ce code pour obtenir l'erreur de la requête ou le résultat correct:

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

Consultez la documentationmysql_query() pour plus d'informations.

L'erreur réelle était les guillemets simples afin que la variable $usernamene soit pas analysée. Mais vous devez vraiment utiliser mysql_real_escape_string($username)pour éviter les injections SQL.


52

Mettez des citations autour $username. Les valeurs de chaîne, par opposition aux valeurs numériques, doivent être placées entre guillemets.

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

En outre, il est inutile d'utiliser la LIKEcondition si vous n'utilisez pas de caractères génériques: si vous avez besoin d'une correspondance exacte, utilisez =plutôt que LIKE.


2
Et si $ username est: "'; DROP TABLES;" ? C'est l'avantage d'utiliser des instructions préparées et des valeurs liées, que je pense que le demandeur aimerait conserver.
HoldOffHunger

42

Veuillez vérifier une fois que la base de données sélectionnée ne l'est pas car certaines fois la base de données n'est pas sélectionnée

Vérifier

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

avant la requête MySQL, puis passez à l'étape suivante

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

f($result === FALSE) {
    die(mysql_error());

40

Votre code devrait ressembler à ceci

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

Une fois cela fait, vous obtiendrez la requête imprimée à l'écran. Essayez cette requête sur votre serveur et voyez si elle produit les résultats souhaités. La plupart du temps, l'erreur se trouve dans la requête. Le reste du code est correct.


3
N'utilisez pas ce code. Il est largement ouvert aux attaques par injection SQL.
Brad

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

Vous définissez la chaîne à l'aide de guillemets simples et PHP n'analyse pas les chaînes délimitées par des guillemets simples. Afin d'obtenir une interpolation variable, vous devrez utiliser des guillemets doubles OU une concaténation de chaînes (ou une combinaison de celles-ci). Voir http://php.net/manual/en/language.types.string.php pour plus d'informations.

Vous devez également vérifier que mysql_query a renvoyé une ressource de résultat valide, sinon fetch_ *, num_rows, etc. ne fonctionnera pas sur le résultat car ce n'est pas un résultat! C'EST À DIRE:

$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 pour plus d'informations.


2
N'utilisez pas ce code, même si vous ajoutez des guillemets. Il est largement ouvert aux attaques par injection SQL.
Brad

33

Cette requête devrait fonctionner:

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

Le problème est les guillemets simples, donc votre requête échoue et retourne FALSE et votre boucle WHILE ne peut pas s'exécuter. L'utilisation de% vous permet de faire correspondre tous les résultats contenant votre chaîne (tels que SomeText- $ username-SomeText).

Ceci est simplement une réponse à votre question, vous devez implémenter les éléments mentionnés dans les autres articles: gestion des erreurs, utiliser des chaînes d'échappement (les utilisateurs peuvent taper n'importe quoi dans le champ, et vous DEVEZ vous assurer qu'il ne s'agit pas de code arbitraire), utiliser PDO à la place mysql_connect qui est maintenant privé.


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

Parfois, la suppression de la requête @mysql_query(your query);


3
N'utilisez pas ce code. Il est largement ouvert aux attaques par injection SQL.
Brad

27

Si vous avez tout essayé ici et que cela ne fonctionne pas, vous voudrez peut-être vérifier le classement de votre base de données MySQL. Le mien était destiné à une collation suédoise. Ensuite, je l'ai changé utf8_general_ciet tout s'est enclenché.


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>");      
}

Au lieu d'utiliser une requête WHERE, vous pouvez utiliser cette requête ORDER BY. C'est bien mieux que cela pour l'utilisation d'une requête.

J'ai fait cette requête et je n'obtiens aucune erreur comme un paramètre ou un booléen.


N'oubliez pas d'utiliser htmlspecialchars()lorsque vous utilisez des données arbitraires dans le contexte de HTML. Sinon, vous risquez de créer un code HTML valide lorsque des caractères réservés sont utilisés dans les données.
Brad

25

Essayez ceci, cela doit fonctionner, sinon vous devez imprimer l'erreur pour spécifier votre problème

$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) Ouvert à l'injection SQL, 2) n'inclut pas la gestion des erreurs qui provoque l'erreur dans le cas de l'OP.
décomposer

+1. @deceze Oui, il est grand ouvert. Mais ce n'est plus le cas pour l'OP ou le code du répondeur accepté ;-) Et ce n'est pas le manque de gestion des erreurs dans le code de l'OP qui cause l'erreur ... c'est l'erreur , et cette réponse tente au moins de résoudre cela (en mettant un seul guillemets autour du littéral de chaîne dans l' LIKEexpression).
Sepster

1
+1 Veuillez ajouter un espace entre LIKE et '$ username', le reste semble correct sauf l'injection SQL. Pourquoi ne pas utiliser = au lieu de l'opérateur LIKE, le nom d'utilisateur doit correspondre exactement
asim-ishaq

21

Il peut y avoir deux raisons:

  1. Avez-vous ouvert la connexion à la base de données avant d'appeler la fonction mysql_query? Je ne vois pas cela dans votre code. Utilisez mysql_connect avant de lancer la requête. Voirphp.net/manual/en/function.mysql-connect.php

  2. La variable $ username est utilisée dans une seule chaîne de guillemets, donc sa valeur ne sera pas évaluée dans la requête. La requête échouera définitivement.

Troisièmement, la structure de la requête est sujette à l' injection SQL . Vous pouvez utiliser des instructions préparées pour éviter cette menace de sécurité.


20

Essayez le code suivant. Cela peut très bien fonctionner.

$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
Ce code est soumis à l'injection SQL et ne doit pas être utilisé.
Brad

15

Allez à votre config.php. J'ai eu le même problème. Vérifiez le nom d'utilisateur et le mot de passe, et sql select est également le même nom que la configuration.


15

N'utilisez pas la fonction mysql_ * dépréciée (dépréciée en php 5.5 sera supprimée en php 7). et vous pouvez le faire avec mysqli ou pdo

voici la requête de sélection complète

<?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();
?>

Votre message ne traite pas des problèmes abordés par la question, qui sont une requête non valide et un rapport d'erreur incuficient. Ce post est hors sujet.
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'];
    }
?>

Et s'il y a un utilisateur avec un nom d'utilisateur unique, vous pouvez utiliser "=" pour cela. Il n'y a pas besoin d'aimer.

Votre requête sera:

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

3
Ce code est largement ouvert à l'injection SQL et ne doit pas être utilisé.
Brad

@AnujGarg Ce code prend une entrée directe et la concatène dans la requête. Quelqu'un pourrait écrire son propre SQL dans les données de publication usernameet il sera exécuté.
Brad

Alors quoi utiliser pour empêcher le code de l'injection SQL?
Anuj Garg

14

Incluez une variable de chaîne de connexion avant la requête MySQL. Par exemple, $conntdans ce code:

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

1
Cela ne règle pas les problèmes de la question. C'est également faux et cela soulèverait une autre erreur.
Paul Spiegel

12

Chaque fois que vous obtenez le ...

"Avertissement: mysqli_fetch_object () s'attend à ce que le paramètre 1 soit mysqli_result, booléen étant donné"

... il est probable qu'il y ait un problème avec votre requête. Le prepare()ou query()peut retourner FALSE(un booléen), mais ce message d'échec générique ne vous laisse pas beaucoup d'indices. Comment trouvez-vous ce qui ne va pas avec votre requête? Vous demandez !

Tout d'abord, assurez-vous que le rapport d'erreurs est activé et visible: ajoutez ces deux lignes en haut de vos fichiers juste après votre <?phpbalise d' ouverture :

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

Si votre rapport d'erreurs a été défini dans le php.ini, vous n'aurez pas à vous en soucier. Assurez-vous simplement de gérer les erreurs avec élégance et de ne jamais révéler la véritable cause des problèmes à vos utilisateurs. Révéler la véritable cause au public peut être une invitation gravée en or pour ceux qui veulent nuire à vos sites et serveurs. Si vous ne souhaitez pas envoyer d'erreurs au navigateur, vous pouvez toujours surveiller les journaux d'erreurs de votre serveur Web. Les emplacements des journaux varient d'un serveur à l'autre, par exemple, sur Ubuntu, le journal des erreurs se trouve généralement à /var/log/apache2/error.log. Si vous examinez les journaux d'erreurs dans un environnement Linux, vous pouvez utiliser tail -f /path/to/logdans une fenêtre de console pour voir les erreurs telles qu'elles se produisent en temps réel ... ou lorsque vous les faites.

Une fois que vous serez au courant des rapports d'erreur standard, l'ajout de la vérification des erreurs sur votre connexion à la base de données et vos requêtes vous donnera beaucoup plus de détails sur les problèmes en cours. Jetez un œil à cet exemple où le nom de la colonne est incorrect. Tout d'abord, le code qui renvoie le message d'erreur fatale générique:

$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'erreur est générique et n'est pas très utile pour résoudre ce qui se passe.

Avec quelques lignes de code supplémentaires, vous pouvez obtenir des informations très détaillées que vous pouvez utiliser pour résoudre le problème immédiatement . Vérifiez la prepare()véracité de la déclaration et si elle est bonne, vous pouvez passer à la liaison et à l'exécution.

$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
}

Si quelque chose ne va pas, vous pouvez cracher un message d'erreur qui vous amène directement au problème. Dans ce cas, il n'y a pas de foocolonne dans le tableau, la résolution du problème est triviale.

Si vous le souhaitez, vous pouvez inclure cette vérification dans une fonction ou une classe et l'étendre en gérant les erreurs avec élégance comme mentionné précédemment.


2
Comment pouvez-vous écrire "Assurez-vous simplement de gérer les erreurs avec élégance et de ne jamais révéler la véritable cause des problèmes à vos utilisateurs." et echo $error;dans un poste?
Paul Spiegel

Merci pour le heads up @PaulSpiegel. Cela fait un moment que je n'ai pas écrit ou revu la réponse et que j'avais raté que j'avais laissé l'écho là-dedans.
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

Essaye ça

$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_ * est désormais obsolète et sera supprimé de php 7. Utilisez plutôt mysqli_ *
Manoj Kumar

9

Tout d'abord, vérifiez votre connexion à la base de données. Est-il connecté avec succès ou non?

Si c'est fait, alors j'ai écrit ce code, et ça marche bien:

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
N'utilisez pas ce code. Il est largement ouvert aux attaques par injection SQL.
Brad

9

Assurez-vous de ne pas fermer la base de données en utilisant db_close () avant d'exécuter votre requête:

Si vous utilisez plusieurs requêtes dans un script même si vous incluez d'autres pages contenant des requêtes ou une connexion à la base de données, il peut être possible qu'à tout endroit où vous utilisez db_close () qui fermerait votre connexion à la base de données, assurez-vous donc que vous êtes ne pas faire cette erreur dans vos scripts.


7

Si aucune erreur MySQL n'apparaît lors de la vérification, assurez-vous d'avoir correctement créé votre table de base de données. Cela m'est arrivé. Recherchez les virgules ou les guillemets indésirables.


6

Vérifiez d'abord votre connexion.

Ensuite, si vous souhaitez récupérer la valeur exacte de la base de données, vous devez écrire:

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

Ou vous voulez récupérer le LIKEtype de valeur, vous devez alors écrire:

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

3
Ce code est largement ouvert à l'injection SQL et ne doit pas être utilisé.
Brad

5

Vous pouvez également vérifier si l'échec $resultéchoue ainsi, avant d'exécuter le tableau d'extraction

$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
N'utilisez pas ce code. Il est largement ouvert aux attaques par injection SQL.
Brad

Mais si le code fonctionne, je pense que vous devez modifier le code et saisir les filtres nécessaires au lieu de châtier le code.
user28864

Une simple utilisation des filtres ne résoudra pas ce qui ne va pas avec ce code. La meilleure solution consiste à utiliser des requêtes préparées / paramétrées avec PDO ou similaire. Je ne vois aucun intérêt à le corriger, car la bonne réponse a déjà été publiée ici. Idéalement, cette réponse sera supprimée. Cependant, vous êtes invités à corriger votre réponse et je serai ravi de la voter si elle est correcte.
Brad

Eh bien, si vous pensez que la réponse ne vaut pas la peine d'être envisagée, vous pouvez aller de l'avant et en prendre connaissance. Cependant, je pensais que le but de cette communauté était de partager et d'apporter des connaissances. Si vous avez quelque chose à partager au lieu de montrer et de rebuter les gens.
user28864

2
Vous avez raison, tout l'intérêt de cette communauté est de partager des connaissances. C'est pourquoi j'ai ajouté des explications avec mon downvote et expliqué pourquoi votre suggestion de filtre n'était pas suffisante. Je préfère de loin vous avertir, ainsi que toute autre personne qui trouve votre réponse, que le code ci-dessus n'est pas sécurisé. Il vaut mieux que tout le monde apprenne les bonnes méthodes plutôt que de perpétuer un mauvais code. Et, je ne peux pas supprimer votre réponse, moi non plus. Cela ne dépend que de vous, si vous le souhaitez.
Brad

3

Habituellement, une erreur se produit lorsque la connectivité de votre base de données échoue. Veillez donc à connecter votre base de données ou à inclure le fichier de base de données.

include_once(db_connetc.php');

OU

// 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
  • La meilleure pratique consiste à exécuter la requête dans sqlyog, puis à la copier dans le code de votre page.
  • Stockez toujours votre requête dans une variable, puis faites écho à cette variable. Passez ensuite à mysql_query($query_variable);.

2
1) Vous ne savez pas si j'ai ou non voté sur une réponse ici, en haut ou en bas. 2) Comme je l'ai expliqué dans mon premier commentaire; votre réponse ne fait pas référence au problème ( booléen passé à mysql_fetch_array ) et vous avez des erreurs de syntaxe
Phil

2
Vous avez des guillemets incorrects dans vos deux exemples de code. La mise en évidence de la syntaxe appliquée à votre deuxième bloc de code est une révélation morte que quelque chose ne va pas
Phil

4
Ce code est soumis à l'injection SQL et ne doit pas être utilisé. @EngrZardari si vous utilisez ce code sur vos systèmes de production, vous avez sans aucun doute été piraté et devez remédier à la situation en utilisant des requêtes préparées / paramétrées avec PDO ou similaire. Il existe des robots qui ont des tests automatisés pour ces vulnérabilités.
Brad

1
@EngrZardari À propos de votre "il n'y a aucune erreur, j'ai collé ici le code que j'utilise actuellement." commentaire ci-dessus. Il y avait une citation manquante dans la requête que j'ai corrigée. Cela aurait généré une erreur d'analyse (PHP).
Funk Forty Niner

2

Traditionnellement, PHP a toléré les mauvaises pratiques et les échecs de code, ce qui rend le débogage assez difficile. Le problème dans ce cas spécifique est que mysqli et PDO par défaut ne vous disent pas quand une requête a échoué et revient simplement FALSE. (Je ne parlerai pas des démunis extension mysql . La prise en charge des instructions préparées est une raison suffisante pour passer soit à PDO soit à mysqli .) Mais vous pouvez changer le comportement par défaut de PHP pour toujours lever des exceptions lorsqu'une requête échoue.

Pour PDO : Utilisez$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

error_reporting(E_ALL);

$pdo = new PDO("mysql:host=localhost;dbname=test", "test","");
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

$result = $pdo->query('select emal from users');
$data = $result->fetchAll();

Cela vous montrera ce qui suit:

Erreur fatale: exception non détectée 'PDOException' avec le message 'SQLSTATE [42S22]: colonne introuvable: 1054 Colonne inconnue' emal 'dans' liste de champs '' dans E: \ htdocs \ test \ mysql_errors \ pdo.php sur la ligne 8

PDOException: SQLSTATE [42S22]: Colonne introuvable: 1054 Colonne inconnue 'emal' dans 'liste de champs' dans E: \ htdocs \ test \ mysql_errors \ pdo.php sur la ligne 8

Comme vous le voyez, il vous indique exactement ce qui ne va pas avec la requête et où le corriger dans votre code.

Sans pour autant $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); vous obtiendrez

Erreur fatale: appel à une fonction membre fetchAll () sur booléen dans E: \ htdocs \ test \ mysql_errors \ pdo.php sur la ligne 9

Pour mysqli : utilisezmysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);

error_reporting(E_ALL);

mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$mysqli = new mysqli('localhost', 'test', '', 'test');

$result = $mysqli->query('select emal from users');
$data = $result->fetch_all();

Tu auras

Erreur fatale: exception non détectée 'mysqli_sql_exception' avec le message 'Colonne inconnue' emal 'dans' liste des champs '' dans E: \ htdocs \ test \ mysql_errors \ mysqli.php sur la ligne 8

mysqli_sql_exception: colonne inconnue 'emal' dans 'liste des champs' dans E: \ htdocs \ test \ mysql_errors \ mysqli.php à la ligne 8

Sans mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);vous obtenez seulement

Erreur fatale: appel à une fonction membre fetch_all () sur booléen dans E: \ htdocs \ test \ mysql_errors \ mysqli.php sur la ligne 10

Bien sûr, vous pouvez vérifier manuellement les erreurs MySQL. Mais je deviendrais fou si je devais le faire chaque fois que je fais une faute de frappe - ou pire - chaque fois que je veux interroger la base de données.


1

Essayez ce code ça marche bien

affecter la variable post à la variable

   $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
Ce code est sujet aux attaques par injection SQL et ne doit pas être utilisé.
Brad
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.