Page 1 sur 2

Appel de données de 2 tables par liste déroulante

Posté : 17 mars 2006, 22:02
par Stegue
Bonjour,
Grand débutant en PHP, je récupère des scripts que j'adapte à ma situation et évidemment, dès que ça coince, rien ne va plus!

Voilà, j'ai 2 tables, citateurs_celebres et citations_celebres.
j'ai réussi à adapter un script qui m'apelle les citations (de la table citations_celebres) en les associant aux nons et prénom de son auteur (de la table citateurs_celebres) avec un LEFT JOIN.

ce que je souhaiterai, c'est afficher les citations d'un auteur choisi dans une liste déroulante.
J'ai donc, d'un côté une page avec la liste des auteurs qui s'alimente avec la table citateurs_celebres:( ça, ça marche)
<form name="form" method="post" action="rechparauteur.php"/> 
<?php
// Lancement de la requête de sélection des données de la tables
$requete_sql = "SELECT nom, prenom FROM citateurs_celebres ORDER BY nom ASC";

// Execution de la requete $requete_sql
$sql = mysql_query($requete_sql) or die(mysql_error());

// Association des cellules a la variable $sql_row
$sql_row = mysql_fetch_assoc($sql);

// Ici on compte le nombre de cellules retournées par notre requete
$sql_num_rows = mysql_num_rows($sql);
?>

<select name="auteur">

<?
     do
     {
?>

    <option value="<?php echo $sql_row['nom'];?>"><?php echo $sql_row['nom']?>
    <?php echo $sql_row['prenom'];?></option>
<?
    }

        while ($sql_row = mysql_fetch_assoc($sql));
              $rows = mysql_num_rows($sql);
              if($rows > 0) {
              mysql_data_seek($sql, 0);
              $row_sql = mysql_fetch_assoc($sql);
    }
?>

</select>
<input type="submit" name="submit" value="Envoyer" /> 
<?
// Fermeture de la conneciton à la base de données
@mysql_close($connection);?>

Et de l'autre, ma page résultat que j'essaie d'adapter suivant le choix de ce menu mais j'ai une erreur mysql_fetch_array.

Voici ma 2eme page:
$nom = $_POST["auteur"];

$reponse = mysql_query("SELECT citateurs_celebres.nom, citateurs_celebres.prenom, citations_celebres.citation FROM citateurs_celebres LEFT JOIN citations_celebres ON citateurs_celebres.id = citations_celebres.numcitateur WHERE citateurs_celebres.nom=$nom"); 

echo mysql_error();
// On fait une boucle pour lister tout ce que contient la table :

while ($donnees = mysql_fetch_array($reponse) )
{
?>

<p>
<?php echo $donnees['citation']; ?><br />

 </em>
</p>

<?php
}
// On a fini de travailler, on ferme la connexion :
mysql_close(); // Déconnexion de MySQL
?>

Posté : 17 mars 2006, 22:09
par Truc
Salut,

Bienvenue, puisque tu t'es inscrit tu peux éditer ton post et englober le code entre [ php] (bouton au dessus) au lieu de mettre de la couleur toi même, c'est plus lisible :wink:

ensuite lorsque tu as une erreur de "mysql_fetch_array" la requête ne doit pas être bonne, complète. Pour vérifier ça affiche la tout simplement:
 $sql = "SELECT citateurs_celebres.nom, citateurs_celebres.prenom, citations_celebres.citation FROM citateurs_celebres LEFT JOIN citations_celebres ON citateurs_celebres.id = citations_celebres.numcitateur WHERE citateurs_celebres.nom=".$nom;
echo $sql;
$reponse = mysql_query($sql);  


Si les deux codes se suivent sur la même page normal qu'il y ait une erreur puisque la varaible $_POST["auteur"] n'existe pas faut effectuer un test avec isset()

Posté : 17 mars 2006, 22:27
par Stegue
J'ai du faire une erreur car ma page résultat affiche ça:

SELECT citateurs_celebres.nom, citateurs_celebres.prenom, citations_celebres.citation FROM citateurs_celebres LEFT JOIN citations_celebres ON citateurs_celebres.id = citations_celebres.numcitateur WHERE citateurs_celebres.nom=Audiard

(audiart est le nom selectionné dans la liste)

Posté : 17 mars 2006, 23:16
par Truc
le nom est une chaine de caratères, il manque donc des apostrophes pour la délimiter.
WHERE citateurs_celebres.nom= '".$nom."'"; 

Posté : 17 mars 2006, 23:32
par Stegue
J'ai toujours la même chose mais avec le nom de l'auteur entre guillemets.
$nom = $_POST["auteur"];

$sql = "SELECT citateurs_celebres.nom, citateurs_celebres.prenom, citations_celebres.citation FROM citateurs_celebres LEFT JOIN citations_celebres ON citateurs_celebres.id = citations_celebres.numcitateur WHERE citateurs_celebres.nom='".$nom."'";

echo $sql;
$reponse = mysql_query($sql);

// On a fini de travailler, on ferme la connexion :
mysql_close(); // Déconnexion de MySQL
?>

Posté : 17 mars 2006, 23:42
par Truc
Toujours une erreur ?

fait un copier / coller de la requete générée dans phpmyadmin, par exemple, pour verifier qu'elle retourne bien un résultat.

Ajoute un message d'erreur:
$reponse = mysql_query($sql) or die('Erreur SQL !<br />'.$sql.'<br />'.mysql_error());; 

Posté : 17 mars 2006, 23:51
par Stegue
Dans MyPHPadmin, Mysql a repondu:

#1064 - You have an error in your SQL syntax. Check the manual that corresponds to your MySQL server version for the right syntax to use near '$sql = "SELECT citateurs_celebres.nom, citateurs_celebres.preno

J'ai ensuite mis les messages d'erreurs mais il n'apparaissent pas. J'ai toujours la même chose: SELECT ....

Par contre, en ce qui concerne isset(), je sèche.

Posté : 18 mars 2006, 00:01
par Truc
Dans MyPHPadmin, Mysql a repondu:

#1064 - You have an error in your SQL syntax. Check the manual that corresponds to your MySQL server version for the right syntax to use near '$sql = "SELECT citateurs_celebres.nom, citateurs_celebres.preno
la requête générée :wink:
celle qui s'affiche à l'écran suite au "echo" donc pas de $sql ni de varaibles dans phpmyadmin.

Pour le isset(), tu inclus la 2eme partie de ton code dans ce test:
if(isset($_POST["auteur"]))
{
$nom = $_POST["auteur"];
...
}

Posté : 18 mars 2006, 08:23
par Stegue
la requête générée
celle qui s'affiche à l'écran suite au "echo" donc pas de $sql ni de varaibles dans phpmyadmin.
:( je sens que mon inexpérience va te faire perdre patience, désolé. :wink:

Donc j'ai rectifié et voici ce que dit MyPHPadmin:

Votre requête SQL a été exécutée avec succès (traitement: 0.0009 sec.)

Par contre, avec isset, j'ai le même résultat.

Posté : 18 mars 2006, 11:53
par Truc
:( je sens que mon inexpérience va te faire perdre patience, désolé. :wink:
T'en fait pas :wink:
La requete est donc bien exécutée et normalement tu dois avoir un tableau avec les résultats en dessous (dans phpmyadmin)

Pour le isset montre nous ce que tu as fait.

Posté : 18 mars 2006, 13:34
par Stegue
En fait, je n'utilise pas PHPmyadmin en local mais sur le serveur de mon hébergeur. C'est peut-être pour ça que je n'ai pas le tableau dont tu parles.

et pour isset voici ma page:
<?php
mysql_connect("mysql4.8", "xxxxxx", "xxxxxxx"); //connexion à la base
mysql_select_db("citation"); // Sélection de la base citation
// On est connectés, on peut travailler sur la BDD

if(isset($_POST["auteur"]))
{
$nom = $_POST["auteur"];


$sql = "SELECT citateurs_celebres.nom, citateurs_celebres.prenom, citations_celebres.citation FROM citateurs_celebres LEFT JOIN citations_celebres ON citateurs_celebres.id = citations_celebres.numcitateur WHERE citateurs_celebres.nom='".$nom."'";

echo $sql;
$reponse = mysql_query($sql) or die('Erreur SQL !<br />'.$sql.'<br />'.mysql_error());;

}
// On a fini de travailler, on ferme la connexion :
mysql_close(); // Déconnexion de MySQL
?>

Posté : 18 mars 2006, 13:45
par Truc
dans ton code il manque la partie affichage de la requête:
<?
if(isset($_POST["auteur"]))
{
   $nom = $_POST["auteur"];


   $sql = "SELECT citateurs_celebres.nom, citateurs_celebres.prenom, citations_celebres.citation FROM citateurs_celebres LEFT JOIN citations_celebres ON citateurs_celebres.id = citations_celebres.numcitateur WHERE citateurs_celebres.nom='".$nom."'";

   echo $sql;
   $reponse = mysql_query($sql) or die('Erreur SQL !<br />'.$sql.'<br />'.mysql_error());

   while ($donnees = mysql_fetch_array($reponse) )
   {
      echo $donnees['citation']."<br />";
   }
}
// On a fini de travailler, on ferme la connexion :
mysql_close(); // Déconnexion de MySQL
?>
Pour phpmyadmin, pas imporatnt que tu teste en local ou en ligne le plus important est de remplir la base. Si phpmyadmin ne donne pas de tableau de resultat cela signifi que tu n'as pas de données qui correspondent aux critères de recherche, ici le nom ou les jointures (citateurs_celebres.id = citations_celebres.numcitateur).

Posté : 18 mars 2006, 14:13
par Stegue
Pourtant, j'ai une autre page pour appeler les citations mais sans critères de choix et ça marche.
Voici:
$reponse = mysql_query("SELECT citateurs_celebres.nom, citateurs_celebres.prenom, citations_celebres.citation FROM citateurs_celebres LEFT JOIN citations_celebres ON citateurs_celebres.id = citations_celebres.numcitateur ORDER BY citateurs_celebres.nom ASC LIMIT 0, 5"); 

echo mysql_error();
// On fait une boucle pour lister tout ce que contient la table :

while ($donnees = mysql_fetch_array($reponse) )
{
?>

<p>
<?php echo $donnees['citation']; ?><br />
<?php echo $donnees['prenom']; ?> <?php echo $donnees['nom']; ?>
 </em>
</p>

<?php
}
// On a fini de travailler, on ferme la connexion :
mysql_close(); // Déconnexion de MySQL
?>
Et les citations s'affichent bien par 5 comme limité dans la requête.

Posté : 18 mars 2006, 14:34
par Truc
je suis un peu perdu la,
tu as une erreur ?
ou rien ne s'affiche ?

c'est étonnant que la requete ne renvois pas de résultats si le nom existe biendans le champ "nom"

Posté : 18 mars 2006, 14:40
par Stegue
Ca s'ameliore, maintenant ma page résultat affiche le nom de l'auteur et sa ou ses citations mais avec la requete. Comme ça.

SELECT citateurs_celebres.nom, citateurs_celebres.prenom, citations_celebres.citation FROM citateurs_celebres LEFT JOIN citations_celebres ON citateurs_celebres.id = citations_celebres.numcitateur WHERE citateurs_celebres.nom='Beigbeder'A New York les taxis sont jaunes, à Londres ils sont noirs et à Paris ils sont cons.

On est pas loin de la vérité.