PHP|Débutant :: Forums

Advertisement

Besoin d'aide ? N'hésitez pas, mais respectez les règles

Vous n'êtes pas identifié(e).

#1 29-08-2010 22:50:15

BloodyM
Membre
Inscription : 29-08-2010
Messages : 5

Question de syntaxe... je suppose

Bonsoir,

Totalement novice en programmation, je suis dans un petit projet perso de bdd PHP/MySQL dans laquelle je répertorie tous mes CD, MP3 et vinyles.

J'ai trois tables différentes dans la Base "music":

****cds****
    (id) - Artiste - Album - Année - Genre - Pays - Label
    ****mp3s****
    (id) - Artiste - Album - Année - Genre
    ****vinyles****
    (id) - Artiste - Album - Année - Genre - Pays - Label

Le tout est affiché sur 3 pages PHP différentes.
Voici ce que je souhaite faire:
Ma on tableau s'affiche de cette manière:

Artiste A - Album 1 - Année...
    Artiste A - Album 3 - Année...
    Artiste B - Album 9 - Année...
    ...

En cliquant sur le lien Artiste A par exemple, uniquement les entrées de cet artistes s'affichent. Pareil pour Année...

Voici mon code actuel récupéré sur un autre site:
       


<?php
$db = mysql_connect('localhost', 'root', '');
 
mysql_select_db('music',$db);
 
$order = (iSset($_GET['ordre']) ? $_GET['ordre'] : null);
$tri = (iSset($_GET['tri']) ? " ORDER BY " . $_GET['tri'].' '. $order : null);
$ARTISTE = (iSset($_GET['ARTISTE']) ? $_GET['ARTISTE'] : null);
 
$requete  = "SELECT artiste,album,année,genre,pays,label FROM vinyles";
if ( $ARTISTE != null) { // on ajoute le critère que s'il est demandé
  $requete  .= " WHERE ARTISTE=" .$ARTISTE; // Nota: si ARTISTE est numérique, il ne faut pas le délimiter avec des apostrophes en SQL
}
$requete .=  $tri;
$resultat = mysql_query($requete) or die('Erreur SQL !'.$requete.'<br>'.mysql_error());
 
 
//TABLEAU
echo '<table border="0">';
echo '<thead>';
echo '<tr>
    <th>Artiste <a href="?view=vinyle&tri=ARTISTE&ordre=asc"><img src="img/triDOWN.png"></a><a href="?view=vinyle&tri=ARTISTE&ordre=desc"> <img src="img/triUP.png"></a></th>
    <th>Album <a href="?view=vinyle&tri=ALBUM&ordre=asc"><img src="img/triDOWN.png"></a><a href="?view=vinyle&tri=ALBUM&ordre=desc"> <img src="img/triUP.png"></a></th>
    <th>Année <a href="?view=vinyle&tri=ANNéE&ordre=asc"><img src="img/triDOWN.png"></a><a href="?view=vinyle&tri=ANNéE&ordre=desc"> <img src="img/triUP.png"></a></th>
    <th>Pays <a href="?view=vinyle&tri=PAYS&ordre=asc"><img src="img/triDOWN.png"></a><a href="?view=vinyle&tri=PAYS&ordre=desc"> <img src="img/triUP.png"></a></th>
    <th>Genre <a href="?view=vinyle&tri=GENRE&ordre=asc"><img src="img/triDOWN.png"></a><a href="?view=vinyle&tri=GENRE&ordre=desc"> <img src="img/triUP.png"></a></th>
    <th>Label <a href="?view=vinyle&tri=LABEL&ordre=asc"><img src="img/triDOWN.png"></a><a href="?view=vinyle&tri=LABEL&ordre=desc"> <img src="img/triUP.png"></a></th>
     
    </tr>'
;
    '</thead>';
 
// on fait une boucle qui va faire un tour pour chaque enregistrement
while($data = mysql_fetch_assoc($resultat))
    {
    // on affiche les informations de l'enregistrement en cours
        echo '<tr><td>[b]<a href="?view=vinyle&ARTISTE=????????">[/b]'.$data['artiste'].'</a></td><td>'.$data['album'].'</td><td align="center">'.$data['année'].'</td><td align="center">'.$data['pays'].'</td><td align="center">'.$data['genre'].'</td><td align="center">'.$data['label'].'</td></tr>';
    }
'</table>';
// on ferme la connexion à mysql
mysql_close();
?>

J'ai bien remarqué le Nota: si ARTISTE est numérique, il ne faut pas le délimiter avec des apostrophes en SQL et je crois que c'est ce qui change tout puisque ARTISTE est en texte. En effet, si dans mon navigateur je tape: ?view=vinyle&ARTISTE='test' ça fonctionne mais si j'enlève les guillemets ' ' ça ne fonctionne plus.
J'ai essayé de placer des guillemets et modifier la syntaxe de toutes les manières mais rien ne fonctionne...

Et sinon je n'arrive pas non plus à faire mon lien (là où j'ai mis en Bold dans le texte).
J'ai essayé des trucs du genre

&ID_AUTEUR=<?php echo $ARTISTE; ?>

mais ça reste dans le même état dans le navigateur...

Merci d'avance si vous pouvez me filer un coup de main. J'ai eccumé plusieurs forums spécialisés mais comme bien souvent, ne ne répond pas... pourtant le problème doit être un léger défaut de syntaxe je pense mais je suis tellement néophyte à PHP et MySQL...

Dernière modification par BloodyM (29-08-2010 22:50:38)

Hors ligne

#2 30-08-2010 01:26:35

moogli
Modérateur
Inscription : 08-05-2009
Messages : 336
Site Web

Re : Question de syntaxe... je suppose

salut,

une petite chose avant tout, la syntaxe est généralement en minuscule donc isset et non iSset smile.

Pour le reste j'avoue ne pas avoir saisi ton problème.

je commence par la fin : tu met $ID_auteur=<?php echo $artiste; ?> j'y vois un problème car en général ce que l'on nom ID c'est la clef primaire d'une table et non le nom de l'artiste.

cette syntaxe est bonne si tu utilise une table artiste indépendante des autres tables.

Pour ce qui est des ' dans l'url c'est assez simple. MySQL considère que tous ce qui est entre ' est une chaine de caractère, donc '4' est différent de 4 qui est un entier. MySQL n'a pas besoin que l'on utilise de ' pour un nombre, par contre cela est obligatoire pour une chaine de caractère (comme le nom de l'artiste). dans ta requête il n'y a nulle part de ' pour délimiter cette chaine de caractère. lorsque tu les met dans l'url c'est comme si tu les avais mise dans le code car la chaine de caractère est 'nomdelartiste' (quote comprise).
la requete devrait être $requete  .= '\' WHERE ARTISTE=\'' .$ARTISTE.'\'';

Ceci te montre au passage un trou de sécurité, et m'indique que le paramètre magic_quote de ton php est désactivé (ce n'est pas une mauvaise chose).
Plus d'info sur le sujet dans les articles de Fred => la magie noire des apostrophes magiques.

pour ton application j'aurais fait de la manière suivante

1 table labels qui va contenir les nom des labels différents
id clef primaire
nom varchar (par exemple)

1 table pays
id clef primaire
nom varchar

1 table genres
id clef primaire
nom varchar

1 table typesSupports
id clef primaire
nom (cd / vynil etc)

1 table artistes
id clef primaire
nom
prenom (si besoin)
idPays
etc

une table albums
id clef primaire
nom varchar / tinytext
annee date / tinytext
idAuteur
idGenre
idPays
idLabel
idsupport

même genre pour la table mp3

Pourquoi autant de table ?

Parce que si tu t'est trompé dans le nom d'un label c'est pas 70 corrections à faire mais une (ce qui se fait facilement a partir d'une page web), idem pour le pays, genre etc.
Cela évite aussi les doublons (genre ; France / france, Folk / folk, label a neuneu / Label de Neuneu etc).
autre chose, les données seront présente une seule fois dans la base ce qui est un gain de place au total.

Contre ? les requêtes deviennent plus compliquées wink pour cela http://sqlpro.developpez.com/cours/sqlaz/jointures/

@+


Il en faut peu pour être heureux pompompompompompompompompompompom

Hors ligne

#3 30-08-2010 11:40:31

BloodyM
Membre
Inscription : 29-08-2010
Messages : 5

Re : Question de syntaxe... je suppose

Bonjour moogli et merci pour ta réponse.
Ça me paraît très complet et les indications que tu me donnes semblent plus logiques que ce que j'ai fait actuellement. Donc il va falloir que je repense ma bdd si je comprends bien. Je vais essayer tout ça et reviendrai par ici pour retourner le résultat obtenu.
Encore merci wink

Hors ligne

#4 30-08-2010 16:03:01

BloodyM
Membre
Inscription : 29-08-2010
Messages : 5

Re : Question de syntaxe... je suppose

Ça-y-est, j'ai mis en place le gros de la structure de la base de données ainsi que la requête principale et de tri.
Ça va me demander un gros boulot de saisie pour spécifier chaque champ par rapport à ma (mauvaise) méthode précédente puisque ma bdd était générée par un fichier .csv depuis le petit logiciel Melomania. Pour ça que j'avais utilisé cette méthode.
Mais tant pis, si ça me permet d'obtenir ce que je veux je serai gagnant à force de patience!

Merci beaucoup moogli pour ton aide très précieuse et l'excellent lien que tu m'as fourni. Ce petit travail m'a demandé d'acquérir une certaine logique d'esprit ardue au départ mais finalement très intéressante.

Je serai probablement de retour lorsque je rencontrerai d'autres problèmes wink

Hors ligne

#5 31-08-2010 06:03:38

moogli
Modérateur
Inscription : 08-05-2009
Messages : 336
Site Web

Re : Question de syntaxe... je suppose

mas de rien ce fut un plaisir smile

pour ce qui est de l'insertion dans les tables depuis un fichier csv, ça peut être un bon exercie wink

@+


Il en faut peu pour être heureux pompompompompompompompompompompom

Hors ligne

#6 31-08-2010 14:17:35

BloodyM
Membre
Inscription : 29-08-2010
Messages : 5

Re : Question de syntaxe... je suppose

Il n'aura pas fallu attendre longtemps pour que je revienne demander conseils wink

J'ai donc fait un formulaire pour insérer les objets et qui fonctionne:

// On récupère les champs
if(isset($_POST['artiste']))      $artiste=$_POST['artiste'];
else      $artiste="";

if(isset($_POST['album']))      $album=$_POST['album'];
else      $album="";

if(isset($_POST['annee']))      $annee=$_POST['annee'];
else      $annee="";

if(isset($_POST['genre']))      $genre=$_POST['genre'];
else      $genre="";

if(isset($_POST['pays']))      $pays=$_POST['pays'];
else      $pays="";

if(isset($_POST['label']))      $label=$_POST['label'];
else      $label="";

if(isset($_POST['support']))      $support=$_POST['support'];
else      $support="";

    $db = mysql_connect('localhost', 'root', '');  // connexion à la base
    mysql_select_db('mymusic',$db);                // sélection de la base
   
//REQUETE GENRE
        $sql = "INSERT INTO genre(id,genre) VALUES('','$genre')";
        mysql_query($sql) or die( mysql_error() ) ;
        $idgenre = mysql_insert_id();  
//REQUETE ANNEE
        $sql = "INSERT INTO album(annee) VALUES('$annee')";
        mysql_query($sql) or die( mysql_error() ) ;
//REQUETE LABEL
        $sql = "INSERT INTO label(id,label) VALUES('','$label')";  
        mysql_query($sql) or die( mysql_error() ) ;
    $idlabel = mysql_insert_id();
//REQUETE PAYS
        $sql = "INSERT INTO pays(id,pays) VALUES('','$pays')";   
        mysql_query($sql) or die( mysql_error() ) ;
    $idpays = mysql_insert_id();
//REQUETE ARTISTE
        $sql = "INSERT INTO artiste(id,artiste,idpays) VALUES('','$artiste','$idpays')";   
        mysql_query($sql) or die( mysql_error() ) ;
        $idartiste = mysql_insert_id();
//REQUETE SUPPORT (depuis un champ de formulaire Select
        $sql = "INSERT INTO support(id,support) VALUES('','$support')";  
        mysql_query($sql) or die( mysql_error() ) ;
//REQUETE ALBUM FINALE
      $sql = "INSERT INTO album(idartiste,album,annee,idgenre,idlabel,idsupport) VALUES('$idartiste','$album','$annee','$idgenre','$idlabel','$support')"; 
        mysql_query($sql) or die( mysql_error() ) ;
 
// on affiche le résultat pour le visiteur
        echo($album) && ($artiste); echo ' ajouté dans la base de données';

    mysql_close();  // on ferme la connexion

Cependant, je pense que j'utilise mysql_insert_id(); à mauvais escient ou bien l'origine est autre puisque à chaque ajout, il insère une nouvelle ID, même si l'objet existe déjà.
Par exemple, j'ai dans ma table le label 'Sub Pop' avec l'id=2 et si je rentre dans mon champ label 'Sub Pop' il va créer une nouvelle ID... et c'est donc tout le contraire de ce que je désire sad

J'ai essayé NOT EXISTS et NOT IN de bien des manières mais rien n'agit convenablement...

L'apprentissage de php/MySQL est aussi celui de la patience... wink

Dernière modification par BloodyM (31-08-2010 14:19:43)

Hors ligne

#7 03-09-2010 23:08:08

BloodyM
Membre
Inscription : 29-08-2010
Messages : 5

Re : Question de syntaxe... je suppose

Là je suis définitivement perdu pour mon formulaire. J'ai utilisé la conditionnelle If pour retrouver ce qui existe et ce qui existe pas pour chaque champ et donc écrire et/ou récupérer une nouvelle ID. Quand un objet n'existe pas, il me le créé convenablement mais lorsqu'il existe déjà, PHP enregistre plusieurs lignes partiellement renseignées dans MySQL. Je vous donne le code à l'heure actuelle mais j'ai testé tellement de trucs qu'à certains endroits ça ne ressemble plus à rien...

<?php
if (isset ($_POST['envoyer'])){
// On récupère les champs
$artiste=$_POST['artiste'];
$album=$_POST['album'];
$annee=$_POST['annee'];
$genre=$_POST['genre'];
$pays=$_POST['pays'];
$label=$_POST['label'];
$support=$_POST['support'];


    $db = mysql_connect('localhost', 'root', '');  // connexion à la base
    mysql_select_db('mymusic',$db);                // sélection de la base
   
//REQUETE GENRE
        $sql = "SELECT id FROM genre WHERE genre = '$genre' ";
        $req = mysql_query($sql) or die('Erreur SQL !'.$sql.'<br>'.mysql_error());
        $res = mysql_num_rows($req);
        if($res!=0) {
        $sql = "INSERT INTO album(idgenre) SELECT id FROM genre
WHERE genre = '$genre'";
        $idgenre = mysql_insert_id();
        } else {
        $sql = "INSERT INTO genre(id,genre) VALUES('','$genre')"; }
        mysql_query($sql) or die('Erreur SQL !'.$sql.'<br>'.mysql_error());        
        $idgenre = mysql_insert_id();  
//REQUETE ANNEE
        $sql = "INSERT INTO album(annee) VALUES('$annee')";
//REQUETE LABEL
        $sql = "SELECT id FROM label WHERE label = '$label' ";
        $req = mysql_query($sql) or die('Erreur SQL !'.$sql.'<br>'.mysql_error());
        $res = mysql_num_rows($req);
        if($res!=0) {
        $sql = "INSERT INTO album(idlabel) SELECT id FROM label
        WHERE label = '$label'";
        } else {
        $sql = "INSERT INTO label(id,label) VALUES('','$label')"; }
        mysql_query($sql) or die('Erreur SQL !'.$sql.'<br>'.mysql_error());        
        $idlabel = mysql_insert_id();  
//REQUETE PAYS
        $sql = "SELECT id FROM pays WHERE pays = '$pays' ";
        $req = mysql_query($sql) or die('Erreur SQL !'.$sql.'<br>'.mysql_error());
        $res = mysql_num_rows($req);
        if($res!=0) {
        $sql = "INSERT INTO artiste(idpays) (SELECT id FROM pays
        WHERE pays = '$pays')";
        } else {
        $sql = "INSERT INTO pays(id,pays) VALUES('','$pays')"; }
        mysql_query($sql) or die('Erreur SQL !'.$sql.'<br>'.mysql_error());        
        $idpays = mysql_insert_id();
//REQUETE ARTISTE
        $sql = "SELECT id FROM artiste WHERE artiste = '$artiste' ";
        $req = mysql_query($sql) or die('Erreur SQL !'.$sql.'<br>'.mysql_error());
        $res = mysql_num_rows($req);
        if($res!=0) {
        $sql = "INSERT INTO album(idartiste) SELECT id FROM artiste
        WHERE artiste = '$artiste'";
        } else {
        $sql = "INSERT INTO artiste(id,artiste,idpays) VALUES('','$artiste','$idpays')"; }
        mysql_query($sql) or die('Erreur SQL !'.$sql.'<br>'.mysql_error());        
        $idartiste = mysql_insert_id();  
//REQUETE ALBUM FINALE
        $sql =
"??????????????????????????????????????????????????????????????????????";
        $req = mysql_query($sql) or die('Erreur SQL !'.$sql.'<br>'.mysql_error());
        $res = mysql_num_rows($req);
        if($res!=0) {
        $sq= "??????????????????????????????????????????????????????????";
        } else {
        $sql = "INSERT INTO album(idartiste,album,annee,idgenre,idlabel,idsupport) VALUES('$idartiste','$album','$annee','$idgenre','$idlabel','$support')";    }
        mysql_query($sql) or die( mysql_error() ) ;
   
// on affiche le résultat pour le visiteur
        echo htmlspecialchars($_POST['album']); echo htmlspecialchars($_POST['artiste']); echo ' ajouté dans la base de données';

    mysql_close();  // on ferme la connexion
}
?>

Je vous en prie, 3 jours que je bloque là dessus!!!

Dernière modification par BloodyM (03-09-2010 23:10:50)

Hors ligne

Pied de page des forums