Aller au contenu

Requete sur plusieurs tables


furious Gontran

Sujets conseillés

Desolé pour une question aussi bete...

C'est possible les requetes de type:

SELECT * FROM Table1, Table2, Table3 WHERE Id, Titre, Resume LIKE....

Pour faire des requetes sur plusieurs colonnes de plusieurs tables ??

--------------

Autre question:

J'ais trouvé ca sur le net:

for ($i=0;$i=<(sizeof($Mot);$i++)

{

if ($Mot[$i]!="")

{

$exp=$Mot[$i];

$Where.="AND(Titre LIKE '%$exp%' OR Resume LIKE '%$exp%')";

}

}

//////////////Requete

$requete= "SELECT * FROM Zoom, Traverse, Chroniques WHERE 1 $Where";

Ceque je ne comprend pas c'est le WHERE 1 AND...

Que ca donne par la suite.

A quoi sers ce 1 ??

Ce code marcherait il d'apres vous ?

Modifié par furious Gontran
Lien vers le commentaire
Partager sur d’autres sites

pour la question 1, je comprend pas trop, pour la 2, c'est souvent la méthode que j'utilise. Elle permet de travailler avec un $where vide ou non.

Ce '1' sert à pouvoir mettre le WHERE.

Si tu as plusieurs conditions, par exemple, tu peux avoir :

$requete = "WHERE 1 "

pour chaque condition

$requete .=" AND condition";

ainsi, s'il n'y a pas de condition, ca marche. S'il y en a plusieurs, ca marche aussi.

Juste une précision. Prend l'habitude de travailler avec foreach au lieu de for. C'est une erreur de travailler avec for.

;)

Lien vers le commentaire
Partager sur d’autres sites

Pour la question 1:

Je veux que le SELECT * FROM s'effetue sur plusieurs table est ce que je peut les mettre a la suite en les separant par une virgule ?

Je sais que c'est possible pour les champs...

Pour la 2:

:lol: Merci

Ca va me faciliter la vie le WHERE 1

Et pour le foreach, promis j'm'y met.

Lien vers le commentaire
Partager sur d’autres sites

Salut Gontran,

SELECT * FROM table1, table2, table3

ça marche. Tu risques seulement d'avoir des problèmes à la récupération des données si tu as des colonnes avec le même nom dans 2 tables.

Autre chose : fais attention avec cette méthode : tu risques de ramasser des tonnes de données inutiles donc de ralentir ton script pour rien. Pense à optimiser ta requète (même si c'est facile de faire ça pendant les tests ;))

Lien vers le commentaire
Partager sur d’autres sites

Juste une précision. Prend l'habitude de travailler avec foreach au lieu de for. C'est une erreur de travailler avec for.

<{POST_SNAPBACK}>

En quoi c'est une erreur une boucle for ?

C'est une instruction Simple et rapide, c'est ma préferé.

Quand à foreach c'est une instruction de contrôle, donc on peut pas opposer ces deux instructions :)

Lien vers le commentaire
Partager sur d’autres sites

Ce n'est pas une erreur, ca peut être utile, mais dans ce cas ci, on se trouve devant le cas suivant :

for ($i=0;$i=<(sizeof($Mot);$i++)

{

if ($Mot[$i]!="")

On parcours tous les éléments de $Mot, sans savoir précisément s'ils existent ou pas. Dans cette discussion : http://www.webmaster-hub.com/index.php?showtopic=8402 il est dit à Gontran de détruire les variables vides (ce qui, à mon avis, peut créer des erreurs, si l'on ne maitrise pas ce que l'on fait).

Et dans cette discussion, on le laisse travailler avec un tableau, et sa taille d'index pour le parcourir.

C'est soi l'une, soit l'autre méthode, mais pas les 2 ensemble.

On peut facilement créer des erreurs en parcourant des tableaux avec un 'for..sizeof alors que ce n'est pas possible avec un foreach.

De plus, les foreach sont également faits pour parcourir des tableaux ayant des index non numeriques.

(et tant que j'y suis) :

Pour tester la ligne :

$Where.="AND(Titre LIKE '%$exp%' OR Resume LIKE '%$exp%')";

essaies en entrant juste une lettre dans le champ de recherche (puisque ca parait destiné à un champ de recherche). Essaies avec juste une voyelle. Ca devrait te renvoyer toutes les lignes (enfin.. presque.). Ce qui n'est pas forcément ce que tu cherches ;)

Nico.

Lien vers le commentaire
Partager sur d’autres sites

SELECT table1.champ1,table2.champ2 FROM table1,table2 WHERE table1.champ3,table2.champ4

Et pour rapeller mes données vous me conseillez mysql_fetch_objet() ou mysql_fetch_array() ??

Avec un objet il faut que je fasse:

$objet= mysql_fetch_objet($resultatdelarequete)

$camp=$objet->table1.champ1;

???????

Pour la recherche avec juste une voyelle, je suis en train de faire un script de verification pour que l'utilisateur entre des trucs coherents.

Lien vers le commentaire
Partager sur d’autres sites

On peut facilement créer des erreurs en parcourant des tableaux avec un 'for..sizeof alors que ce n'est pas possible avec un foreach.

Quel type d'erreur stp ? La fonction sizeof étant ré-évaluée à chaque tour de boucle, je ne vois pas trop en quoi elle pourrait poser problème.

En revanche, je me demande si, dans un cas pareil, on n'aurait pas le même risque avec for et foreach, à savoir oublier de traiter l'élément n+1 quand on a supprimé l'élément n. Avec un for, on le saute puisqu'il se retrouve décalé (à moins de penser à recaler l'index avec un $i-- juste après l'effacement). J'ignore s'il en est de même avec un foreach. :wacko:

Lien vers le commentaire
Partager sur d’autres sites

Premier exemple :

$array['nom']="machin";

$array['prenom']="truc";

On est obligé de passer par un 'foreach' pour dépiler le tableau. On ne peut le faire avec un for..sizeof, puisque l'index n'est pas numérique.

Second exemple :

$array[0]="machin";

$array[1]="truc";

$array[2]="bidule";

unset($array['1']);

Sans autre opération de remise en ordre de l'index, le foreach marche, pas le for..sizeof.

Lien vers le commentaire
Partager sur d’autres sites

probleme de foreach:

Comment on fais pour remplacer une valeur dans un foreach ??

J'ai testé:

foreach($Mot as $value)

  {

  $value= ereg_replace("é", "\(é|e)", $value);

  $value= ereg_replace("è", "\(è|e)", $value);

  $value= ereg_replace("ê", "\(ê|e)", $value);

  $value= ereg_replace("ë", "\(ë|e)", $value);

  $value= ereg_replace("ç", "\(ç|c)", $value);

  $value= ereg_replace("ù", "\(ù|u)", $value);

  $value= ereg_replace("ï", "\(ï|i)", $value);

  }

Mais ca n'as servi a rien, ca ne marche pas...

Comment faire sans utiliser d'index ?

Lien vers le commentaire
Partager sur d’autres sites

Je verrais bien comme ceci :

$a_chercher=array("é","è");
$a_remplacer=array("e","e");

foreach($Mot as $key=>$value)
  $Mot[$key]=str_replace($a_chercher,$a_remplacer,$value);

Lien vers le commentaire
Partager sur d’autres sites

J'ais vu pour les foreach, c'est vrai que c'est plus pratique...

Mais probleme.

Cette requete:

SELECT * FROM chroniques WHERE 1 OR (Titre LIKE '%batman%' OR Resume LIKE '%batman%') OR (Titre LIKE '%manga%' OR Resume LIKE '%manga%') OR (Titre LIKE '%carnaval%' OR Resume LIKE '%carnaval%') OR (Titre LIKE '%%' OR Resume LIKE '%%') LIMIT 0,20

Generée avec ca:

$Where .=" OR (Titre LIKE '%$Mot[$i]%' OR Resume LIKE '%$Mot[$i]%')";

$requete="SELECT * FROM chroniques WHERE 1 ". $Where." LIMIT $position,$fin";

Me sors toutes les entrées dans ma base au lieu de me sortir les trois articles dont les nom contiennent les mots clefs. :huh:

Alors que cette requete:

SELECT * FROM chroniques WHERE 1 AND (Titre LIKE '%manga%' OR Resume LIKE '%manga%')AND (Titre LIKE '%batman%' OR Resume LIKE '%batman%') LIMIT 0,20

if ($Type=="Tous les mots")

{

  foreach ($Mot as $value)

{

$Where .="AND (Titre LIKE '%".$value."%' OR Resume LIKE '%".$value."%')";

}

}else if ($Type=="Au moins un mot")

  {

  foreach ($Mot as $value)

{

$Where .="OR (Titre LIKE '%".$value."%' OR Resume LIKE '%".$value."%')";

}

}else if ($Type=="Expression exactes")

  {

  foreach ($Mot as $value)

{

$Where .="AND (Titre LIKE '%".$value."%' OR Resume LIKE '%".$value."%')";

}

}

He la ben je vois pas trop

Modifié par furious Gontran
Lien vers le commentaire
Partager sur d’autres sites

En fait, il faut faire :

SELECT * FROM chroniques WHERE 1 AND  ( (test1) OR (test2) )

Regardes bien le AND et les parenthèses qui entourent les conditions.

Lien vers le commentaire
Partager sur d’autres sites

Non, ce n'est pas pareil. Dans le cas du '1', il va demander :

- que ce soit 'VRAI' (le '1' dans ce cas signifie 'TRUE')

ET

- qu'il y ait les mots.

Donc, la première condition s'annule, il reste la seconde, autrement dit, qu'il y ait des mots.

Dans le cas du 'OR', il va chercher :

- que ce soit 'VRAI' (le '1' dans ce cas signifie 'TRUE')

Ou

- qu'il y ait les mots.

Et des 2, il va prendre la plus facile, la plus large. Donc, si un champ est 'VRAI', il le renvoie. Le problème, c'est que tous les champs qui existent sont toujours VRAI, c'est un non sens. Donc, il te renvoie tous les champs.

Des 2, il faut mettre le AND.

Lien vers le commentaire
Partager sur d’autres sites

Salut a tous

Juste une petite question sans rentrer dans une polemique,

a vrai dire je debute.

C'est juste par rapport au message :

(qui commence un peu a dater mais bon)

Premier exemple :

$array['nom']="machin";

$array['prenom']="truc";

On est obligé de passer par un 'foreach' pour dépiler le tableau. On ne peut le faire avec un for..sizeof, puisque l'index n'est pas numérique.

Second exemple :

$array[0]="machin";

$array[1]="truc";

$array[2]="bidule";

unset($array['1']);

Sans autre opération de remise en ordre de l'index, le foreach marche, pas le for..sizeof.

<{POST_SNAPBACK}>

Voila c'est beaucoup plus long et surement moins efficace

mais par rapport au 1er example ,

(en concidérant un nombre limités de d'entréés dans la var tab et une réutilisation dans plusieurs autres boucles for )

On pourrait utiliser la boucle for de cette maniére

Ex:

"Premier exemple :"
$cle_v = array("nom","prenom");
$resu_t = array("machin","truc");
$tp ="";

for($i=0;$i<2;$i++)
{//for
$tp = $cle_v[$i];
if($array[$tp]=$resu_t [$i]){
echo"ok";
}
if($array[$tp]=$resu_t [$i]){
echo"ok";
}

}//for

Je veux juste savoir si c'est une methode acceptable.

Merci

@+

Modifié par manito
Lien vers le commentaire
Partager sur d’autres sites

:boude: Pfffffff

La, ca deviens gonflant...

SELECT * FROM chroniques WHERE chroniques.Titre LIKE '%batman%' OR chroniques.Resume LIKE '%batman%'OR chroniques.Titre LIKE '%manga%' OR chroniques.Resume LIKE '%manga%'OR chroniques.Titre LIKE '%carnaval%' OR chroniques.Resume LIKE '%carnaval%' LIMIT 0,20

Marche, ca me donne 3 resultats.

Mais

SELECT * FROM chroniques, zoom WHERE chroniques.Titre LIKE '%batman%' OR chroniques.Resume LIKE '%batman%' OR zoom.Titre LIKE '%batman%' OR zoom.Resume LIKE '%batman%'OR chroniques.Titre LIKE '%manga%' OR chroniques.Resume LIKE '%manga%'OR zoom.Titre LIKE '%manga%' OR zoom.Resume LIKE '%manga%'OR chroniques.Titre LIKE '%carnaval%' OR chroniques.Resume LIKE '%carnaval%'OR zoom.Titre LIKE '%carnaval%' OR zoom.Resume LIKE '%carnaval%' LIMIT 0,20

Me dis qu'il n'ya aucuns resultats !!

:gueule:

Lien vers le commentaire
Partager sur d’autres sites

Essaies avec Super man :lol:

Non, sérieux :

Me dis qu'il n'ya aucuns resultats !!

Aucun résultat, ou la requète n'est pas bonne ? Autrement dit, si ca se trouve, ca te renvoie une erreur, mais ca ne te l'affiche pas, et donc tu as l'impression que ca ne te renvoie aucun résultat, alors que la requète n'est tout simplement pas bonne ;)

Lien vers le commentaire
Partager sur d’autres sites

Non, pourtant,

Le script qui execute les requetes me renvois toujours un message en cas d'erreur.

D'ou mon incomprehension.

Le script:

if ($resultat)

  return $resultat;

else

{

  echo "<B>Erreur dans l'execution de la requete $requete.</B><BR>";

  echo "<b>Message MySQL:</b>" .mysql_error($connexion);

  exit;

}

Modifié par furious Gontran
Lien vers le commentaire
Partager sur d’autres sites

Pourtant, si tu as fait un 'copier/coller' de la requète, il serait étonnant qu'elle marche. Il manque pas mal d'espaces, avant les OR, par exemple là :

LIKE '%manga%'OR chroniques.Titre

Lien vers le commentaire
Partager sur d’autres sites

SELECT * FROM chroniques, zoom WHERE chroniques.Titre LIKE '%batman%' OR chroniques.Resume LIKE '%batman%' OR zoom.Titre LIKE '%batman%' OR zoom.Resume LIKE '%batman%' LIMIT 0,20

Voici la requete avec les espaces, le resultat est le meme...

Mon code affichant les erreurs n'est pas bon ou je dois ca a Murphy ??

Si je fais la meme requete avec seulement FROM chroniques ca marche bien...

...Comprend pas...

Modifié par furious Gontran
Lien vers le commentaire
Partager sur d’autres sites

Veuillez vous connecter pour commenter

Vous pourrez laisser un commentaire après vous êtes connecté.



Connectez-vous maintenant
×
×
  • Créer...