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




while (25)

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

Answers

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

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

Si vous n'avez aucune erreur MySQL apparaissant lors de la vérification, assurez-vous que vous avez correctement créé votre table de base de données. Cela m'est arrivé. Recherchez les virgules ou les citations indésirables.


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.


Accédez à 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 le même nom que la config.


En général, une erreur se produit lorsque la conectivité de votre base de données échoue. Assurez-vous donc de connecter votre base de données ou d'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 votre code de page.
  • Toujours stocker votre requête dans une variable, puis renvoyer cette variable. mysql_query($query_variable); ensuite à mysql_query($query_variable); .

Essayez ceci, cela doit être du travail, 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'];
}

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.


Essayez le code suivant. Cela peut fonctionner correctement.

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

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

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 n'apparaît pas 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 cela 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.

  • Utilisez 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 à partir de la ligne de commande MySQL ou d'un outil tel que 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). Utilisez mysql_real_escape_string pour sortir de votre entrée.

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

D'autres conseils

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


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

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

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 :

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

Vérifiez le $result avant de le transmettre à mysql_fetch_array . Vous verrez que c'est false parce que la requête a échoué. Consultez la documentation de mysql_query pour les valeurs de retour possibles et des suggestions pour 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 ce qui doit être fait (traitement des erreurs), pas comment le faire. Le code de production ne doit pas utiliser or die lors de la sortie du code HTML, sinon il génèrera (à tout le moins) du 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 .


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 étant des guillemets simples, votre requête échoue et renvoie 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 (par exemple SomeText- $ username-SomeText).

Ceci est simplement une réponse à votre question, vous devez implémenter des choses mentionnées dans les autres messages: gestion des erreurs, utilisation des chaînes d'échappement (les utilisateurs peuvent taper quoi que ce soit dans le champ, et vous devez vérifier que ce code n'est pas arbitraire) qui est maintenant déprimé.


Vous pouvez également vérifier si $result échoue comme cela, avant d'exécuter le tableau 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'];
       }
}

Commencez par vérifier votre connexion à la base de données. Est-il connecté avec succès ou non?

Si c'est fait, alors après 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;
}

Assurez-vous que vous ne fermez pas 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 se peut que vous utilisiez db_close () pour fermer votre connexion à la base de données. ne pas faire cette erreur dans vos scripts.


N'utilisez pas la fonction mysql_ * déprimée (celle de php 5.5 sera supprimée en php 7). et vous pouvez faire cela 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();
?>

Comme l'a expliqué scompt.com , la requête pourrait é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 la documentation de mysql_query() pour plus d'informations.

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


Chaque fois que vous obtenez le ...

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

... c'est probablement parce qu'il y a un problème avec votre requête. La prepare() ou query() peut renvoyer 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 signalement des erreurs est activé et visible: ajoutez ces deux lignes au début de votre fichier (s) juste après votre <?php ouverture:

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

Si votre rapport d'erreurs a été défini dans php.ini, vous n'aurez pas à vous en soucier. Assurez-vous de gérer les erreurs avec élégance et ne jamais révéler la véritable cause de problèmes à vos utilisateurs. Révéler la véritable cause au public peut être une invitation gravée à l'or pour ceux qui veulent nuire à vos sites et serveurs. Si vous ne voulez 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 dans /var/log/apache2/error.log . Si vous examinez les journaux d'erreurs dans un environnement Linux, vous pouvez utiliser tail -f /path/to/log dans une fenêtre de console pour voir les erreurs lorsqu'elles se produisent en temps réel .... ou au fur et à mesure que vous les créez.

Une fois que vous avez terminé le rapport d'erreurs standard, l'ajout d'une vérification d'erreur sur votre connexion à la base de données et les requêtes vous donneront beaucoup plus de détails sur les problèmes qui se posent. Jetez un oeil à cet exemple où le nom de la colonne est incorrect. Tout d'abord, le code qui renvoie le message d'erreur générique fatal:

$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 ne vous aide pas vraiment à 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 déclaration prepare() pour la véracité et si elle est bonne, vous pouvez procéder à 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;
    echo $error; // 1054 Unknown column 'foo' in 'field list'
}

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 colonne foo dans la table, résoudre le problème est trivial.

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


Il pourrait 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 faire la requête. Voir php.net/manual/en/function.mysql-connect.php

  2. La variable $ nom_utilisateur est utilisée à l'intérieur d'une seule chaîne de cotation, 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é.


Vérifiez votre connexion en premier.

Ensuite, si vous voulez extraire 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 type de valeur LIKE alors vous devriez écrire:

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

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

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

Aussi, vous devriez vérifier que mysql_query a retourné une ressource de résultat valide, sinon fetch_ *, num_rows, etc ne fonctionnera pas sur le résultat car il ne s'agit pas d'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.


$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 ne reçois aucune erreur comme paramètre ou booléen.


Voici un exemple d'utilisation de mysqli (syntaxe d'objet - assez facile à traduire en syntaxe de fonction si vous le souhaitez):

$db = new mysqli("host","user","pw","database");
$stmt = $db->prepare("SELECT * FROM mytable where userid=? AND category=? ORDER BY id DESC");
$stmt->bind_param('ii', intval($_GET['userid']), intval($_GET['category']));
$stmt->execute();

$stmt->store_result();
$stmt->bind_result($column1, $column2, $column3);

while($stmt->fetch())
{
    echo "col1=$column1, col2=$column2, col3=$column3 \n";
}

$stmt->close();

De plus, si vous voulez un moyen simple de récupérer des tableaux associatifs (à utiliser avec SELECT *) au lieu de devoir spécifier exactement quelles variables associer, voici une fonction pratique:

function stmt_bind_assoc (&$stmt, &$out) {
    $data = mysqli_stmt_result_metadata($stmt);
    $fields = array();
    $out = array();

    $fields[0] = $stmt;
    $count = 1;

    while($field = mysqli_fetch_field($data)) {
        $fields[$count] = &$out[$field->name];
        $count++;
    }
    call_user_func_array(mysqli_stmt_bind_result, $fields);
}

Pour l'utiliser, appelez-le simplement au lieu d'appeler bind_result:

$stmt->store_result();

$resultrow = array();
stmt_bind_assoc($stmt, $resultrow);

while($stmt->fetch())
{
    print_r($resultrow);
}






php mysql