Retour requête php -> Erreur 500
Bonjour,
Le projet: sur une page nommée criteria.html le visiteur saisit un nom et sélectionne 2 critères dans les listes. Le clic sur envoyer ouvre la page retour.php ou doit apparaitre le résultat de la requête. Actuellement le résultat est ERREUR 500.
Merci de votre aide.
<!doctype html>
<html>
<head>
<meta charset="UTF-8">
<title>CRITERIA</title>
</head>
<body>
<FORM method="POST" action="retour.php">
<P>NAME:<br>
<INPUT type="text" nom="nom" size=20>
</p>
<form method="post" action="retour.php" id="criteria">
<label for="etat">Criteria n°1</label><br/>
<select name="etat" id="etat">
<option value=" - - - "> - - - </option>
<option value="Andhra Pradesh">Andhra Pradesh</option>
<option value="Arunachal Pradesh">Arunachal Pradesh</option>
<option value="Bhopal">Bhopal</option>
<option value="Bihar">Bihar</option>
<option value="Bombay">Bombay</option>
<option value="Chandigarh">Chandigarh</option>
</select><br/><br/>
<label for="caste">Criteria n°2</label><br/>
<select name="caste" id="caste">
<option value=" - - - "> - - - </option>
<option value="Aboriginal">Aboriginal</option>
<option value="Criminal Tribes">Criminal Tribes</option>
<option value="Denotified communities">Denotified communities</option>
<option value="Denotified Tribes">Denotified Tribes</option>
<option value="Dravidian_peoples">Dravidian_peoples</option>
<option value="Ethnic groups">Ethnic groups</option>
<option value="Gotras">Gotras</option>
</select><br/><br/>
<input type="submit" value="Envoyer" name="requete" />
</form>
</body>
</html>
<?php
$mysqli = new mysqli("localhost", "bharata", "mot_de_passe", "bharata");
if ($mysqli->connect_errno) {
die('<p>Connexion impossible : '.$mysqli->connect_error.'</p>');
}
if (!$result) {
die('<p>ERREUR Requête invalide : '.$mysqli->error.'</p>');
}
$nom = $_POST["nom"] ;
$etat = $_POST["etat"] ;
$caste = $_POST["caste"] ;
$result = $mysqli->query('SELECT * FROM nex21 WHERE nom='$nom' AND etat='$etat' AND caste='$caste) ;
if (!$result) {
die('<p>ERREUR Requête invalide : '.$mysqli->error.'</p>');
}
while ($row = $result->fetch_assoc()) {
$nom = $row['nom'] ;
$etat = $row['etat'] ;
$caste = $row['caste'] ;
echo '<p>'.$nom.' - '.$etat.' - '.$caste.'</p>'."\r\n" ;
}
$result->free() ;
$mysqli->close() ;
?><br><br>
Réponses apportées à cette discussion
Bonjour,
pour avancer plus facilement, il faut un minimum d'attention et de discipline. Et ça implique d'écrire proprement son code : ça facilite la relecture et permet surtout de voir beaucoup plus vite des erreurs possibles.
Voici pour commencer une ré-écriture du code PHP :
<?php
$mysqli = new mysqli("localhost", "bharata", "mot_de_passe", "bharata");
if($mysqli->connect_errno)
{
die('<p>Connexion impossible : ' . $mysqli->connect_error . '</p>');
}
// if(!$result) <=== la variable $result n'a pas encore été définie, donc ici, ça affichera de toutes façon une erreur.
// {
// die('<p>ERREUR Requête invalide : ' . $mysqli->error . '</p>');
// }
$nom = $_POST["nom"];
$etat = $_POST["etat"];
$caste = $_POST["caste"];
/**
* On commence par définir la requête en l'écrivant proprement avec
* des concaténation correctes.
*/
$requete = "SELECT * ".
"FROM nex21 ".
"WHERE nom = '". $nom ."' ".
" AND etat = '". $etat ."' ".
" AND caste = '". $caste ."'";
$result = $mysqli->query($requete) ;
if(!$result)
{
die('<p>ERREUR Requête invalide : ' . $mysqli->error . '</p>');
}
while(false != ($row = $result->fetch_assoc()))
{
$nom = $row['nom'];
$etat = $row['etat'];
$caste = $row['caste'];
echo '<p>' . $nom . ' - ' . $etat . ' - ' . $caste . '</p>' . "\r\n";
}
$result->free();
$mysqli->close();
?><br />
<br />
On aligne bien le code, ça simplifie la vie : à noter, un premier bloc mis en commentaire avec une explication; ensuite, la requête SQL doit être correctement écrite et les concaténation doivent être convenablement faites, sinon, on a toutes les chances d'avoir des erreurs.
Il faudrait déjà essayer ça, et voir si l'erreur 500 persiste ou non.
Bonjour Cyrano,
Merci de votre aide et de vos explications. Il n'y a plus d'erreur 500, mais la page est blanche. J'ai modifié la page html, mais ce n'est surement pas suffisant.
Cordialement.
<!doctype html>
<html>
<head>
<meta charset="UTF-8">
<title>Apprendre</title>
</head>
<body>
<form action = "apprendre.php" method = "post">
<p>name:<br>
<input type="text" nom="nom" size="20">
</p>
<form method="post" action="apprendre.php" id="criteria">
<label for="etat">Criteria n°1</label><br/>
<select name="etat" id="etat">
<option value=" - - - "> - - - </option>
<option value="Andhra Pradesh">Andhra Pradesh</option>
<option value="Arunachal Pradesh">Arunachal Pradesh</option>
<option value="Bhopal">Bhopal</option>
<option value="KARNATAKA">KANATAKA</option>
<option value="Bombay">Bombay</option>
<option value="Chandigarh">Chandigarh</option>
</select><br/><br/>
<label for="caste">Criteria n°2</label><br/>
<select name="caste" id="caste">
<option value=" - - - "> - - - </option>
<option value="Aboriginal">Aboriginal</option>
<option value="OBC">OBC</option>
<option value="Denotified communities">Denotified communities</option>
<option value="Denotified Tribes">Denotified Tribes</option>
<option value="Dravidian_peoples">Dravidian_peoples</option>
<option value="Ethnic groups">Ethnic groups</option>
<option value="Gotras">Gotras</option>
</select><br/><br/>
<input type="submit" value="Envoyer" name="requete" />
</form>
</body>
</html>
Est-ce que la valeur de l'attribut action de la balise <form> est correct ? Ça doit pointer vers la page qui traitera les données du formulaire.
Les 2 balises pointent bien vers la page php qui envoie la requête.
Mais est-ce correct ?
<body>
<form action = "apprendre.php" method = "post">
<p>name:<br>
<input type="text" nom="nom" size="20">
</p>
<form method="post" action="apprendre.php" id="criteria">
<label for="etat">Criteria n°1</label><br/>
<select name="etat" id="etat">
Ben pour la syntaxe HTML, c'est bon, mais j'ignore si le nom de la page est bon. Je ne sais pas comment sont structurés les fichiers, et sans ça, impossible de dire ce qui est bon ou pas.
Sur PhpMyAdmin le fichier nex21 sujet de la requête comporte 5 colonnes. La première colonne "nom" la seconde "etat" la troisième "caste". Les 2 dernières ne sont pas utilisées dans cette requête.
Côté nom de page c'est bon:
pour le nom à saisir : <form action = "apprendre.php" method = "post">
pour les 2 menus déroulants : <form method="post" action="apprendre.php" id="criteria">
Pour info je viens de voir que sur le code source de la page la ligne :
<form method="post" action="apprendre.php" id="criteria"> est en rouge ???
Je parle de la structure des fichiers, pas de la base de données.
Donc il devrait y avoir un premier fichier sur lequel se trouve le formulaire, et l'autre qui se nomme apprendre.php situé dans le même répertoire que le premier. Si ce n'est pas le cas, alors il faudrait m'indiquer les noms exacts des fichiers et leur disposition avec éventuellement les noms des répertoires relatifs au fichier qui contient le formulaire.
Le premier fichier sur lequel se trouve le formulaire "apprendre_3.html" est sur le même répertoire que "apprendre.php"
Les 2 fichiers s'affichent en ligne sans problème .... mais sans résultat sur "apprendre.php"
voir: http://bharata.nexgate.ch/apprendre_3.html
Ok, alors il y a un soucis avec le retour de la requête : je suggère un petit ajout :
/**
* On commence par définir la requête en l'écrivant proprement avec
* des concaténation correctes.
*/
$requete = "SELECT * ".
"FROM nex21 ".
"WHERE nom = '". $nom ."' ".
" AND etat = '". $etat ."' ".
" AND caste = '". $caste ."'";
/* Affichage de débogage de la requête */
echo('<pre>'. PHP_EOL);
var_dump($requete);
echo('</pre>'. PHP_EOL);
Ça va afficher la requête SQL telle qu'elle est envoyée à MySQL : il faudrait alors faire un copier/coller et la tester directement dans phpMyAdmin. S'il y a un problème, ça devrait apparaître tout de suite
Bonjour Cyrano,
Requête affichée:
string(82) "SELECT * FROM nex21 WHERE nom = '' AND etat = 'KARNATAKA' AND caste = 'OBC'"La valeur du "nom" saisie n'est pas prise en compte.
Test dans phpMyAdmin:
Erreur Analyse statique : 1 erreurs trouvées lors de l'analyse. Type d'énoncé non reconnu. (near "string" at position 0) Requête SQL : Documentation string(82) "SELECT * FROM nex21 WHERE nom = '' AND etat = 'KARNATAKA' AND caste = 'OBC'" MySQL a répondu: Documentation #1064 - Erreur de syntaxe près de 'string(82) "SELECT * FROM nex21 WHERE nom = '' AND etat = 'KARNATAKA' AND' à la ligne 1
J'ai testé :
SELECT * FROM `nex21` WHERE `nom` = 'ahir' AND etat = 'KARNATAKA' AND caste = 'OBC'
MySQL a retourné un résultat vide (aucune ligne).
Ok, donc... ?
Quelle doit être la suite logique de cette vérification ?
Le formulaire ?
Non : un peu de logique voyons !
D'abord, créer une requête (manuellement) qui donne un résultat conforme non vide : une fois que ce sera au point, on aura le canevas qui servira pour construire une requête dynamique;
Ensuite, vérifier ce qui est reçu depuis le formulaire dans le fichier de traitement, par exemple avec un var_dump($_POST) afin de savoir exactement ce qu'on reçoit, ça permet de vérifier si on utilise les bons index :
Ensuite ... ?
Du moment qu'il n'y a qu'un seul formulaire avec un nom à saisir la réponse de la requête est correcte.
$nom = $_POST['nom'];
$result = $mysqli->query("SELECT * FROM conca WHERE recherche LIKE '%$nom%' LIMIT 0, 3000") ;Pour info, mais vous avez du vous en apercevoir, mes connaissances en php sont quasiment nulles.
Pas grave, on est sur ApprendrePHP.com, donc il y est question d'apprentissage.
La programmation requiert logique et discipline, sinon on s'enlise dans des problèmes insolubles.
J'ai fait une suggestion, à savoir utiliser var_dump($_POST) : mais je n'ai pas indiqué où. Selon la logique, où faudrait-il écrire ça ?
... dans le php
$nom = $_POST["nom"];
$etat = $_POST["etat"];
$caste = $_POST["caste"];
var_dump($_POST);
La requête fonctionne en supprimant dans le formulaire cette ligne:
<form method="post" action="apprendre.php" id="criteria">avec dans le php le code:
$result = $mysqli->query("SELECT * FROM nex21 WHERE nom LIKE '%$nom%' AND etat = '". $etat ."' ". " AND caste = '". $caste ."'") ;
Pourquoi ? Cela reste un mystère pour moi ...
Avec le var_dump, il faudrait voir ce que ça affiche lorsqu'on remplit le formulaire et qu'on l'envoie. Ce sera la première étape.
- Résultat:
array(3) { ["etat"]=> string(9) "KARNATAKA" ["caste"]=> string(3) "OBC" ["requete"]=> string(7) "Envoyer" }
Ok, qu'est-ce qu'on remarque ? Il manque quelque chose non ?
Et s'il manque, c'est parce qu'il y a une erreur dans la syntaxe HTML du formulaire. Observe attentivement. C'est une erreur classique quand on débute, mais il est important de la débusquer et de la corriger. Et ça concerne bien entendu le champ qui est manquant dans les données envoyées depuis ce formulaire
Bonjour Cyrano,
Il faut supprimer dans la syntaxe html cette ligne:
<form method="post" action="apprendre.php" id="criteria">
Pas du tout.
L'erreur est dans le premier champs INPUT
Indice : quels sont les attributs de ce type de champ ?
Pourquoi en supprimant cette ligne cela fonctionne t'il?
Ça ne devrait pas, et j'avoue qu'il y a un détail qui m'échappe. Et ça ne résoud pas l'erreur qui est toujours là.
Manque id=" "
<input type="text" id="nom" nom="nom" size="20">- à la place de :
<input type="text" nom="nom" size="20">
Presque : un attribut est faux et n'existe pas en HTML
Bonjour Cyrano
- Size ne serait pas un attribut en html ???
Non, celui-ci est bon, mais un autre ne l'est pas du tout. Ça ne devrait pas être difficile, ce champ n'en présente que quatre et on vient d'en éliminer un, et sur les trois restant, celui ajouté hier est bon aussi ... donc ... ?
Là, je suis certain que plus jamais il n'y aura d'erreur sur ce genre de champ de formulaire, ça a l'air difficile à trouver, pourtant tout ce qu'il faut, c'est de l'attention.
Allez un autre indice : généralement, les mots clés d'un langage comme le HTML ou le PHP ou bien d'autre sont en anglais et non en français.
Bonjour Cyrano,
<input type = "text" name = "nom" />
<input type = "text" />
- Les 2 fonctionnent ...
Bonjour Cyrano,
<input type = "text" name = "nom" />
<input type = "text" />
- Les 2 fonctionnent ...
Avec un correctif : la première fonctionne parce qu'un attribut a été modifié, en mettant « name » au lieu de « nom »
Ce genre de faute d'inattention peut être très longue à débusquer, et il était important que je n'apporte pas une réponse toute cuite, la trouver soi-même la grave profondément en mémoire et on ne la commet plus par la suite.
Ce qu'il est important de comprendre : lorsqu'on envoie un formulaire, qu'on utilis la méthode POST ou GET, les données sont envoyées comme un tableau associatif dont les index sont l'identifiant inscrit dans l'attribut « name » des champs du formulaire. Si on ne met pas du tout d'attribut name, la donnée sera envoyée tout de même, mais alors il y aura probablement un index nuérique automatique, ce qui n'est pas du tout pratique parce qu'il faut afficher les données brutes pour savoir quelle donnée correspond à quel index et donc à quel champ.
C'est bon cette fois-ci ? Le formulaire fonctionne ?
Ca marche, merci Cyrano.
Super, bonne continuation alors :-)