php - while - res-> fetch_assoc()




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

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.

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

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.


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


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.


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

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

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

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


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

Mettez des citations autour de $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 la condition LIKE si vous n'utilisez pas de caractères génériques: si vous avez besoin d'une correspondance exacte use = au lieu de LIKE .


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

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 a été mis à une collation suédoise. Ensuite, je l'ai changé en utf8_general_ci et tout a juste cliqué en vitesse.

J'espère que ça aidera quelqu'un.


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.


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

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.


Vous pouvez essayer ce code. Je l'ai trouvé plus tôt quand j'ai rencontré un problème similaire au vôtre.

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

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


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

@mysql_query(your query); parfois la requête comme @mysql_query(your query);


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




mysql