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

Eléphant du PHP | 113 Messages

17 mars 2006, 22:02

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
?>
Modifié en dernier par Stegue le 17 mars 2006, 22:20, modifié 1 fois.

Modérateur PHPfrance
Modérateur PHPfrance | 7636 Messages

17 mars 2006, 22:09

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()

/!\ Avant de poster se documenter et rechercher.
Qui ne sait pas rendre un service n'a pas le droit d'en demander.
MaBrute

Eléphant du PHP | 113 Messages

17 mars 2006, 22:27

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)

Modérateur PHPfrance
Modérateur PHPfrance | 7636 Messages

17 mars 2006, 23:16

le nom est une chaine de caratères, il manque donc des apostrophes pour la délimiter.
WHERE citateurs_celebres.nom= '".$nom."'"; 

/!\ Avant de poster se documenter et rechercher.
Qui ne sait pas rendre un service n'a pas le droit d'en demander.
MaBrute

Eléphant du PHP | 113 Messages

17 mars 2006, 23:32

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
?>

Modérateur PHPfrance
Modérateur PHPfrance | 7636 Messages

17 mars 2006, 23:42

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());; 

/!\ Avant de poster se documenter et rechercher.
Qui ne sait pas rendre un service n'a pas le droit d'en demander.
MaBrute

Eléphant du PHP | 113 Messages

17 mars 2006, 23:51

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.

Modérateur PHPfrance
Modérateur PHPfrance | 7636 Messages

18 mars 2006, 00:01

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"];
...
}

/!\ Avant de poster se documenter et rechercher.
Qui ne sait pas rendre un service n'a pas le droit d'en demander.
MaBrute

Eléphant du PHP | 113 Messages

18 mars 2006, 08:23

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.

Modérateur PHPfrance
Modérateur PHPfrance | 7636 Messages

18 mars 2006, 11:53

:( 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.

/!\ Avant de poster se documenter et rechercher.
Qui ne sait pas rendre un service n'a pas le droit d'en demander.
MaBrute

Eléphant du PHP | 113 Messages

18 mars 2006, 13:34

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
?>

Modérateur PHPfrance
Modérateur PHPfrance | 7636 Messages

18 mars 2006, 13:45

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).

/!\ Avant de poster se documenter et rechercher.
Qui ne sait pas rendre un service n'a pas le droit d'en demander.
MaBrute

Eléphant du PHP | 113 Messages

18 mars 2006, 14:13

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.

Modérateur PHPfrance
Modérateur PHPfrance | 7636 Messages

18 mars 2006, 14:34

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"

/!\ Avant de poster se documenter et rechercher.
Qui ne sait pas rendre un service n'a pas le droit d'en demander.
MaBrute

Eléphant du PHP | 113 Messages

18 mars 2006, 14:40

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é.