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'];
}
mysql_real_escape_string
. Ne faites jamais confiance aux données utilisateur.mysql_real_escape_string
n'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.Réponses:
Une requête peut échouer pour diverses raisons, auquel cas à la fois mysql_ * et l'extension mysqli reviendront
false
de leurs fonctions / méthodes de requête respectives. Vous devez tester cette condition d'erreur et la gérer en conséquence.extension mysql_ * :
Vérifiez
$result
avant de le passer àmysql_fetch_array
. Vous constaterez que c'estfalse
parce que la requête a échoué. Consultez lamysql_query
documentation pour les valeurs de retour possibles et des suggestions sur la façon de les traiter.Style procédural de l' extension mysqli :
oo-style :
en utilisant une déclaration préparée:
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 die
lors 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 .la source
if($result === FALSE)
vous pouvez utiliserif(! $result)
. Corrigez-moi si je me trompeCe 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:
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 nemysql_*
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 avecmysqli_*
. 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 .la source
mysql_query()
/mysqli_query($connection)
etc." ; pensées? Puisqu'aucune autre réponse dans ce Q&R ne le mentionne.Une erreur s'est produite ici était due à l'utilisation de guillemets simples (
'
). Vous pouvez poser votre requête comme ceci: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 à niveau de PHP (PHP 5.5.0 et versions ultérieures), mais pour les versions plus anciennes,mysql_real_escape_string
cela fera l'affaire.la source
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:
Consultez la documentation
mysql_query()
pour plus d'informations.L'erreur réelle était les guillemets simples afin que la variable
$username
ne soit pas analysée. Mais vous devez vraiment utilisermysql_real_escape_string($username)
pour éviter les injections SQL.la source
Mettez des citations autour
$username
. Les valeurs de chaîne, par opposition aux valeurs numériques, doivent être placées entre guillemets.En outre, il est inutile d'utiliser la
LIKE
condition si vous n'utilisez pas de caractères génériques: si vous avez besoin d'une correspondance exacte, utilisez=
plutôt queLIKE
.la source
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
avant la requête MySQL, puis passez à l'étape suivante
la source
Votre code devrait ressembler à ceci
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.
la source
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:
http://us.php.net/manual/en/function.mysql-query.php pour plus d'informations.
la source
Cette requête devrait fonctionner:
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é.
la source
Parfois, la suppression de la requête
@mysql_query(your query);
la source
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_ci
et tout s'est enclenché.la source
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.
la source
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.Essayez ceci, cela doit fonctionner, sinon vous devez imprimer l'erreur pour spécifier votre problème
la source
LIKE
expression).Il peut 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 cela dans votre code. Utilisez mysql_connect avant de lancer la requête. Voir
php.net/manual/en/function.mysql-connect.php
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é.
la source
Essayez le code suivant. Cela peut très bien fonctionner.
la source
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.la source
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
la source
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:
la source
username
et il sera exécuté.Incluez une variable de chaîne de connexion avant la requête MySQL. Par exemple,
$connt
dans ce code:la source
Chaque fois que vous obtenez le ...
... il est probable qu'il y ait un problème avec votre requête. Le
prepare()
ouquery()
peut retournerFALSE
(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
<?php
balise d' ouverture :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 utilisertail -f /path/to/log
dans 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:
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.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
foo
colonne 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.
la source
echo $error;
dans un poste?la source
Essaye ça
la source
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:
la source
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.
la source
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.
la source
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:
Ou vous voulez récupérer le
LIKE
type de valeur, vous devez alors écrire:la source
Vous pouvez également vérifier si l'échec
$result
échoue ainsi, avant d'exécuter le tableau d'extractionla source
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.
OU
mysql_query($query_variable);
.la source
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);
Cela vous montrera ce qui suit:
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 obtiendrezPour mysqli : utilisez
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
Tu auras
Sans
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
vous obtenez seulementBien 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.
la source
Essayez ce code ça marche bien
affecter la variable post à la variable
la source