Jump to content
Sign in to follow this  
furious Gontran

Requete sur plusieurs tables

Rate this topic

Recommended Posts

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 ?

Edited by furious Gontran

Share this post


Link to post
Share on other 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.

;)

Share this post


Link to post
Share on other 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.

Share this post


Link to post
Share on other 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 ;))

Share this post


Link to post
Share on other sites

Généralement on fait :

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

comme ça

- tu peux avoir les mêmes nom de champs sur différentes tables

- tu limites le nombre de réponses aux champs qui t'interessent

-

Share this post


Link to post
Share on other 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 :)

Share this post


Link to post
Share on other 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.

Share this post


Link to post
Share on other 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.

Share this post


Link to post
Share on other 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:

Share this post


Link to post
Share on other 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.

Share this post


Link to post
Share on other 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 ?

Share this post


Link to post
Share on other 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);

Share this post


Link to post
Share on other 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

Edited by furious Gontran

Share this post


Link to post
Share on other 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.

Share this post


Link to post
Share on other sites

C'est pareil pour OR ?

Parceque cette requete me sors toute ma table:

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

Share this post


Link to post
Share on other 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.

Share this post


Link to post
Share on other 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

@+

Edited by manito

Share this post


Link to post
Share on other 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:

Share this post


Link to post
Share on other 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 ;)

Share this post


Link to post
Share on other 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;

}

Edited by furious Gontran

Share this post


Link to post
Share on other 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

Share this post


Link to post
Share on other 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...

Edited by furious Gontran

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
Sign in to follow this  

×
×
  • Create New...