mysql fetch array()/mysql fetch assoc () / mysql fetch row () / mysql num rows etc ... s'attend à ce que le paramètre 1 soit une ressource
j'essaie de sélectionner des données à partir D'une table MySQL, mais je reçois un des messages d'erreur suivants:
mysql_fetch_array () s'attend à ce que le paramètre 1 soit ressource, booléen donné
ou
mysqli_fetch_array () s'attend à ce que le paramètre 1 soit mysqli_result, booléen donné
ou
Appel à un membre fonction fetch_array() boolean / non-objet
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(...);
30 réponses
une requête peut échouer pour diverses raisons, auquel cas mysql_* et l'extension mysqli retourneront false
à partir de leurs fonctions/méthodes de requête respectives. Vous devez tester pour cette condition d'erreur et le gérer en conséquence.
NOTE les les fonctions mysql_ sont dépréciées et ont été supprimés dans la version 7 de php.
cochez $result
avant de la passer à mysql_fetch_array
. Vous trouverez que c'est false
parce que la requête a échoué. Voir la documentation mysql_query
pour les valeurs de retour possibles et des suggestions pour 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'];
}
mysqli extension
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 "de style 1519380920" :
$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 ) {
...
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 seulement ce que devrait être fait (Traitement des erreurs), et non comment le faire. Code de Production ne devrait pas utiliser or die
pour la sortie HTML, sinon, il générera (à tout le moins) du HTML non valide. En outre, les messages d'erreur de base de données ne devraient pas être affichés pour les utilisateurs non-admin, car il divulgue trop d'informations .
Ce message d'erreur s'affiche lorsque vous avez une erreur dans votre requête, qui l'a fait échouer. Il se manifestera en utilisant:
-
mysql_fetch_array
/mysqli_fetch_array()
-
mysql_fetch_assoc()
/mysqli_fetch_assoc()
-
mysql_num_rows()
/mysqli_num_rows()
Note : cette erreur ne pas apparaît 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 en haut de vos fichiers ou dans votre fichier de config:
error_reporting(-1);
. Si vous avez des erreurs de syntaxe, elles vous seront signalées. -
Utilisation
mysql_error()
.mysql_error()
rapportera toutes les erreurs MySQL rencontrées 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(); }
-
lancez 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. Une citation manquante autour de la requête ou d'une valeur peut causer l'échec d'une requête.
-
assurez-vous d'échapper à vos valeurs. Les guillemets dans votre requête peuvent causer l'échec d'une requête (et aussi vous laisser ouvert aux injections SQL). Utilisez
mysql_real_escape_string()
pour échapper à votre entrée. -
assurez-vous de ne pas mélanger les fonctions
mysqli_*
etmysql_*
. 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 bâton avecmysqli_*
. Voir ci-dessous pourquoi.)
autres conseils
mysql_*
les fonctions ne doivent pas être utilisées pour le nouveau code. Ils ne sont plus maintenus et la communauté a commencé le processus de dépréciation . Au lieu de cela, vous devriez en savoir plus sur préparé déclarations et utiliser soit AOP ou MySQLi . Si vous ne pouvez pas décider, cet article aidera à choisir. Si vous voulez apprendre, voici bon tutoriel AOP .
s'est produite ici en raison de 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 MySQLi ou L'extension PDO_MYSQL pour la version améliorée de PHP (PHP 5.5.0 et plus tard), mais pour les versions plus anciennes mysql_real_escape_string
fera l'affaire.
As scompt.com a expliqué , 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 pour mysql_query()
pour plus d'informations.
L'erreur était les guillemets simples, de sorte que la variable $username
n'a pas été analysée. Mais vous devez vraiment utiliser mysql_real_escape_string($username)
pour éviter les injections SQL.
mettez des guillemets autour de $username
. Les valeurs de chaîne, par opposition aux valeurs numériques, doivent être incluses dans les guillemets.
$result = mysql_query("SELECT * FROM Users WHERE UserName LIKE '$username'");
en outre, il n'y a aucun intérêt à utiliser la condition LIKE
si vous n'utilisez pas de jokers: si vous avez besoin d'une correspondance exacte utilisez =
au lieu de LIKE
.
s'il vous Plaît vérifier une fois la base de données sélectionnées ne sont pas parce que certains moments de la base de données n'est pas activée
Vérifier
mysql_select_db('database name ')or DIE('Database name is not available!');
avant MySQL query puis passez à l'étape suivante
$result = mysql_query('SELECT * FROM Users WHERE UserName LIKE $username');
f($result === FALSE) {
die(mysql_error());
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 terminé, vous obtenez la requête imprimée sur l'écran. Essayez cette requête sur votre serveur et voir si elle produit les résultats escomptés. La plupart du temps, l'erreur est dans la requête. Reste du code est correct.
$result = mysql_query('SELECT * FROM Users WHERE UserName LIKE $username');
vous définissez la chaîne de caractères en utilisant des guillemets simples et PHP n'analyse pas les guillemets simples délimités. Afin d'obtenir l'interpolation variable, vous devrez utiliser les guillemets doubles ou la concaténation de chaîne (ou une combinaison de). Voir http://php.net/manual/en/language.types.string.php pour plus d'information.
vous devriez également vérifier que mysql_query retourné une ressource de résultat valide, sinon fetch_*, num_rows, etc ne pas travailler sur le résultat comme 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'information.
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 des guillemets simples, donc votre requête échoue et retourne FALSE et votre boucle WHILE ne peut pas être exécutée. Utiliser % vous permet de faire correspondre tous les résultats contenant votre chaîne (comme SomeText-$username-SomeText).
il s'agit simplement d'une réponse à votre question, vous devez mettre en œuvre les choses mentionnées dans les autres messages: gestion des erreurs, utiliser des chaînes d'échappement (les utilisateurs peuvent taper n'importe quoi dans le champ, et vous Doit s'assurer qu'il ne s'agit pas d'un code arbitraire), utilisez PDO à la place de mysql_connect qui est maintenant déprécié.
$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'];
}
supprime parfois la requête comme @mysql_query(your query);
si vous avez tout essayé ici, et que cela ne fonctionne pas, vous pourriez vouloir vérifier votre compilation de base de données MySQL. Le mien a été fixé à une collation suédoise. Puis je l'ai changé en utf8_general_ci
et tout s'est embrayé.
j'espère que cela aidera quelqu'un.
$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 cet ordre Par requête. C'est beaucoup mieux que pour l'utilisation d'une requête.
j'ai fait cette requête et je ne reçois aucune erreur comme paramètre OU booléen.
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'];
}
essayez le code suivant. Il 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'];
}
il pourrait y avoir deux raisons:
-
avez-vous ouvert la connexion à la base de données avant d'appeler la fonction mysql_query? Je ne vois pas ça dans ton code. Utilisation mysql_connect avant de faire la requête. Voir
php.net/manual/en/function.mysql-connect.php
-
la variable $username est utilisée à l'intérieur d'une seule chaîne de citation, de sorte que sa valeur ne sera pas évaluée à l'intérieur de la requête. La requête échouera définitivement.
Troisièmement, la structure de la requête est sujette à SQL injection . Vous pouvez utiliser des déclarations préparées pour éviter cette menace à la sécurité.
passez à votre config.php
. J'ai eu le même problème. Vérifiez le nom d'utilisateur et le mot de passe, et aussi sql select est le même nom que la configuration.
<?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 de l'aimer.
votre requête sera:
mysql_query("SELECT * FROM Users WHERE UserName ='".$username."'");
inclut 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");
N'utilisez pas la fonction mysql_* dépréciée (dépricated in php 5.5 sera supprimé dans php 7). et vous pouvez le faire avec mysqli ou AOP
voici la requête select 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();
?>
Essayez Cette
$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'];
}
}
Vérifiez D'abord votre connexion à la base de données. Est-il connecté avec succès ou non?
si c'est fait, alors après que j'ai écrit ce code, et il fonctionne 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;
}
<?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'];
}
?>
chaque fois que vous obtenez le...
"Avertissement: mysqli_fetch_object() s'attend à ce paramètre 1 pour être mysqli_result, booléenne donnée"
...c'est probablement parce qu'il y a un problème avec votre requête. Le prepare()
ou query()
pourrait retourner FALSE
(un booléen), mais ce message générique d'échec ne vous laisse pas beaucoup d'indices. Comment pouvez-vous savoir quel est le problème avec votre requête? Vous demandez !
tout d'abord, assurez-vous que le rapport d'erreur est activé et visible: ajoutez ces deux lignes en haut de votre(Vos) fichier (s) juste après votre ouverture <?php
étiquette:
error_reporting(E_ALL);
ini_set('display_errors', 1);
Si votre rapport d'erreur a été défini dans le php.ini vous n'aurez pas à vous inquiéter à ce sujet. Assurez-vous juste que vous manipulez les erreurs avec élégance et ne jamais révéler la véritable cause de tous les problèmes à vos utilisateurs. Révéler la vraie cause pour le public peut être une invitation gravée 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. L'emplacement des logs varie d'un serveur à l'autre .par exemple, sur Ubuntu, le log d'erreur est typiquement situé à /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 telles qu'elles se produisent en temps réel....ou comme tu les fais.
une fois que vous êtes au carré sur le rapport d'erreur standard ajouter le contrôle d'erreur sur votre connexion de base de données et les requêtes vous donnera beaucoup plus de détails sur les problèmes en cours. Regardez cet exemple où le nom de la colonne est incorrect. Tout d'abord, le code qui renvoie le message d'erreur fatal 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 pas très utile pour vous dans la résolution de ce qui se passe.
avec quelques lignes supplémentaires de code 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 reliure 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 le tableau, résoudre le problème est trivial.
si vous choisissez, vous pouvez inclure cette vérification dans une fonction ou une classe et l'étendre en traitant les erreurs avec élégance comme mentionné précédemment.
assurez-vous de ne pas fermer la base de données en utilisant db_close() avant de Exécution De Votre Requête:
si vous utilisez plusieurs requêtes dans un script, même si vous incluez d'autres pages qui contiennent des requêtes ou une connexion à une base de données, alors il est possible qu'à n'importe quel endroit vous utilisiez db_close() qui fermerait votre connexion à la base de données, alors assurez-vous de ne pas faire cette erreur dans vos scripts.
Vérifiez d'abord votre connexion.
alors si vous voulez 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 obtenir le type de valeur LIKE
alors vous devez écrire:
$result = mysql_query("SELECT * FROM Users WHERE UserName LIKE '%$username%'");
si vous n'avez pas D'erreur MySQL apparaissant lors de la vérification, assurez-vous que vous avez correctement créé votre table de base de données. Ce qui m'est arrivé. Cherchez les guillemets ou les guillemets indésirables.
vous pouvez aussi vérifier si $result
tombe en panne comme ça, 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'];
}
}
vous pouvez essayer ce code. Je l'ai trouvé plus tôt, quand j'avais 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;
}
habituellement une erreur se produit quand votre conectivite de base de données échoue, alors assurez-vous 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
- Meilleure pratique consiste à exécuter la requête dans sqlyog, puis le copier dans le code de la page.
- stockez toujours votre requête dans une variable et ensuite echo cette variable. Puis passer à
mysql_query($query_variable);
.
essayez ce code il fonctionne très bien
assignez 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'];
}
}