Question mysql_fetch_array () / mysql_fetch_assoc () / mysql_fetch_row () / mysql_num_rows etc ... attend que le paramètre 1 soit une ressource


J'essaie de sélectionner des données d'une table MySQL, mais je reçois l'un des messages d'erreur suivants:

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

ou

mysqli_fetch_array () s'attend à ce que le paramètre 1 soit mysqli_result, booléen donné

ou

Appel à une fonction membre fetch_array () sur boolean / non-object

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

La même chose s'applique au code comme

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

et

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

et

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

et

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

et

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

864
2018-06-04 10:18


origine


Réponses:


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

mysql_ * extension:

REMARQUE le Les fonctions mysql_ sont obsolètes et ont été supprimés dans la version 7 de php.

Vérifier $result avant de le passer à mysql_fetch_array. Vous constaterez que c'est false parce que la requête a échoué. Voir le mysql_query documentation 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'];
}

extension mysqli
style procédural:

$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 instruction 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 seulement quelle devrait être fait (traitement des erreurs), pas comment le faire. Le code de production ne doit pas utiliser or die lors de la sortie HTML, sinon il va (au moins) générer un code HTML invalide. En outre, les messages d'erreur de base de données ne doivent pas être affichés pour les utilisateurs non-administrateurs, car il révèle trop d'informations.


614
2018-06-04 10:19



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

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

Remarque: Cette erreur ne ne pas apparaît si aucune ligne n'est affectée par votre requête. Seule une requête avec une syntaxe invalide 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 ceci en haut de vos fichiers ou dans votre fichier de configuration: error_reporting(-1);. Si vous avez des erreurs de syntaxe, cela vous les indiquera.

  • Utilisation mysql_error(). mysql_error() rapportera toutes les erreurs rencontrées 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 depuis la ligne de commande MySQL ou un outil comme phpMyAdmin. Si vous avez une erreur de syntaxe dans votre requête, cela vous dira ce que c'est.

  • Assurez-vous que vos citations sont correctes. Un guillemet manquant autour de la requête ou une valeur peut provoquer l'échec d'une requête.

  • Assurez-vous d'échapper à vos valeurs. Les citations dans votre requête peuvent provoquer l'échec d'une requête (et vous laisser également ouvert aux injections SQL). Utilisation mysql_real_escape_string() pour échapper à votre entrée.

  • Assurez-vous de ne pas mélanger mysqli_* et mysql_* les fonctions. Ils ne sont pas la même chose et ne peuvent pas être utilisés ensemble. (Si vous allez choisir l'un ou l'autre bâton avec mysqli_*. Voir ci-dessous pour pourquoi.)

D'autres conseils

mysql_* Les fonctions ne doivent pas être utilisées pour le nouveau code. Ils ne sont plus entretenus et la communauté a commencé à processus de dépréciation. Au lieu de cela, vous devriez apprendre déclarations préparées et utilisez soit AOP ou MySQLi. Si vous ne pouvez pas décider, Cet article aidera à choisir. Si vous voulez apprendre, voici bon tutoriel PDO.


159
2017-07-26 17:00



L'erreur survenue ici était due à l'utilisation de guillemets simples ('). Vous pouvez mettre votre requête comme ceci:

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

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


106
2018-06-04 10:24



Comme scompt.com expliqué, 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; 
}

Voir le documentation pour mysql_query() pour plus d'informations.

L'erreur réelle était les guillemets simples de sorte que la variable $username n'a pas été analysé. Mais vous devriez vraiment utiliser mysql_real_escape_string($username) pour éviter les injections SQL.


59
2018-06-04 10:31



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 ne sert à rien d'utiliser le LIKE condition si vous n'utilisez pas de caractères génériques: si vous avez besoin d'une correspondance exacte = au lieu de LIKE.


53
2018-06-04 10:22



S'il vous plaît vérifier une fois que la base de données sélectionnée ne sont pas parce que 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());

43
2018-04-25 05:14



Votre code devrait être quelque chose comme ça

$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 sur 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 est dans la requête. Le reste du code est correct.


40
2018-06-04 11:28