[Résolu] Newbie - requêtes SQL de sélection et boucle

Newbie - requêtes SQL de sélection et boucle [Résolu] - PHP - Programmation

Marsh Posté le 30-05-2008 à 10:20:26    

Bonjour,
 
Ci-après le problème que je rencontre :  
 
$tab = $_POST['tableau']; --> $tab est le résultat de mon POST (sélection multiple à partir d'une liste déroulante ex . test1 test2
     
Actuellement, j'ai ce bout de code :
 
$sql_query = "select `firstname`,`lastname`,`username`,`password` from $table where `tab` like '$tab'"; --> ma requête
     
// récupération des données
$result = mysql_query($sql_query) or die("Erreur de connexion ".mysql_error()); --> récupération du résultat de ma requête
$fields_cnt = mysql_num_fields($result);
 
 
Cela fonctionne bien mais cela me prend en compte que la dernière sélection soit test2
 
Comment dois-je insérer une boucle pour que je récupère mon tri sur les 2 sélections ?
 
exemple :
 
foreach ($tab as $p) {
}
 
J'ai lu ici qu'il fallait éviter de placer des requêtes à l'intérieur de boucles
 
http://www.wikini.net/wakka.php?wi [...] mmationPhP
 
Pouvez-vous m'aider à insérer correctement cette boucle ? sachant que tout le reste du code utilise le contenu de la variable $result.

Message cité 1 fois
Message édité par sneakz le 31-05-2008 à 14:26:16
Reply

Marsh Posté le 30-05-2008 à 10:20:26   

Reply

Marsh Posté le 30-05-2008 à 10:27:46    

pas compris la question. Tu cherches à faire quoi? Boucler sur les résultats de ta requête? Si oui, while(mysql_fetch_*(...)){}


---------------
Can't buy what I want because it's free -
Reply

Marsh Posté le 30-05-2008 à 11:03:54    

sneakz a écrit :

Bonjour,
 
Ci-après le problème que je rencontre :  
 
$tab = $_POST['tableau']; --> $tab est le résultat de mon POST (sélection multiple à partir d'une liste déroulante ex . test1 test2
     
Actuellement, j'ai ce bout de code :
 
$sql_query = "select `firstname`,`lastname`,`username`,`password` from $table where `tab` like '$tab'"; --> ma requête
     
// récupération des données
$result = mysql_query($sql_query) or die("Erreur de connexion ".mysql_error()); --> récupération du résultat de ma requête
$fields_cnt = mysql_num_fields($result);
 
 
Cela fonctionne bien mais cela me prend en compte que la dernière sélection soit test2
 
Comment dois-je insérer une boucle pour que je récupère mon tri sur les 2 sélections ?
 
exemple :
 
foreach ($tab as $p) {
}
 
J'ai lu ici qu'il fallait éviter de placer des requêtes à l'intérieur de boucles
 
http://www.wikini.net/wakka.php?wi [...] mmationPhP
 
Pouvez-vous m'aider à insérer correctement cette boucle ? sachant que tout le reste du code utilise le contenu de la variable $result.


 
Si $tab est un tableau, c'est assez bizarre que tu récupères quelque chose,  
$sql_query = "select `firstname`,`lastname`,`username`,`password` from $table where `tab` like '$tab'" devrait renvoyer une erreur ...
 
La requête qu'il faut utiliser est  
select `firstname`,`lastname`,`username`,`password` from $table where `tab` IN ('test1', 'test2')
Donc tu fais
$in="'".inplode("', '",$tab)."'";
inplode ("', ",$tab) concatène tous les éléments de tab en les séparant par ', ' =>test1', 'test2
$sql_query = "select `firstname`,`lastname`,`username`,`password` from $table where `tab` IN ($in)";
 
Au passage, si le tableau est vide, tu auras select `firstname`,`lastname`,`username`,`password` from $table where `tab` IN ('')
Ce n'est peut-être pas le résultat attendu, donc fais y attention ...

Reply

Marsh Posté le 30-05-2008 à 11:55:27    

La liste déroulante :
 

Code :
  1. echo "<form action='export.php' method='post'><br>
  2. Veuillez choisir une ou plusieurs valeurs<br>";
  3. echo "\t\t<select name=\"tableau[]\" size=20 style=\"width:100px\" multiple>\n";
  4. $response = mysql_query("SELECT distinct valeur FROM table" ) or die("Erreur SQL : $query<br/>".mysql_error());
  5. while ($data = mysql_fetch_array($response))
  6. {
  7. echo "<option value='$data[valeur]' name='$data[valeur]'>".$data['valeur']."</option>"; 
  8. }
  9. echo "</select><br/><br>";
  10. echo "<input type='submit' value='Valider'/>";
  11. echo "</form>";


 
$tab = $_POST['tableau']; --> $tab est le résultat de mon POST (sélection multiple à partir d'une liste déroulante ex . test1 test2
 
Conditions :
 
1) ma liste déroulante change car le contenu de table 'table' change régulièrement
2) la sélection qui plus est change
 
Ce que je veux faire :
 
1) Afficher une liste déroulante dont le contenu est issu d'une première requête SQL (cette partie là fonctionne)
2) Pouvoir sélectionner 1 ou plusieurs éléments de cette liste
Pour cela j'ai ajouter un select multiple et j'ai ajouté [] derrière le nom de la variable tableau (le nom est peut-être mal à proprié)
 
3) Récupérer la sélection depuis la méthode POST
 
$tab = $_POST['tableau'];
 
Paulp  --> je récupère bien quelque chose (un echo placé derrière me renvoie bien test1 et test2)
 
4) Traiter chaque élément de ma sélection pour effectuer une requête SQL sur chacun d'eux
 
$sql_query = "select `firstname`,`lastname`,`username`,`password` from table where `tab` like '$tab'"; --> ma requête
 
J'ai pensé alors à une boucle.
 
5) le reste du  code utilise $result et formate les données afin d'exporter un ficher csv.
 
J'espère que ce complément vous permettra de mieux comprendre ce que je veux faire.
 
Merci beaucoup

Message cité 1 fois
Message édité par sneakz le 30-05-2008 à 11:57:55
Reply

Marsh Posté le 30-05-2008 à 22:36:54    

sneakz a écrit :

La liste déroulante :
 

Code :
  1. echo "<form action='export.php' method='post'><br>
  2. Veuillez choisir une ou plusieurs valeurs<br>";
  3. echo "\t\t<select name=\"tableau[]\" size=20 style=\"width:100px\" multiple>\n";
  4. $response = mysql_query("SELECT distinct valeur FROM table" ) or die("Erreur SQL : $query<br/>".mysql_error());
  5. while ($data = mysql_fetch_array($response))
  6. {
  7. echo "<option value='$data[valeur]' name='$data[valeur]'>".$data['valeur']."</option>"; 
  8. }
  9. echo "</select><br/><br>";
  10. echo "<input type='submit' value='Valider'/>";
  11. echo "</form>";


 
$tab = $_POST['tableau']; --> $tab est le résultat de mon POST (sélection multiple à partir d'une liste déroulante ex . test1 test2
 
Conditions :
 
1) ma liste déroulante change car le contenu de table 'table' change régulièrement
2) la sélection qui plus est change
 
Ce que je veux faire :
 
1) Afficher une liste déroulante dont le contenu est issu d'une première requête SQL (cette partie là fonctionne)
2) Pouvoir sélectionner 1 ou plusieurs éléments de cette liste
Pour cela j'ai ajouter un select multiple et j'ai ajouté [] derrière le nom de la variable tableau (le nom est peut-être mal à proprié)
 
3) Récupérer la sélection depuis la méthode POST
 
$tab = $_POST['tableau'];
 
Paulp  --> je récupère bien quelque chose (un echo placé derrière me renvoie bien test1 et test2)
 
4) Traiter chaque élément de ma sélection pour effectuer une requête SQL sur chacun d'eux
 
$sql_query = "select `firstname`,`lastname`,`username`,`password` from table where `tab` like '$tab'"; --> ma requête
 
J'ai pensé alors à une boucle.
 
5) le reste du  code utilise $result et formate les données afin d'exporter un ficher csv.
 
J'espère que ce complément vous permettra de mieux comprendre ce que je veux faire.
 
Merci beaucoup


 
Si $tab est une string, tu peux faire
$sql_query = "select `firstname`,`lastname`,`username`,`password` from $table where `tab` IN ('".str_replace(' ',"', '",$tab)."')";

Reply

Marsh Posté le 31-05-2008 à 14:24:22    

J'ai finalement effectué une boucle de la façon suivante ::
 

Code :
  1. if(isset($_POST['tableau']) && !empty($_POST['tableau']))
  2. {
  3.  $col_array = $_POST['tableau'];
  4.  foreach($col_array as $value)
  5.  {
  6.    ...
  7.    $sql_query = "select `firstname`,`lastname`,`username`,`password` from table where `tab` like '$value'";
  8.    ...
  9.  }
  10. }

Reply

Marsh Posté le 31-05-2008 à 17:41:01    

sneakz a écrit :

J'ai finalement effectué une boucle de la façon suivante ::
 

Code :
  1. if(isset($_POST['tableau']) && !empty($_POST['tableau']))
  2. {
  3.  $col_array = $_POST['tableau'];
  4.  foreach($col_array as $value)
  5.  {
  6.    ...
  7.    $sql_query = "select `firstname`,`lastname`,`username`,`password` from table where `tab` like '$value'";
  8.    ...
  9.  }
  10. }



 
As-tu au moins testé ce que j'ai mis ?
C'est idiot de boucler sur une requête quand une requête unique suffit  :sweat:  

Reply

Marsh Posté le 31-05-2008 à 18:32:38    

Paulp, j'avais testé et cela ne fonctionnait pas correctement. Mais je pense que naïvement j'ai placé la requête dans la boucle donc cela ne pouvait pas marcher.
 
Quand bien même. Je dis certainement des bétises. A travers la boucle, je dégage un "tableau" :

Code :
  1. $result = mysql_query($sql_query) or die("Erreur de connexion ".mysql_error());
  2. while($array = mysql_fetch_array($result))
  3.      {
  4.        echo '<pre>';
  5.        print_r($array);
  6.        echo '</pre>';
  7. }


 
Il m'est plus facile ensuite de traiter l'export vers un csv
Si je m'en tiens uniquement à la requête, je ne vois pas comment boucler sur chaque enregistrement pour créer le fichier csv.
 
Je manque cruellement de connaissances, je parle donc un peu dans le vide.
 
Je prendrai le temps Paulp de tester à nouveau ta solution qui apparaît être plus optimale.


Message édité par sneakz le 31-05-2008 à 18:35:02
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed