IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage PHP Discussion :

Problème de syntaxe


Sujet :

Langage PHP

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2009
    Messages
    134
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2009
    Messages : 134
    Points : 47
    Points
    47
    Par défaut Problème de syntaxe
    Bonsoir,

    J'ai un problème avec une requête SQL.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    <?php
    	session_start();
    	if(isset($_POST['submit'])){
    		if(empty($_POST['recherche'])){
    			$erreur = 'Le champ recherche est vide';
    		}
    		else{
    			require 'config.php';
    			$connexion_sql = mysql_connect(DB_HOST,DB_LOGIN,DB_PASS); 
    			$connexion_bdd = mysql_select_db(DB_BDD);
     
    			$recherche = mysql_real_escape_string($_POST['recherche']);
     
    			$lecture = mysql_query("SELECT * FROM membre,article WHERE pseudo,titre,nom,prenom LIKE '%$recherche%'") or die;
    			$retour = mysql_fetch_array($lecture);
    			print_r($retour);
    		}
    	}
    ?>
    <form method="post">
    	<input type="text" name="recherche">
    	<input type="submit" name="submit">
    </form>
    La requête SQL suivante ne fonctionne pas.
    $lecture = mysql_query("SELECT * FROM membre,article WHERE pseudo,titre,nom,prenom LIKE '%$recherche%'") or die;

    Celle ci "die" à chaque fois.

    J'aimerais bien savoir là ou sa cloche. :/

    Merci.

  2. #2
    Membre habitué Avatar de zugolin
    Homme Profil pro
    Inscrit en
    Octobre 2007
    Messages
    267
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gironde (Aquitaine)

    Informations forums :
    Inscription : Octobre 2007
    Messages : 267
    Points : 164
    Points
    164
    Par défaut
    euhh...
    "SELECT * FROM membre,article " ... membre, article ... , c'est une table ?

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2009
    Messages
    134
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2009
    Messages : 134
    Points : 47
    Points
    47
    Par défaut
    Oui monsieur.

  4. #4
    Membre habitué Avatar de zugolin
    Homme Profil pro
    Inscrit en
    Octobre 2007
    Messages
    267
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gironde (Aquitaine)

    Informations forums :
    Inscription : Octobre 2007
    Messages : 267
    Points : 164
    Points
    164
    Par défaut
    j'avais fait une recherche sql qui voulait pas fonctionner et j'avais du repéter mes requetes comme ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    delete FROM `contact_autres`
    WHERE `emailcontact`  LIKE '%@aliceadsl.fr%'
    or  `emailcontact`  LIKE '%@aol.com%'
    or  `emailcontact`  LIKE '%@aol.fr%'
    etc...

    (j'suis pas au top, mais si je peux essayer d'aider...)

  5. #5
    Modérateur
    Avatar de sabotage
    Homme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    29 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2005
    Messages : 29 208
    Points : 44 155
    Points
    44 155
    Par défaut
    Sur le fond ta requete ne vas pas, tu mets deux tables sans jointure entre elles, tu vas donc recuperer toutes les combinaisons possibles entre les lignes des deux tables.

    Sinon pour l'erreur de syntaxe, il faut effectivement écrire la condition entière pour chaque champ.
    N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP

  6. #6
    Membre expert Avatar de RunCodePhp
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    2 962
    Détails du profil
    Informations personnelles :
    Localisation : Réunion

    Informations forums :
    Inscription : Janvier 2010
    Messages : 2 962
    Points : 3 947
    Points
    3 947
    Par défaut
    Pour le die, corrige comme ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $lecture = mysql_query(...) or die('ERREUR : '.mysql_error());
    Win XP | WampServer 2.2d | Apache 2.2.21 | Php 5.3.10 | MySQL 5.5.20
    Si debugger, c'est supprimer des bugs, alors programmer ne peut être que les ajouter [Edsger Dijkstra]

  7. #7
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2009
    Messages
    134
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2009
    Messages : 134
    Points : 47
    Points
    47
    Par défaut
    Plop,

    Merci pour vos réponses.

    En effet, j'ai ré-écrit la requête en suivant vos conseils :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $lecture = mysql_query("SELECT nom,prenom,titre,contenu FROM membre,articles WHERE pseudo LIKE '%$recherche%' OR titre LIKE '%$recherche%' OR nom LIKE '%$recherche%' OR prenom LIKE '%$recherche%'") or die('Erreur :'.mysql_error());
    Ca marche bien.

    Sabotage => Enfaite, je veux faire une sorte de mini moteur de recherche qui va chercher dans plusieurs le terme renseigné par l'utilisateur.

  8. #8
    Membre averti Avatar de BornBanane
    Homme Profil pro
    dev
    Inscrit en
    Mars 2007
    Messages
    284
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : dev

    Informations forums :
    Inscription : Mars 2007
    Messages : 284
    Points : 416
    Points
    416
    Par défaut
    Sans jointure ta requête va péter* dès que tu auras un certain nombre d'utilisateurs et/ou d'articles.

    * Prendre énormément de temps, ou ne pas se faire du tout.
    Smiley de Plomb 2009
    Anciennement FrancoisIT

  9. #9
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2009
    Messages
    134
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2009
    Messages : 134
    Points : 47
    Points
    47
    Par défaut on la fait plus courte
    Après renseignements, j'ai fais quelque chose comme ça, mais j'ai toujours ce même problème.

    $lecture = mysql_query("SELECT articles.titre,articles.contenu,membre.pseudo FROM membre,articles WHERE membre.pseudo LIKE '%$recherche%' OR articles.titre LIKE '%$recherche%' OR articles.contenu LIKE '%$recherche%'") or die('Erreur :'.mysql_error());

    Quand je fais une recherche avec pour mot clé Jean :

    Résultat de la recherche pour les pseudo :

    Jean

    Résultat de la recherche pour les pseudo :

    JeanJean

    Résultat de la recherche pour les pseudo :

    Jean

    Résultat de la recherche pour les pseudo :

    JeanJean

    etc.

  10. #10
    Membre expert
    Avatar de ThomasR
    Homme Profil pro
    Directeur technique
    Inscrit en
    Décembre 2007
    Messages
    2 230
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Directeur technique
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Décembre 2007
    Messages : 2 230
    Points : 3 972
    Points
    3 972
    Par défaut
    Bonjour,
    mais j'ai toujours ce même problème
    Quel problème ? Si tu as ces résultats qui s'affiche c'est que ta requête ne "die" plus donc ce n'est plus le même problème ?

    Quel est le comportement attendu ? Tu souhaites éviter les doublons ? Si oui utilises DISTINCT.

  11. #11
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2009
    Messages
    134
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2009
    Messages : 134
    Points : 47
    Points
    47
    Par défaut
    Autant pour moi. A force de me battre contre ce problème, j'ai cru que je vous en avait déjà parlé.

    J'ai essayé avec DISTINCT, mais j'ai aucun changement. :/

  12. #12
    Membre expert Avatar de RunCodePhp
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    2 962
    Détails du profil
    Informations personnelles :
    Localisation : Réunion

    Informations forums :
    Inscription : Janvier 2010
    Messages : 2 962
    Points : 3 947
    Points
    3 947
    Par défaut
    Si tu ne fais pas de jointure, ça ne va pas l'faire

    Faudrait que tu regarde la structure de tes tables "membre" et "article" pour faire la jointure.

    Un truc du genre peut être : ( avec JOIN ou INNER JOIN)
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT ... FROM membre JOIN article ON article.membre_id = membre.membre_id WHERE ...


    Ensuite, faut voir ce que tu recherche exactement.
    Si c'est uniquement des personnes en recherche par leur pseudo (donc ne pas vouloir les articles), alors faut pas faire allusion à la table "article" dans la requête, sinon il y aura autant de lignes que d'articles créés pour chaque personne.

    Si tu recherche tous les articles d'une personne d'après son pseudo, et bien si cette personne a plusieurs articles, il est normal que le pseudo se répète.

    Faut savoir ce que tu veux faire : Soit rechercher des personnes, soit des articles.
    Win XP | WampServer 2.2d | Apache 2.2.21 | Php 5.3.10 | MySQL 5.5.20
    Si debugger, c'est supprimer des bugs, alors programmer ne peut être que les ajouter [Edsger Dijkstra]

  13. #13
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2009
    Messages
    134
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2009
    Messages : 134
    Points : 47
    Points
    47
    Par défaut
    Je veux bien faire des jointures, mais je crois qu'il va falloir que je réorganise un peu mes tables non ?

    Exemple avec membre et articles :





    Je suis obligé d'utiliser les id des membres de la table membre partout ailleurs non ? (Au lieu de remettre le pseudo dans la table articles)

    Désolé d'être long à la détente, mais les jointure c'est nouveau pour moi. :/

  14. #14
    Membre expert Avatar de RunCodePhp
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    2 962
    Détails du profil
    Informations personnelles :
    Localisation : Réunion

    Informations forums :
    Inscription : Janvier 2010
    Messages : 2 962
    Points : 3 947
    Points
    3 947
    Par défaut
    Je veux bien faire des jointures, mais je crois qu'il va falloir que je réorganise un peu mes tables non ?
    Et bien théoriquement oui, car ta table "article" n'a aucun élément pour lier les membres et leur articles, du moins, la méthode n'est pas correcte.


    Ta table "article" un champ "auteur", et leur données (valeurs) sont des noms. Ce n'est pas correcte.
    Faudrait remplacer tous ces noms de la table "article" par leur identifiants respectifs.
    1 -> à la place de Jean
    2 -> à la place de Test

    Mais pour faire bien, il faudrait nommer correctement tout ça, pour enlever toute ambiguïté.
    Comme la table contenant les membres a pour nom "membre", il est plus simple de remplacer "id" par "membre_id".
    De même que remplacer "id" par "article_id" de la table "article".

    Ensuite, remplacer le nom "auteur" de la table "article" par "membre_id". (le même nom que la table "membre" car ce seront les même données communes).


    Pour finir, suffit de reprendre la requête que j'ai donnée plus haut pour faire la jointure :
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT ... FROM membre JOIN article ON article.membre_id = membre.membre_id WHERE ...

    On peu simplifier la syntaxe en utilisant des alias (c'est très courant) :
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT a.titre, m.pseudo FROM membre m JOIN article a ON a.membre_id = m.membre_id WHERE m.pseudo LIKE '%machin%'
    Win XP | WampServer 2.2d | Apache 2.2.21 | Php 5.3.10 | MySQL 5.5.20
    Si debugger, c'est supprimer des bugs, alors programmer ne peut être que les ajouter [Edsger Dijkstra]

  15. #15
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2009
    Messages
    134
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2009
    Messages : 134
    Points : 47
    Points
    47
    Par défaut
    D'accord.

    Je suis entrain d'éditer toutes mes tables sur ton modèle.
    Je profite du topic pour te demander comment modifier cette table :



    Si je transforme "expediteur" et "destinataire" en membre_id, je risque d'avoir des problèmes.

    Vois tu une autre possibilité ?

  16. #16
    Membre expert Avatar de RunCodePhp
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    2 962
    Détails du profil
    Informations personnelles :
    Localisation : Réunion

    Informations forums :
    Inscription : Janvier 2010
    Messages : 2 962
    Points : 3 947
    Points
    3 947
    Par défaut
    Si je transforme "expediteur" et "destinataire" en membre_id, je risque d'avoir des problèmes.
    On ne peut pas avoir 2 fois le même nom dans une même table évidemment, donc tu peux conserver "destinataire" et "expediteur".
    Par contre, il faudra que ça soit leur identifiants respectifs (comme pour la table article), des couples d'IDs en faite.

    Vu que ça concerne des IDs, les nommer : destinataire_id et expediteur_id serait plus "parlant".

    Bref ... le tout c'est d'avoir une cohérence au niveau des noms, des données, aussi qu'un simple coup d'oeil suffit pour savoir qu'est ce que cela concerne et contient.
    Win XP | WampServer 2.2d | Apache 2.2.21 | Php 5.3.10 | MySQL 5.5.20
    Si debugger, c'est supprimer des bugs, alors programmer ne peut être que les ajouter [Edsger Dijkstra]

  17. #17
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2009
    Messages
    134
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2009
    Messages : 134
    Points : 47
    Points
    47
    Par défaut
    Bon voilà, j'ai arrangé les tables et la requête SQL à la page qui permet de lire les articles.



    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $lecture = mysql_query('SELECT articles.titre,articles.contenu,membre.membre_id FROM membre,articles WHERE membre.membre_id=articles.membre_id ORDER BY articles.timestamp DESC LIMIT 0,5') or die('Erreur');
    Cependant, il faut que je refasse la requête pour la page qui permet d'envoyer des articles.

    Actuellement j'ai ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    mysql_query("INSERT INTO articles (id,auteur,titre,contenu,timestamp) VALUES ('','$pseudo','$titre','$contenu','$timestamp')") or die(mysql_error());
    Je suis obligé de faire deux mysql_querry. Un pour récupérer l'id_membre du membre et l'autre pour insérer l'article.

    A moins qu'une astuce me permette de faire qu'une requête !

    Merci.

  18. #18
    Membre expert Avatar de RunCodePhp
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    2 962
    Détails du profil
    Informations personnelles :
    Localisation : Réunion

    Informations forums :
    Inscription : Janvier 2010
    Messages : 2 962
    Points : 3 947
    Points
    3 947
    Par défaut
    Je suis obligé de faire deux mysql_querry. Un pour récupérer l'id_membre du membre et l'autre pour insérer l'article.
    Et pourquoi donc ?
    Ca n'a pas de sens d'ailleurs, car sur quel élément te réfèreras tu pour récupérer l'ID du membre (à part son ID) ?

    Si un membre parvient à éditer un formulaire pour créer un article, son ID est connu non ? En général on le stock dans une session.
    Ou alors, c'est une autre personne qui créer un article pour le compte d'un membre, dans cette condition le formulaire de création doit offrir la possibilité de choisir le membre, un ID (parmi une liste).

    L'un comme l'autre tu as son ID.

    Tu dois avoir un problème en amont, comme par exemple n'avoir sous le coude que son pseudo, et non son ID.
    Faut donc procéder un peu différemment.

    Quand un membre s'identifie par exemple, faut conserver son ID en mémoire quelque part (session), c'est l'élément le plus important, plus que le pseudo, car tu en auras besoin constamment (théoriquement).


    Petite remarque en passant.
    Vu que c'est une requête pour insertion, et que l'id_article est un auto_increment, il n'est pas utile de la renseigner dans la requête :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    INSERT INTO articles (membre_id, titre, contenu, timestamp) VALUES ('$membre_id', '$titre', '$contenu', '$timestamp') ...etc ...
    Ici, on laisse la Bdd générer un ID unique à l'article.
    Win XP | WampServer 2.2d | Apache 2.2.21 | Php 5.3.10 | MySQL 5.5.20
    Si debugger, c'est supprimer des bugs, alors programmer ne peut être que les ajouter [Edsger Dijkstra]

  19. #19
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2009
    Messages
    134
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2009
    Messages : 134
    Points : 47
    Points
    47
    Par défaut
    Oui en effet, je n'avais pas pensé à utiliser les sessions.

    Donc de retour sur mon moteur de recherche.

    Pour rappel, voilà le code :

    <
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    ?php
    session_start();
    if(isset($_POST['submit'])){
    	if(empty($_POST['recherche'])){
    		$erreur = 'Le champ recherche est vide';
    	}
    	else{
    		require 'config.php';
    		$connexion_sql = mysql_connect(DB_HOST,DB_LOGIN,DB_PASS); 
    		$connexion_bdd = mysql_select_db(DB_BDD);
     
    		$recherche = mysql_real_escape_string($_POST['recherche']);
     
    		$lecture = mysql_query("SELECT distinct articles.titre,articles.contenu,membre.pseudo FROM membre,articles WHERE membre.pseudo LIKE '%$recherche%' OR articles.titre LIKE '%$recherche%' OR articles.contenu LIKE '%$recherche%'") or die('Erreur :'.mysql_error());
    		while($retour = mysql_fetch_array($lecture)){
    			if(isset($retour['pseudo']) && $retour['pseudo'] !== null){
    				echo $retour['pseudo'].
    				'<br /><br />';
    			}
    		}
    	}
    }
    ?>
    <form method="post">
    	<input type="text" name="recherche">
    	<input type="submit" name="submit">
    </form>
    Alors là c'est assez marrant.

    Si je recherche Jean, j'ai Jean qui s'affiche. Si je cherche un autre terme au pif j'ai Jean et Test qui s'affichent et ça je sais pas pourquoi O_o

  20. #20
    Membre expert Avatar de RunCodePhp
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    2 962
    Détails du profil
    Informations personnelles :
    Localisation : Réunion

    Informations forums :
    Inscription : Janvier 2010
    Messages : 2 962
    Points : 3 947
    Points
    3 947
    Par défaut
    Si je recherche Jean, j'ai Jean qui s'affiche. Si je cherche un autre terme au pif j'ai Jean et Test qui s'affichent et ça je sais pas pourquoi
    C'est surement parce que ta requête n'a pas de jointure entre les 2 tables "membre" et "articles".

    Aussi, faudrait savoir ce que tu espère avec le DISTINCT que tu as mis.
    Faudrait même savoir le but des recherches.
    - Si c'est pour rechercher tous les articles d'un ou plusieurs membres, il ne faut pas de DISTINCT (ou de GROUP BY), car tu va perdre des lignes, des articles.
    - Si c'est pour rechercher un ou plusieurs membres, indépendamment du nombre d'articles, alors un GROUP BY sera nécessaire.

    Ce sont 2 requêtes différentes.

    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT articles.titre,articles.contenu,membre.pseudo FROM membre JOIN articles ON articles.membre_id = membre.membre_id WHERE ... etc ...
    Ceci dit, cette requête je l'avais déjà donnée plus haut, et en plus, avec alias et sans alias.
    Ben alors ...
    Win XP | WampServer 2.2d | Apache 2.2.21 | Php 5.3.10 | MySQL 5.5.20
    Si debugger, c'est supprimer des bugs, alors programmer ne peut être que les ajouter [Edsger Dijkstra]

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. Problème de syntaxe - elements['x'].value
    Par Equus dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 22/02/2005, 11h22
  2. [Interbase] Problème de syntaxe SQL
    Par navis84 dans le forum InterBase
    Réponses: 4
    Dernier message: 22/12/2004, 17h07
  3. Problème de syntaxe
    Par Mister_FX dans le forum ASP
    Réponses: 5
    Dernier message: 30/06/2004, 10h01
  4. Problème de syntaxe ADO ...
    Par bendev dans le forum ASP
    Réponses: 2
    Dernier message: 15/04/2004, 14h38
  5. Réponses: 2
    Dernier message: 08/03/2004, 15h10

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo