Question sur la concaténation de variables

Question sur la concaténation de variables - PHP - Programmation

Marsh Posté le 07-12-2008 à 00:42:48    

Bonjour à tous, en tant que novice je viens solliciter vos lumières, pour un truc tout con mais que je n'arrive pas à régler.
 
J'ai un formulaire, qui pour certains éléments, contient plusieurs réponses possibles (genre pour un membre, au champ "pays visité" il peut écrire dans un champ 'France', dans l'autre "Angleterre" etc...
 
Je souhaite mettre ces données ensuite dans ma bd MySQL, de manière propre. J'ai mis plusieurs champs dispo pour ça, il faut donc que mon script détecte si le champ a été rempli, ajoute chaque valeur retournée dans une seule variable et l'injecte dans la bd. Voici ce que j'ai fait pour le moment :
 
Code de la page :  
 

Code :
  1. <form method='POST' action='test1.php'>
  2. <input type="text" name="pays"/>
  3. <input type="text" name="pays1"/>
  4. <input type="text" name="pays2"/><br/>
  5. <input type="text" name="pays3"/>
  6. <input type="text" name="pays4"/>
  7. <input type="text" name="pays5"/><br/><br/>
  8. <input type="submit" name="submit" class="button" value="Enregistrer" /></form>


 
puis code du script :
 

Code :
  1. if(isset($_POST['pays']))
  2. {
  3. $pays = $_POST['pays'] ;
  4. }
  5. if (isset($_POST['pays1']))
  6. {
  7. $pays1 = $_POST['pays1'] ;
  8. }
  9. if (isset($_POST['pays2']))
  10. {
  11. $pays2 = $_POST['pays2'] ;
  12. }
  13. if (isset($_POST['pays3']))
  14. {
  15. $pays3 = $_POST['pays3'] ;
  16. }
  17. if (isset($_POST['pays4']))
  18. {
  19. $pays4 = $_POST['pays4'] ;
  20. }
  21. if (isset($_POST['pays5']))
  22. {
  23. $pays5 = $_POST['pays5'] ;
  24. }


 
 
Ma problématique est à ce moment là de rassembler en une seule variable les données rapportées par tous les $pays pour ensuite l'injecter en bd. J'ai bien pensé à faire quelque chose en concaténation type $pays_total = "$pays1.', '.$pays2" etc... mais ça va me foutre systématiquement des espaces alors que je n'en veux qu'entre 2 variables qui existent. Quelqu'un aurait il une solution à me proposer ?

Reply

Marsh Posté le 07-12-2008 à 00:42:48   

Reply

Marsh Posté le 07-12-2008 à 01:26:13    

bcp plus simple comme ça

 

ton formulaire

 
Code :
  1. <form method='POST' action='test1.php'>
  2. <input type="text" name="pays[]"/>
  3. <input type="text" name="pays[]"/>
  4. <input type="text" name="pays[]"/><br/>
  5. <input type="text" name="pays[]"/>
  6. <input type="text" name="pays[]"/>
  7. <input type="text" name="pays[]"/><br/><br/>
  8. <input type="submit" name="submit" class="button" value="Enregistrer" /></form>
 

ton script de récupération (ajouter des vérifications sur les données)

 
Code :
  1. <?php
  2. if(isset($_POST['pays']))
  3.    {
  4.      for ($i=0; $i<count($_POST['pays']); $i++)
  5.              {
  6.           if(!empty($_POST['pays'][$i])) $output[] =  $_POST['pays'][$i];
  7.              }
  8.    $pays_concat = implode(",", $output);
  9.    }
  10. ?>

Message cité 1 fois
Message édité par bricocoman le 07-12-2008 à 01:28:54
Reply

Marsh Posté le 07-12-2008 à 01:35:40    

En effet ça parait beaucoup plus simple, je soupçonnais une manière bien plus "propre" de faire cela, et en effet ton script fait exactement ce que je souhaitais :jap:
 
Je vais étudier son fonctionnement (je suis pas super à l'aise avec les for) pour mieux comprendre le truc.
 
Merci beaucoup en tout cas !!

Reply

Marsh Posté le 07-12-2008 à 02:01:13    

Alors si je comprends bien :D
 
Tu créés une boucle à l'aide de la variable $i. Tant que $i est inférieur au nombre de fois ou le champs pays a été renseigné, tu rentres la valeur du tableau pays correspondant dans le tableau output, puis après tu demandes une concaténation du tableau output ?

Reply

Marsh Posté le 07-12-2008 à 11:22:25    

bricocoman a écrit :


 

Code :
  1. <?php
  2. if(isset($_POST['pays']))
  3.    {
  4.      for ($i=0; $i<count($_POST['pays']); $i++)
  5.              {
  6.           if(!empty($_POST['pays'][$i])) $output[] =  $_POST['pays'][$i];
  7.              }
  8.    $pays_concat = implode(",", $output);
  9.    }
  10. ?>



 
Ce bout de code est super moche. Foreach.


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

Marsh Posté le 07-12-2008 à 11:55:04    

la beauté est subjective [:anathema]

Reply

Marsh Posté le 07-12-2008 à 13:45:26    

Code :
  1. <?php
  2. if(is_array($_POST['pays'])) {
  3.    foreach($_POST['pays'] as $pays) {
  4.        // $pays
  5.    }
  6. }
  7. ?>


 
c'est quand même bien plus pratique [:anathema]

Reply

Marsh Posté le 07-12-2008 à 18:10:03    

je n'en disconviendrai pas :o

Reply

Marsh Posté le 07-12-2008 à 19:13:40    


Je comprends bien ce code mais cela me renvoie une erreur en voulant formater les données :

 
Code :
  1. if(is_array($_POST['pays'])) {
  2.          foreach($_POST['pays'] as $pays) ;
  3.  $pays_concat = implode(",", $pays); 
  4.   }
 

Warning: implode() [function.implode]: Invalid arguments passed in C:\Programmes\Wamp\www\test\bd\test1.php on line 13 (la ligne de l'implode)

 


Si je fais un echo "$pays", ça me renvoie mes données enregistrées mais toutes à la suite sans espace, ce qui les rend inexploitables par la suite.


Message édité par kiki le 07-12-2008 à 19:16:40
Reply

Marsh Posté le 07-12-2008 à 19:26:36    

Déja je comprends pas pourquoi ceci me renvoi des erreurs : Warning: implode() [function.implode]: Invalid arguments passed in C:\Programmes\Wamp\www\test\bd\test1.php on line 9
 

Code :
  1. foreach($_POST['pays'] as $pays)
  2. $pays_concat = implode("", $pays) ;
  3. echo "$pays_concat";


 

Reply

Marsh Posté le 07-12-2008 à 19:26:36   

Reply

Marsh Posté le 07-12-2008 à 20:13:12    

parce-que tu réfléchis pas à ce que tu fais et que tu copies/colles du code au pif?


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

Marsh Posté le 07-12-2008 à 20:17:47    

J'y réfléchis, je me documente, je lis et j'essaye de comprendre, et ça fait quelques heures que j'essaye de résoudre ça, mais quand on débute tout n'est pas évident, et on tatonne forcément.

Reply

Marsh Posté le 07-12-2008 à 22:28:01    

regarde dans la doc ce que font foreach et implode, et tu comprendras bien que ça n'a pas de sens de les utiliser comme ça...


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

Marsh Posté le 07-12-2008 à 23:52:38    

Bon ok je pense avoir compris, j'ai réussi ce que je voulais en faisant ça :

Code :
  1. if(is_array($_POST['pays']))
  2. {
  3.    foreach($_POST['pays'] as $pays)
  4.    {
  5.  if ($pays!="" ) {
  6.  echo "$pays," ;
  7.        }
  8.    }
  9. }
 

Le seul "hic", c'est que ça me met forcément la virgule à la dernière entrée, genre : entrée1,entrée2,
Mais je pense pas que ce soit trop grave


Message édité par kiki le 07-12-2008 à 23:53:04
Reply

Marsh Posté le 07-12-2008 à 23:57:02    

http://fr.php.net/manual/fr/function.implode.php
 
T'as pas dû lire l'exemple 1 c'est pas possible...
 
$_POST['pays'] c'est ton tableau, y a strictement rien à faire.


---------------
StarCraft Professional Gaming Database | [Ze Topic] Starcraft/BroodWar
Reply

Marsh Posté le 08-12-2008 à 00:01:48    

j'ai testé en me basant sur ce modèle, ça me créé une chaine type "entrée1,entrée1,,,,, (autant de virgules que de champs de formulaires restant si on a mis une virgule en paramètre d'implode), il ne distingue pas si une donnée a été rentrée ou non dans le formulaire.


Message édité par kiki le 08-12-2008 à 00:03:08
Reply

Marsh Posté le 08-12-2008 à 00:20:17    

Soit tu fais un truc comme bricocoman (mais avec un foreach c'est plus joli), soit tu vires tous les éléments null de ton tableau avant avec un truc comme ça :
 

Code :
  1. function was_filled($var) {
  2.  return !empty($var);
  3. }
  4. $pays = array_filter($_POST['pays'], 'was_filled');


---------------
StarCraft Professional Gaming Database | [Ze Topic] Starcraft/BroodWar
Reply

Marsh Posté le 08-12-2008 à 00:28:53    

En effet, cela marche bien comme cela aussi avec l'implode par la suite.

 

Pourquoi tu dis que foreach est plus joli ? En terme de performances, mieux vaut un foreach qu'une boucle avec un count ?
En tout cas merci :jap:


Message édité par kiki le 08-12-2008 à 00:29:08
Reply

Marsh Posté le 08-12-2008 à 07:34:12    

sielfried a écrit :

Soit tu fais un truc comme bricocoman (mais avec un foreach c'est plus joli), soit tu vires tous les éléments null de ton tableau avant avec un truc comme ça :
 

Code :
  1. function was_filled($var) {
  2.  return !empty($var);
  3. }
  4. $pays = array_filter($_POST['pays'], 'was_filled');



 
J'avais même pas tout lu...[:joce]
De toute manière si un champ n'est pas renseigné il n'est pas POSTé non?
Dans ce cas il suffit de vérifier l'existence de la variable et de faire un implode...:D


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

Sujets relatifs:

Leave a Replay

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