[RESOLU] Problème requête SQL

yoyo
Invité n'ayant pas de compte PHPfrance

20 avr. 2014, 18:12

Bonsoir,

Je suis actuellement en train de préparer un site web dynamique pou un dossier de fac et cela fait des heures que je bute sur l'erreur d'une seul ligne. Je n'arrive pas à comprendre cette erreur.
Cette erreur vient d'une requête que j'essaie d'exécuter à partir d'une base de données SQL précédemment créée.
Le fichier de connexion est bien crée :
<?php

// On tente la connexion
try
{	
	// On se connecte à MySQL 
	$pdo_options[PDO::ATTR_ERRMODE] = PDO::ERRMODE_EXCEPTION;
	$connexion = new PDO("mysql:host=localhost;dbname=test", "admin", "", $pdo_options);
	
	// On définit le jeu de caractères MySQL en utf8 
	$connexion -> query("SET NAMES utf8");
}
catch (Exception $e)
{
        die('Erreur : ' . $e->getMessage());
}
?>
Mon fichier formulaire dans lequel l'utilisateur va rentrer sa requête est bien codé :
<H1>Formulaire</h1>
<form method="post" action="tpmt_requete.php">
<p>Vous désirez voir les pièces<br>
- du metteur en scène : <input type="text" name="miseenscene" /><br>
<p>
<input type="reset" value="Effacer" />
<input type="submit" value="Envoyer" />
</p>
</form>
Mais c'est dans le fichier de préparation de la requête que ça bug. Je vous met en gras la ligne 19 qui m'ennuie depuis des heures.
<?php include ("commun/tpmt_entete.php"); ?>
<?php include ("commun/tpmt_banniere.php"); ?>
            <!-- SECTION 1 -->
            <section>
            
            	<!-- DEBUT DU CONTENU -->
                <article>
<?php 
// On donne une valeur aux variables mise en scène
$miseenscene = $_POST['miseenscene'];

// On se connecte à MySQL 
include ("commun/tpmt_connexion.php");

//On crée la requête préparée SQL

$query = 'SELECT * FROM test WHERE miseenscene=?';
$reponse = $connexion ->prepare ($query);
[b]$reponse -> execute(array($miseenscene));[/b]

// On affiche chaque entrée une à une

while ($donnees = $reponse -> fetch () )
{
	?><p>Pièce <strong><?php echo $donnees['nompiece']; ?></strong><br>
La pièce : <?php echo $donnees['nompiece'] ?>, mise en scène par <?php echo $donnees['miseenscene'] ?> , <?php; ?></strong><br>
sera joué le <?php echo $donnees['date1'] ?> et le <?php echo $donnees['date2'] ?> dans la salle <?php echo $donnees['salle'] ;?></strong><br>
Le prix du billet est de : <?php echo $donnees['tarif']; ?></strong><br>
<?php
}
// On termine le traitement de la requête
$reponse ->closeCursor ();

 ?>
Et Voici la fameuse erreur qui m'est affiché lorsque je rempli, en utilisateur le formulaire:
( ! ) Fatal error: Uncaught exception 'PDOException' with message 'SQLSTATE[42S02]: Base table or view not found: 1146 Table 'test.test' doesn't exist' in C:\wamp\www\L2ASCIONE_TPMT\tpmt_requete.php on line 19
( ! ) PDOException: SQLSTATE[42S02]: Base table or view not found: 1146 Table 'test.test' doesn't exist in C:\wamp\www\L2ASCIONE_TPMT\tpmt_requete.php on line 19
Call Stack
# Time Memory Function Location
1 0.0017 255352 {main}( ) ..\tpmt_requete.php:0
2 0.0173 266296 execute ( ) ..\tpmt_requete.php:19

Merci d'avance pour votre aide ! :)
Modifié en dernier par moogli le 21 avr. 2014, 09:24, modifié 2 fois.
Raison : Bbcode

Eléphant du PHP | 58 Messages

21 avr. 2014, 08:39

L'erreur a plutôt l'air de venir de la table test qu'il ne trouve pas.
Pourras-tu mettre des prochains morceaux de code dans les balises faites pour ça, ça pourrait aider les gens à t'aider !

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 8758 Messages

21 avr. 2014, 09:34

Salut,

Pour éviter la plus grosse partie du message (dont la stack trace) je te conseils de regarder comment gérer les erreurs avec PDO.

Sinon je pense que la table test n'existe pas (sinon tu aurais une erreur a la connexion).

Il est important de tester les requêtes dans un client mysql avant de les utiliser avec php, tu seras ainsi sur qu'elle est syntaxiquement correcte.

Tu peux aussi l'afficher a des fins de déboggage pour ensuite tester dans un client sql (pour la requête préparée va te fournir ce qu'il y a dans le prépare donc autant faire un copier collé.

D'ailleurs il n'y a, dans ce cas, aucun intérêt a utiliser une requête préparée, utilise simple la méthode quote pour échapper les données (et la concaténation pour construire la requête).

@+
Il en faut peu pour être heureux ......

yoyo
Invité n'ayant pas de compte PHPfrance

21 avr. 2014, 11:51

Salut,

Merci à vous deux pour vos réponses. Comment faire pour tester la table dans un client SQL ? Si c'est par l'intermédiaire de PHPmyadmin, alors tout va bien, j'ai testé et ça marche.

Après, honnêtement, je n'arrive pas à faire la différence entre les balises query, prepare, quote ... Comment se fait une requête avec Quote svp ?

Merci :)

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 8758 Messages

21 avr. 2014, 14:25

phpmyadmin est un client mysql oui, d'autre existe comme mysql workbench, heidi SQL etc.

query, prepare et quote ne sont pas des balises mais des méthodes de la classes PDO.

en clair :
<?php
$query = 'SELECT * FROM test WHERE miseenscene='.$connexion->quote($_POST['miseenscene'],PDO::PARAM_INT);
si tu test
select * from test 
avec phpmyadmin sans erreur, c'est que donc la table existe, reste a voir si c'est bien sur la bonne base (test) que tu utilise (en tous cas il n'y a pas de table test sur la base test. c'est ce qu'indique le message d'erreur).

@+
Il en faut peu pour être heureux ......

yoyo
Invité n'ayant pas de compte PHPfrance

21 avr. 2014, 15:05

Salu moogli,

J'ai réussi à régler le problème enallant chercher dans phpmyadmin le code sql suivant (en gras):
$sql = "SELECT * FROM `theatre` WHERE miseenscene=? LIMIT 0, 30 ";
$reponse = $connexion ->prepare ($sql);
$reponse -> execute(array($miseenscene));

Et là, ma requête marche, quand j'établis un formulaire où la personne inscrit le nom d'un metteur en scène. Mais je voudrais maintenant que ça marche par l'intermédiaire d'un formulaire en liste déroulante. C'est-à-dire qu'en sélectionnant parmi une liste proposée le nom d'un metteur en scène, la personne peut y voir les pièces de théâtre associées à ce metteur en scène. Comment doit-je modifier le code stp pour y arriver.

Merci d'avance pour ton aide :)

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 8758 Messages

21 avr. 2014, 17:01

cela dépend du modèle de ta base de données.

si c'est bien fait (mais j'avoue que j'ai un doute :s) tu fait un select sur la table des metteur en scène (qui devrait plutôt être une table des personnes avec une caractéristique metteur en scène) et tu affiche dans un select html les noms avec en value la clef primaire (par exemple <option value="18">Toto</option>).

ensuite lorsque tu change la valeur de la liste tu affiche en fonction du choix (donc ta requête mais en utilisant la valeur choisie).

si tu ne sais pas comment récupérer les valeurs d'un formulaire => http://www.lephpfacile.com/cours/8-recu ... ormulaires



@+
Il en faut peu pour être heureux ......

yoyo
Invité n'ayant pas de compte PHPfrance

22 avr. 2014, 00:08

Re,

Je suis vraiment désolé, mais je n'arrive pas à comprendre ce que tu me dis.

Je débute en PHP, je suis à la fac, c'est tout nouveau pour moi de créer un site dynamique.

Si tu daigne tenter de me réexpliquer plus simplement ^^, en m'excusant encore de mon inculture dans le domaine, autrement tant pis, j'expliquerai mercredi (date de rendu du dossier) au prof que je ne suis pas arriver malgré toute ma meilleure volonté.

Merci :)

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 8758 Messages

22 avr. 2014, 11:03

sais tu utiliser un select html.
Ce select est à alimenté avec les information provenant de ta base de données.
comme déjà dit, la valeur doit être une référence vers ce que tu affiche (généralement une clef primaire).
sans le modèle de donnée on ne peux pas t'aider plus qu'avec des explication simple et généraliste.

Lorsque tu valide le formulaire avec le select il faut utiliser l'information dans le prédicat (clause where) de la requête SQL. => plus d'info sur le select SQL

voila c'est fait a conditionner l'affichage des donnés avec le formulaire.

je ne peux pas être plus simple, qu'en te fournissant ce que tu doit utiliser.
Je en te ferais pas le code le but c'est que tu sache le faire. Ce n'est pas compliqué, avec les liens que je te fournis, plus les tutos pour débuter qui peuvent exister (par exemple sur phpdebutant.org ou lephpfacile.com tu doit y arriver.
Si tu daigne tenter de me réexpliquer plus simplement ^^, en m'excusant encore de mon inculture dans le domaine, autrement tant pis, j'expliquerai mercredi (date de rendu du dossier) au prof que je ne suis pas arriver malgré toute ma meilleure volonté.
S'il te le demande c'est que cela doit surement rentrer dans ton champs de compétence. Le jour de l'examen tu va "demander l'aide d'un ami ou du public ?" :mrgreen:

@+
Il en faut peu pour être heureux ......

yoyo
Invité n'ayant pas de compte PHPfrance

22 avr. 2014, 13:54

Salut,

j'en suis arrivé à ce code, qui, lorsque l’utilisateur sélectionne tel ou tel salle, ça lui affiche toujours les mêmes pièces, et pas celles de la salle choisit.
<?php 
// On donne une valeur à la variable salle de théâtre
$salle = $_POST['salle'];

// On se connecte à MySQL 
include ("commun/tpmt_connexion.php");

//On crée la requête préparée SQL
$sql = "SELECT * FROM `theatre` WHERE salle = 'Salle Pierre Brasseur, TNN' OR 'Théâtre de la Tour' LIMIT 0, 30 ";
$reponse = $connexion ->prepare ($sql);
$reponse -> execute(array($sql));

// On affiche chaque entrée une à une

while ($donnees = $reponse -> fetch ())
{
	?><p>Pièce <strong><?php echo $donnees['nompiece']; ?></strong><br>
La pièce : <?php echo $donnees['nompiece'] ?>, mise en scène par <?php echo $donnees['miseenscene'] ?> , <?php; ?></strong><br>
sera joué le <?php echo $donnees['date1'] ?> et le <?php echo $donnees['date2'] ?> dans la salle <?php echo $donnees['salle'] ;?></strong><br>
Le prix du billet est de : <?php echo $donnees['tarif']; ?> euros</strong><br>
<?php
}
// On termine le traitement de la requête
$reponse ->closeCursor ();

 ?>
Mon problème reste donc de faire une requête select avec "option value" à l'intérieur.

Merci
Modifié en dernier par moogli le 22 avr. 2014, 16:28, modifié 1 fois.
Raison : bbcode php !!!

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 8758 Messages

22 avr. 2014, 16:33

merci d'utiliser le bbcode, c'est vachement plus beau et facile à lire (pis bon les boutons sont juste au dessus la textearea c'est pas loin pour la souris).

démarche à suivre :
1/ créer le formulaire HTML (je ne le vois pas)
2/ réaliser le traitement du formulaire (déjà récupérer l'info)
3/ Sais tu ce qu'il faut modifier dans la requête que tu indique pour ne choisir qu'une seule salle ?
4/ arrêter de ce disperser si tu ne vas pas t'en sortir.

Pour finir, comme je te l'ai déjà indiqué, ton modèle de base est foireux et va te poser des soucis il serait intéressant de le remettre à plat et de la faire correctement (voir au moins les formes normale 1 à 3, tu peux te renseigner sur la méthode merise aussi).

Si tu réponds aux quatre question ci dessus tu aura ta solution.

tous ce dont tu as besoin est dans mes messages précédent.

@+
Il en faut peu pour être heureux ......

yoyo
Invité n'ayant pas de compte PHPfrance

23 avr. 2014, 11:30

Bonjour moogli,

J'ai finalement contacté mon prof pour lui faire part de mon problème et il m'a indiquer les lignes de codes à insérer.

Avec tes conseils, je n'étais finalement pas si loin que ça de la solution.

Je te remercie donc pour tes loyaux services qui m'ont beaucoup aidé.

En te disant peut-être à une prochaine fois, je te souhaite longue vie à ce site qui est très bien et très utile, surtout pour des personnes comme moi ^^

Bonne journée

Yoyo