FORMULAIRE PHP/MYSQL

pharelka Messages postés 6 Date d'inscription mardi 29 juillet 2014 Statut Membre Dernière intervention 29 août 2014 - Modifié par jordane45 le 29/08/2014 à 10:59
jordane45 Messages postés 38144 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 21 avril 2024 - 29 août 2014 à 01:37
Bonjour à tous,

Je dois réaliser un script en (MySQL et PHP) qui doit insérer et afficher les informations en provenance d'un formulaire à partir de trois tables différentes.
Je dois afficher le pseudo du membre (table membre), le titre de la salle(table salle), le commentaire et la date (table avis).

La table 1 avis :
CREATE TABLE IF NOT EXISTS 'avis' (
  'id_avis' int(5) NOT NULL AUTO_INCREMENT,
  'id_salle' int(5) NOT NULL,
  'id_membre' int(5) NOT NULL,
  'note' int(2) DEFAULT NULL,
  'date' datetime DEFAULT NULL,
  'commentaire' text,
  PRIMARY KEY ('id_avis'),
  KEY 'fk_avis_salle1_idx' ('id_salle'),
  KEY 'fk_avis_membre1_idx' ('id_membre')
) ENGINE=InnoDB  DEFAULT CHARSET=utf8 AUTO_INCREMENT=2 ;

Table 2 :
CREATE TABLE IF NOT EXISTS 'membre' (
  'id_membre' int(5) NOT NULL AUTO_INCREMENT,
  'pseudo' varchar(15) DEFAULT NULL,
  'mdp' varchar(32) DEFAULT NULL,
  'nom' varchar(20) DEFAULT NULL,
  'prenom' varchar(20) DEFAULT NULL,
  'email' varchar(30) DEFAULT NULL,
  'sexe' enum('m','f') DEFAULT NULL,
  'ville' varchar(20) DEFAULT NULL,
  'cp' int(5) DEFAULT NULL,
  'adresse' varchar(30) DEFAULT NULL,
  'statut' int(1) DEFAULT NULL,
  PRIMARY KEY ('id_membre')
) ENGINE=InnoDB  DEFAULT CHARSET=utf8 AUTO_INCREMENT=3 ;

Table 3 :
CREATE TABLE IF NOT EXISTS 'salle' (
  'id_salle' int(5) NOT NULL AUTO_INCREMENT,
  'pays' varchar(20) NOT NULL,
  'ville' varchar(20) NOT NULL,
  'adresse' text NOT NULL,
  'cp' varchar(5) NOT NULL,
  'titre' varchar(200) NOT NULL,
  'description' text NOT NULL,
  'photo' varchar(200) NOT NULL,
  'capacite' int(3) NOT NULL,
  'categorie' varchar(20) NOT NULL,
  PRIMARY KEY ('id_salle')
) ENGINE=InnoDB  DEFAULT CHARSET=utf8 AUTO_INCREMENT=21 ;

J'essaie avec ce script mais je n'arrive pas à récupérer les informations contenues dans les tables salle et membre, je ne sais pas si ce script convient pour faire ce petit travail :
Ou si vous connaissez la méthode à utiliser pour ce genre d'exercice
Merci d'avance
Cordialement.


<?php

//LE SCRIPT QUI NE FONCTIONNE PAS
$sql = executeRequete("INSERT INTO avis(id_avis,id_salle,id_membre,note,date,commentaire)
SELECT '.mysql_insert_id().',m.id_membre,m.pseudo,s.id_salle,now(),s.titre
FROM membre m, salle s
WHERE m.id_membre = id_membre
AND s.id_salle = id_salle ");


}

//LE RESTE FONCTIONNE PARFAITEMENT BIEN

echo debug($sql);
var_dump($sql);
?>

<!-- FORMULAIRE AVIS -->

<form method="post" action="" >
<fieldset>
<legend><h2> FORMULAIRE</h2></legend>

<label for="pseudo">Pseudo :</label>
<input type="text" name="pseudo" id="pseudo" value="<?php if(isset($_POST['pseudo'])) {echo $_POST['pseudo'];}?>"/>
<br/><br/>
<label for="note">Note :</label>
<select name="note" id="note" >
<option>20</option>
<option>19</option>
<option>18</option>
<option>17</option>
<option>16</option>
<option>15</option>
<option>14</option>
<option>13</option>
<option>12</option>
<option>11</option>
<option>10</option>
<option>09</option>
<option>08</option>
<option>07</option>
<option>06</option>
<option>05</option>
<option>04</option>
<option>03</option>
<option>02</option>
<option>01</option>
<option>00</option>
</select>
<br/>
<br/>
<label for="commentaire">Commentaire</label>
<br/>
<textarea name="commentaire" id="commentaire" rows="10" cols="63" value="<?php if(isset($_POST['commentaire'])) {echo $_POST['commentaire'];}?>">
</textarea>
<br />
<input type="submit" name="valider" value="Valider" />

</fieldset>

</form>

<div class="clear"></div>
<fieldset>

<?php

$resultat = executeRequete("SELECT a.id_avis,a.id_membre,a.id_salle,a.commentaire,a.note,
date_format(date, '%d-%m-%Y') AS dateFr,
date_format(date, '%H:%i:%s') AS heurFr,
s.id_salle,s.titre,m.id_membre,m.pseudo
FROM avis a,membre m,salle s
WHERE a.id_membre=m.id_membre AND a.id_salle=s.id_salle
ORDER BY date DESC LIMIT 0,3");

echo '<legend><h2>Il y a '.$resultat->num_rows.' commentaires</h2></legend>';


//var_dump($resultat);
while ($commentaire = $resultat->fetch_assoc())
{
echo '<div class="message">';

echo'<div class="titre"> La '.
$commentaire['titre'].' '.$commentaire['note'].'/20 <br/>Par '.
$commentaire['pseudo'].' le '.
$commentaire['dateFr']. ' a '.
$commentaire['heurFr'].'</div>';
echo '<div class="contenu">'.
$commentaire['commentaire']. '</div>';

echo '</div><hr/>';

}

?>

</fieldset>
</div>


5 réponses

jordane45 Messages postés 38144 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 21 avril 2024 344
Modifié par jordane45 le 28/08/2014 à 09:09
Bonjour

As tu regardé ce que générait comme requête ton code ?
Fais en un Echo et testes la en direct dans ta bdd

// On sépare la requete de son execution
// Et on y fait de la mise en forme pour qu'elle soit plus lisible !
$sql = "INSERT INTO avis (id_avis
                                    ,id_salle
                                    ,id_membre
                                    ,note
                                    ,date
                                    ,commentaire)
  SELECT '.mysql_insert_id().'
                                    ,m.id_membre
                                    ,m.pseudo
                                    ,s.id_salle
                                    ,now()
                                    ,s.titre
  FROM  membre m
           , salle s
  WHERE m.id_membre = id_membre
  AND s.id_salle = id_salle ";

// Affichage de la requête
echo $sql;

// execution de la requête
$requete = executeRequete($sql);
   


PS : au passage... se serait surement bien de nous donner le code de ta fonction "executeRequete()"


Pour ce qui est du souci... je pense que ça vient du fait que tu essais de mettre un ID dans ta table avis... alors que c'est un champ auto incrémenté...ça se gère tout seul !!
'id_avis' int(5) NOT NULL AUTO_INCREMENT, 


Je pense aussi que tu ne récupères pas les "bons" champs... ceux qui correspondent à ce que tu veux insérer dans ta bdd...
D'un côté du demande (dans cet ordre) les champs :
id_avis
,id_salle
,id_membre
,note
,date
,commentaire

Et de l'autre.. tu lui donnes (dans cet ordre)
'.mysql_insert_id().'
,m.id_membre
,m.pseudo
,s.id_salle
,now()
,s.titre

... donc.... s.id_salle .... celon toi..va dans le champ note
...id_membre dans pseudo....
...m.id_membre dans... id_salle.... ????


Avant de poser une question, merci de lire la charte du site.
Cordialement, Jordane
0
pharelka Messages postés 6 Date d'inscription mardi 29 juillet 2014 Statut Membre Dernière intervention 29 août 2014
Modifié par pharelka le 28/08/2014 à 20:03
AU fait ce que je cherche c'est de récupérer les ID de la table membre et de la table salle, afin de pouvoir afficher le pseudo du membre(de la table MEMBRE)qui laisse un commentaire d'appréciation à propos de la salle qu'il a loué, le nom de la salle qu'est la colonne titre (de la table SALLE), le commentaire, la note et la date (de la table AVIS), j'ai crée cette requête dans le but de récupérer les informations contenues dans les 3 tables, mais pour cela j'ai besoin des ID pour la jointure dans SELECT, il faudra faire la requête d'insertion dans la table AVIS lorsque le formulaire sera validé...

Voici la fonction qui se trouve dans le fichier fonctions et je fais un require_once() pour l'appel de cette fonction
____________________________________
/*j'évite d'utiliser pour la requête $resultat pcq hormis ce code il y a d'autres scripts qui permettent de faire autre chose dans la page et à la place j'ai mis $res pour faire des tests facilement */

function executeRequete($req)
{
global $mysqli;
$resultat = $mysqli->query($req);
if(!$resultat)
{
die('Erreur sur la requete.<br/> : ' .$mysqli->error.'<br/>');
}
return $resultat;
}
__________________________________
j'ai modifié la requête pour respecter les colonnes de la table AVIS:
celle-ci fonctionne à moitié, mais en dupliquant l'enregistrement contenu dans la table, l'enregistrement que j'ai rentré manuellement dans la table AVIS sans les ID de la table SALLE et MEMBRE...
Dans la console MYSQL J'ai testé la portion de la requête SELECT elle m'affiche bien toutes les infos, mais lorsque j'utilise le formulaire en ligne rien ne fonctionne.

Je ne sais pas s'il y a une autre méthode qui permet de résoudre ça...



//la requête que j'ai modifié

$sql = executeRequete("INSERT INTO avis(id_avis,id_salle,id_membre,note,date,commentaire)
SELECT 'last_insert_id()',m.pseudo,s.titre,a.note,now(),a.commentaire
FROM membre m, salle s,avis a
WHERE m.id_membre = a.id_membre
AND s.id_salle = a.id_salle ");

0
jordane45 Messages postés 38144 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 21 avril 2024 344
28 août 2014 à 22:15
//la requête que j'ai modifié
C'est dommage.. tu n'as pas tenu compte de mes remarques concernant :
1 - La présentation de la requête avec des retours à la ligne
2 - De ne pas la mettre DIRECTEMENT dans ta fonction executeRequete() ... afin de pouvoir en faire un ECHO !

Donc je réitère....

Peux tu, si tu souhaites avoir de l'aide, TESTER ce bout de code... ET NOUS DIRE.. ce que donne le ECHO de ta requête ?

$requete = " INSERT INTO avis ( id_avis
				,id_salle
				,id_membre
				,note
				,date
				,commentaire
				)
		   SELECT 'last_insert_id()'
				  ,m.pseudo
				  ,s.titre
				  ,a.note
				  ,now()
				  ,a.commentaire
		   FROM  membre m
				,salle s
				,avis a
		   WHERE m.id_membre = a.id_membre
		   AND s.id_salle = a.id_salle ";

// AFFICHE LA REQUETE :
echo "<br><b>REQUETE => </b><br>".$requete."<br>";
$sql = executeRequete($requete);


Au passage....

Tu as encore, je pense une anomalie dans ta requête...(à moins que le "nom" des champs ne corresponde pas à ce qu'il semble être)..
Encore un coups... tu insère (du moins tu essayes) dans la table AVIS les champs : id_salle , id_membre les champs (venant de ton select ) : m.pseudo ,s.titre

.... Je ne pense pas qu'un PSEUDO soit un ID de Salle... ni qu'un TITRE ne soit un ID de membre... !!!!


0
pharelka Messages postés 6 Date d'inscription mardi 29 juillet 2014 Statut Membre Dernière intervention 29 août 2014
29 août 2014 à 00:51
// AFFICHE LA REQUETE :

echo "<br><b>REQUETE => </b><br>".$requete."<br>";
$sql = executeRequete($requete);

Avec echo j'ai testé : Ceci génère encore une erreur fatale...
Jordane, essaie de regarder le création des tables j'ai bien expliqué et avec last_insert_id() ou mysql_insert_id dans select j'essaie de récupérer les id des tables membre et salle par la jointure afin de pouvoir afficher toutes les informations du formulaire...
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
jordane45 Messages postés 38144 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 21 avril 2024 344
Modifié par jordane45 le 29/08/2014 à 01:39
Jordane, essaie de regarder le création des tables j'ai bien expliqué
Soyons clair... pour l'instant je ne corrige pas ta requête ... j'essaie de te faire trouver ses éventuelles erreurs !


Bon... reprenons....
Avec echo j'ai testé : Ceci génère encore une erreur fatale...
Cela te génère une erreur fatale .... surement pas lors de l'affichage de la requête...(mais surement lors de son éxécution..)

Donc si tu as une erreur.... déjà.. il serait bien de nous la donner (message d'erreur EXACTE dans son INTEGRALITE ! )

Ensuite... pour tester ta requête en "direct" dans ta BDD je t'invite à passer par ( par exemple ) http://codes-sources.commentcamarche.net/faq/10778-heidisql-tester-ses-requetes-sql

dans select j'essaie de récupérer les id des tables membre et salle par la jointure afin de pouvoir afficher toutes les informations du formulaire...
....c'est ce que tu souhaites faire...surement... mais ce n'est pas ce que tu fais en réalité !!!!

=> au passage... ta requête fait un INSERT ... elle ne te permet pas d'afficher quoi que ce soit !

J'aimerai bien que tu modifies ta requête en tenant compte de mes remarques précédentes concernant les champs que tu essaies d'insérer dans ta table AVIS....
Si tu relis ta requête.... tu vois bien que tu essais de mettre du TEXTE dans des champs de type INTEGER ... non ???

D'un côté tu as :
'id_salle' int(5) NOT NULL,
'id_membre' int(5) NOT NULL,

De l'autre :
'titre' varchar(200) NOT NULL,
'pseudo' varchar(15) DEFAULT NULL,

Je le répète encore une fois... COMMENT COMPTE TU FAIRE ENTRER UN PSEUDO OU UN TITRE ( autrement dit..du texte)...DANS UN CHAMP NUMERIQUE ??????????


En conclusion :

1 - Tu corriges ta requête (en tenant compte de mes remarques !)
2 - Tu la testes en directe dans ta BDD
3 - Si tu as encore un message d'erreur :
a) - Tu nous montre ta requête modifiée (le code de ta requête)
b) - Tu affiches la requête ( générée sur ta page WEB via le echo ) et tu nous la montre
c) Tu nous donnes le message d'erreur EXACTE !


Avant de poser une question, merci de lire la charte du site.
Cordialement, Jordane
0
Rejoignez-nous