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

PHP & Base de données Discussion :

Formulaire de recherche dans base ACCESS via PHP [ODBC]


Sujet :

PHP & Base de données

  1. #1
    Futur Membre du Club
    Inscrit en
    Février 2008
    Messages
    15
    Détails du profil
    Informations forums :
    Inscription : Février 2008
    Messages : 15
    Points : 7
    Points
    7
    Par défaut Formulaire de recherche dans base ACCESS via PHP
    Bonjour,

    Je crée actuellement une interface web en PHP avec ODBC pour exploiter les données d'une base de données ACCESS.

    Je bloque sur un script qui permet(tra) aux utilisateurs de rechercher les documents liés à une machine (recherche par nom de machine).

    J'ai deux tables :
    - table DOCUMENTS (id, nom de doc, date, format, thème, résumé, etc.)
    - table MACHINES (id, nom, type, catégorie)

    Je me suis basée sur un formulaire PHP-MySQL publié sur le site Comment ça marche.

    Voici mon code. D'après le message d'erreur que j'obtiens, l'erreur se trouve sur la ligne que j'ai mis en rouge mais je n'arrive pas à comprendre pourquoi.

    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
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    <?php
    
    //connexion à une base de données ACCESS
    $bd=""; // identifiant DSN
    $user=""; // login
    $password=""; // password
    $cnx=odbc_connect( $bd , $user, $password );
    
    echo "
    
    <html>
    
    <head>
    
    <title>Résultat de la recherche</title>
    
    </head>
    
    <body>";
    
    // Si aucun mot clé n'a été saisi, le script demande à l'utilisateur de bien vouloir préciser un mot clé
    if (($Mot == "")||($Mot == "%")) 
    	{
    	echo 
    	"Veuillez entrer le nom d'une machine s'il vous plaît!<p>";
    	}
    
    else 
    {
    
    // Sélection des documents contenant le nom de la machine
    	$query = "SELECT machines.nommachine, machines.typemachine, machines.categoriemachine, documents.nomdoc, documents.typedoc, documents.formatdoc, documents.datedoc, documents.languedoc, documents.liendoc, documents.themedoc, documents.resumedoc FROM machines INNER JOIN (documents INNER JOIN documents_machines ON documents.iddoc = documents_machines.iddoc) ON machines.idmachine = documents_machines.idmachine WHERE (((machines.nommachine) LIKE \"%$Mot%\")) ORDER BY documents.nomdoc";
    
    	$result = odbc_do($cnx, $query);
    
    	$row = odbc_fetch_row($result);
    
    	$Nombre = $row[0];
    
    // Si aucun enregistrement n'est retourné, affichage du message suivant
    	if ($Nombre == "0") 
    	{
    	echo 
    	"<h2>Aucun document ne correspond à votre recherche</h2><p>";
    	}
    // Si un seul enregistrement est trouvé, affichage d'un message au singulier
    	if ($Nombre == "1") 
    	{
    	echo 
    	"<a name=\"#resultat\"><h2>Résultat: Un document trouvé</h2></a><p>";
    	}
    	
    // Dans le cas contraire le message est au pluriel
    	else 
    	{
    	echo
    	"<a name=\"#resultat\"><h2>Résultat: $Nombre articles trouvés</h2></a><p>";
    	}
    
    // Sinon, affichage des résultats
    	else
    	{
    	$query = "SELECT machines.nommachine, machines.typemachine, machines.categoriemachine, documents.nomdoc, documents.typedoc, documents.formatdoc, documents.datedoc, documents.languedoc, documents.liendoc, documents.themedoc, documents.resumedoc FROM machines INNER JOIN (documents INNER JOIN documents_machines ON documents.iddoc = documents_machines.iddoc) ON machines.idmachine = documents_machines.idmachine WHERE (((machines.nommachine) LIKE \"%$Mot%\")) ORDER BY documents.nomdoc";
    
    	$result=odbc_do($cnx, $query);
    
    	while($row = odbc_fetch_row($result))
    		{
    		echo 
    		"
    		<p>\n
    		<b>$row[2]</b>\n
    		<p>\n
    		";
    		}
    	}
    
    }
    
    // fermeture de la connexion à la base ACCESS
    odbc_close($cnx);
    
    ?>
    
    </body>
    
    </html>
    Je vous remercie de prendre le temps de vous pencher sur mon problème.

    Bib

  2. #2
    Membre actif
    Profil pro
    Développeur Web
    Inscrit en
    Octobre 2006
    Messages
    251
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Octobre 2006
    Messages : 251
    Points : 292
    Points
    292
    Par défaut
    il te manque 1 } juste avant ton else, ou alors tu as 2 else qui ce suive

  3. #3
    Futur Membre du Club
    Inscrit en
    Février 2008
    Messages
    15
    Détails du profil
    Informations forums :
    Inscription : Février 2008
    Messages : 15
    Points : 7
    Points
    7
    Par défaut
    Bonjour Benji07,

    Merci pour ta réponse. Tu as raison, mes accolades ne sont pas claires.

    J'ai ajouté une accolade avant mon else mais il m'indique la même erreur Parse error: syntax error, unexpected T_ELSE et toujours au niveau du même else.

    Par contre, je me retrouve toujours avec deux else à la suite (le premier du script et le dernier) et je ne vois pas comment faire pour arranger cela.

  4. #4
    Membre actif
    Profil pro
    Développeur Web
    Inscrit en
    Octobre 2006
    Messages
    251
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Octobre 2006
    Messages : 251
    Points : 292
    Points
    292
    Par défaut
    tu as 2 else a la suite

  5. #5
    Futur Membre du Club
    Inscrit en
    Février 2008
    Messages
    15
    Détails du profil
    Informations forums :
    Inscription : Février 2008
    Messages : 15
    Points : 7
    Points
    7
    Par défaut
    C'est bon, j'ai corrigé mon code au niveau des else et des if qui ne se suivaient pas logiquement.

    Mais évidemment, un autre bug est apparu une fois celui-ci résolu.

    J'ai apparement un problème de syntaxe dans ma requête SQL. J'ai beau chercher sur le net, je ne trouve pas d'aide (guide, tuto ?) sur comment adapter la syntaxe SQL a ODBC/Access. Du coup je teste un peu tout mais rien ne fonctionne. J'ai essayé de coller le requête générée par Access mais ça ne marche pas non plus...

    Pourriez-vous me dire si ma requête SQL vous parait bonne ou pas s'il vous plait ?

    Voila le message d'erreur :
    Warning: odbc_do() [function.odbc-do]: SQL error: [Microsoft][Pilote ODBC Microsoft Access] Erreur de syntaxe dans la clause FROM., SQL state 37000 in SQLExecDirect in C:\Program Files\xampp\htdocs\xampp\Interface\Recherche_document.php on line 23

    Et voila mon code corrigé :

    Je précise que j'ai supprimé du script le bout de code qui permettait de vérifier si le champ était bien rempli car celui-ci ne marche pas non plus (pfff) mais je voulais justement savoir si le script fonctionnait sans cela (ce qui n'est pas le cas).

    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
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    <html>
     
    <head>
     
    <title>Résultat de la recherche</title>
     
    </head>
     
    <body>
     
    <?php
     
    //connexion à une base de données ACCESS
    $bd=""; // identifiant DSN
    $user=""; // login
    $password=""; // password
    $cnx=odbc_connect( $bd , $user, $password );
     
    $Mot=$_POST['Mot'];
     
    $query = "SELECT machines.nommachine, machines.typemachine, machines.categoriemachine, documents.nomdoc, documents.typedoc, documents.formatdoc, documents.datedoc, documents.languedoc, documents.liendoc, documents.themedoc, documents.resumedoc FROM machines INNER JOIN documents INNER JOIN documents_machines ON documents.iddoc = documents_machines.iddoc ON machines.idmachine = documents_machines.idmachine WHERE machines.nommachine='$Mot' ORDER BY documents.nomdoc";
     
    $result = odbc_do($cnx, $query);
     
    $row = odbc_fetch_row($result);
     
    $Nombre = $row[0];
     
    	// Si aucun enregistrement n'est retourné, affichage du message suivant
    	if ($Nombre == "0") 
    	{
    	echo 
    	"<h2>Aucun document ne correspond à votre recherche</h2><p>";
    	}
     
    	// Sinon, affichage des résultats
    	else
    	{
    	$query = "SELECT machines.nommachine, machines.typemachine, machines.categoriemachine, documents.nomdoc, documents.typedoc, documents.formatdoc, documents.datedoc, documents.languedoc, documents.liendoc, documents.themedoc, documents.resumedoc FROM machines INNER JOIN documents INNER JOIN documents_machines ON documents.iddoc = documents_machines.iddoc ON machines.idmachine = documents_machines.idmachine WHERE machines.nommachine='$Mot' ORDER BY documents.nomdoc";
     
    	$result=odbc_do($cnx, $query);	
     
    		// Si un seul enregistrement est trouvé, affichage d'un message au singulier
    		if ($Nombre == "1") 
    		{
    		echo 
    		"<a name=\"#resultat\"><h2>Résultat: Un document trouvé</h2></a><p>";
    		}
     
    		// Dans le cas contraire le message est au pluriel
    		else 
    		{
    		echo
    		"<a name=\"#resultat\"><h2>Résultat: $Nombre articles trouvés</h2></a><p>";
    		}
    	}
     
    	while($row = odbc_fetch_row($result))
    		{
    		echo 
    		"
    		<p>\n
    		<b>$row[2]</b>\n
    		<p>\n
    		";
    		}
     
     
    // fermeture de la connexion à la base ACCESS
    odbc_close($cnx);
     
    ?>
     
    </body>
     
    </html>

  6. #6
    Membre actif
    Profil pro
    Développeur Web
    Inscrit en
    Octobre 2006
    Messages
    251
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Octobre 2006
    Messages : 251
    Points : 292
    Points
    292
    Par défaut
    Maintenant le problème est dans ta 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
    SELECT machines.nommachine, 
          machines.typemachine, 
          machines.categoriemachine, 
          documents.nomdoc, 
          documents.typedoc, 
          documents.formatdoc, 
          documents.datedoc, 
          documents.languedoc, 
          documents.liendoc, 
          documents.themedoc, 
          documents.resumedoc 
    FROM machines 
    INNER JOIN documents ON ...
    INNER JOIN documents_machines 
        ON (documents.iddoc = documents_machines.iddoc 
             AND machines.idmachine = documents_machines.idmachine) 
    WHERE machines.nommachine='$Mot' 
    ORDER BY documents.nomdoc
    Il fallait que tu remplace un ON par un AND, que tu ajoute des () et il manque toujours un ON dans ton premier INNER JOIN

  7. #7
    Futur Membre du Club
    Inscrit en
    Février 2008
    Messages
    15
    Détails du profil
    Informations forums :
    Inscription : Février 2008
    Messages : 15
    Points : 7
    Points
    7
    Par défaut
    En fait je n'ai pas de ON dans le premier INNER Join car rien ne relie directement les tables documents et machines.

    Je me suis mal expliquée dans mon premier post. J'ai en fait trois tables (dont une table intermédiaire ) car il s'agit d'une relation plusieurs à plusieurs :
    - table DOCUMENTS (id_doc, nom de doc, date, format, thème, résumé, etc.)
    - table MACHINES (id_machine, nom, type, catégorie)
    - table intermédiaire DOCUMENTS_MACHINES (id_doc, id_machine)

    Je pensais qu'avec la parenthèse après le premier INNER JOIN, les deux tables seraient prises en compte pour le ON. Apparement non.

    Comment puis-je opérer alors une requête sur trois tables ? Je ne trouve sur le net que des exemples pour mysql...

  8. #8
    Membre actif
    Profil pro
    Développeur Web
    Inscrit en
    Octobre 2006
    Messages
    251
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Octobre 2006
    Messages : 251
    Points : 292
    Points
    292
    Par défaut
    Et avec cette requete, tu obtiens ce que tu veut ou pas?

    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
    SELECT machines.nommachine, 
          machines.typemachine, 
          machines.categoriemachine, 
          documents.nomdoc, 
          documents.typedoc, 
          documents.formatdoc, 
          documents.datedoc, 
          documents.languedoc, 
          documents.liendoc, 
          documents.themedoc, 
          documents.resumedoc 
    FROM machines 
    INNER JOIN documents_machines 
        ON machines.idmachine = documents_machines.idmachine
    INNER JOIN documents ON documents.iddoc = documents_machines.iddoc 
    WHERE machines.nommachine='$Mot' 
    ORDER BY documents.nomdoc

  9. #9
    Futur Membre du Club
    Inscrit en
    Février 2008
    Messages
    15
    Détails du profil
    Informations forums :
    Inscription : Février 2008
    Messages : 15
    Points : 7
    Points
    7
    Par défaut
    Ca ne fonctionne pas non plus...

    Voilà l'erreur que j'ai :

    Warning: odbc_do() [function.odbc-do]: SQL error: [Microsoft][Pilote ODBC Microsoft Access] Erreur de syntaxe (opérateur absent) dans l'expression 'machines.idmachine = documents_machines.idmachine INNER JOIN documents ON documents.iddoc = documents_machines.iddoc'., SQL state 37000 in SQLExecDirect in C:\Program Files\xampp\htdocs\xampp\Interface\Recherche_document.php on line 40

    J'ai essayé en commençant la requête par la table intermédiaire mais rien à faire...
    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
    $query = "
    SELECT machines.nommachine, 
          machines.typemachine, 
          machines.categoriemachine, 
          documents.nomdoc, 
          documents.typedoc, 
          documents.formatdoc, 
          documents.datedoc, 
          documents.languedoc, 
          documents.liendoc, 
          documents.themedoc, 
          documents.resumedoc
    FROM documents_machines 
    (INNER JOIN machines
    ON machines.idmachine = documents_machines.idmachine
    INNER JOIN documents
    ON documents.iddoc = documents_machines.iddoc)
    WHERE machines.nommachine='$Mot' 
    ORDER BY documents.nomdoc";

  10. #10
    Futur Membre du Club
    Inscrit en
    Février 2008
    Messages
    15
    Détails du profil
    Informations forums :
    Inscription : Février 2008
    Messages : 15
    Points : 7
    Points
    7
    Par défaut
    Ca y est, j'ai enfin trouvé la solution pour créer un formulaire de recherche. Le nouveau code n'a plus grand chose à voir avec le premier... :o)

    Pour ceux qui seraient intéressés, voici le script de recherche de documents par nom de machine :

    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
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    <html>
      <head>
      <title>Résultat de la recherche</title>
      </head>
      <body>
     
    <h1><font size=5>Résultats de la recherche</font></h1><p>
     
      <?php
     
      // Connexion a la base de donnees
      include ('Connexion_bd.php');  
     
        //Récupération de la variable entrée par l'utilisateur
     
        $Mot=$_POST["Mot2"];
     
        // Si le champ est vide
        if (empty ($_POST["Mot2"])) {
          echo "<h2>Vous devez sélectionner une machine</h2>";
          echo "<br><a href=Form_recherche_document.php>Retour sur la recherche Documents</a>";
          exit;
        }
     
        //Requête
        $sql2="SELECT nomdoc , typedoc , formatdoc , datedoc , languedoc , themedoc , resumedoc , liendoc FROM machines , documents , documents_machines 
        WHERE machines.idmachine = documents_machines.idmachine AND documents_machines.iddoc = documents.iddoc AND nommachine LIKE '%".$Mot."%' ORDER BY nomdoc";
        $valeur2 = odbc_do($cnx , $sql2) or die( odbc_error() );
     
        // On teste s'il y a des résultats pour cette requete
        if (!odbc_fetch_row($valeur2)){
          echo "<h2>Aucun document ne correspond à votre recherche</h2><p>";
        }
        else {
          // On réinitialise la requete apres la commande odbc_fetch_row
          $valeur2 = odbc_do($cnx , $sql2) or die( odbc_error() );
     
          echo "<TABLE border=1>";
    // On utilise la fonction presente dans connexion_bd.php
          aff_ligne("Nom du document",$valeur2,'nomdoc');
          aff_ligne("Type",$valeur2,'typedoc');
          aff_ligne("Format",$valeur2,'formatdoc');
          aff_ligne("Date",$valeur2,'datedoc');
          aff_ligne("Langue",$valeur2,'languedoc');
          aff_ligne("Thème",$valeur2,'themedoc');
          aff_ligne("Résumé",$valeur2,'resumedoc');
          aff_ligne("Lien",$valeur2,'liendoc');
          echo "</TABLE>";
        }	
     
      // fermeture de la connexion à la base ACCESS
      odbc_close($cnx);
      ?>
     
      <p><a href=Form_recherche_document.php>Retour sur la recherche Document</a><p>
      <a href=Accueil.php>Menu</a>
      </body>
      </html>
    Merci à Benji07 d'avoir essayé de résoudre mon problème.

    Bonne journée

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [SimpleXML] formulaire de recherche dans un fichier XML php
    Par oualid4ever dans le forum Bibliothèques et frameworks
    Réponses: 1
    Dernier message: 20/01/2013, 09h54
  2. Probleme boucle If recherche dans base access
    Par PITP2 dans le forum ASP
    Réponses: 5
    Dernier message: 10/02/2009, 20h55
  3. Recherche dans une table via un formulaire
    Par Z[ee]k dans le forum Access
    Réponses: 3
    Dernier message: 05/06/2006, 11h14
  4. recherche par mots-clés dans base access
    Par syber72 dans le forum Access
    Réponses: 2
    Dernier message: 07/03/2006, 13h53
  5. Recherche dans base access
    Par VARACH dans le forum VBA Access
    Réponses: 5
    Dernier message: 09/01/2006, 08h17

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