Précédent   Forum des professionnels en informatique > PHP > PHP & SGBD > PHP & ODBC
PHP & ODBC Forum d'entraide sur ODBC avec PHP. Avant de poster -> FAQ ODBC
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 22/05/2008, 12h18   #1
Invité de passage
 
Inscription : février 2008
Messages : 15
Détails du profil
Informations forums :
Inscription : février 2008
Messages : 15
Points : 2
Points : 2
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 :
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
bib.13 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/05/2008, 14h04   #2
Membre confirmé
 
Développeur Web
Inscription : octobre 2006
Messages : 251
Détails du profil
Informations personnelles :
Âge : 24
Localisation : France, Rhône (Rhône Alpes)

Informations professionnelles :
Activité : Développeur Web

Informations forums :
Inscription : octobre 2006
Messages : 251
Points : 268
Points : 268
il te manque 1 } juste avant ton else, ou alors tu as 2 else qui ce suive
benji07 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/05/2008, 14h20   #3
Invité de passage
 
Inscription : février 2008
Messages : 15
Détails du profil
Informations forums :
Inscription : février 2008
Messages : 15
Points : 2
Points : 2
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.
bib.13 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/05/2008, 15h02   #4
Membre confirmé
 
Développeur Web
Inscription : octobre 2006
Messages : 251
Détails du profil
Informations personnelles :
Âge : 24
Localisation : France, Rhône (Rhône Alpes)

Informations professionnelles :
Activité : Développeur Web

Informations forums :
Inscription : octobre 2006
Messages : 251
Points : 268
Points : 268
tu as 2 else a la suite
benji07 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/05/2008, 17h41   #5
Invité de passage
 
Inscription : février 2008
Messages : 15
Détails du profil
Informations forums :
Inscription : février 2008
Messages : 15
Points : 2
Points : 2
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 :
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>
bib.13 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/05/2008, 09h10   #6
Membre confirmé
 
Développeur Web
Inscription : octobre 2006
Messages : 251
Détails du profil
Informations personnelles :
Âge : 24
Localisation : France, Rhône (Rhône Alpes)

Informations professionnelles :
Activité : Développeur Web

Informations forums :
Inscription : octobre 2006
Messages : 251
Points : 268
Points : 268
Maintenant le problème est dans ta requête SQL :

Code :
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
benji07 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/05/2008, 15h05   #7
Invité de passage
 
Inscription : février 2008
Messages : 15
Détails du profil
Informations forums :
Inscription : février 2008
Messages : 15
Points : 2
Points : 2
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...
bib.13 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/05/2008, 15h24   #8
Membre confirmé
 
Développeur Web
Inscription : octobre 2006
Messages : 251
Détails du profil
Informations personnelles :
Âge : 24
Localisation : France, Rhône (Rhône Alpes)

Informations professionnelles :
Activité : Développeur Web

Informations forums :
Inscription : octobre 2006
Messages : 251
Points : 268
Points : 268
Et avec cette requete, tu obtiens ce que tu veut ou pas?

Code :
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
benji07 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/05/2008, 15h47   #9
Invité de passage
 
Inscription : février 2008
Messages : 15
Détails du profil
Informations forums :
Inscription : février 2008
Messages : 15
Points : 2
Points : 2
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 :
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";
bib.13 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/06/2008, 14h06   #10
Invité de passage
 
Inscription : février 2008
Messages : 15
Détails du profil
Informations forums :
Inscription : février 2008
Messages : 15
Points : 2
Points : 2
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 :
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
bib.13 est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 17h20.


 
 
 
 
Partenaires

Hébergement Web