Rechercher : dans
Par :

Php ! Explode() need help

Dernière réponse le 3 jui 2008 à 10:42:44 dubuducu, le 1 jui 2008 à 12:37:22 
 Signaler ce message aux modérateurs

Bonjour,
voici mon probleme, je ne comprends pas tout dans mon code ...

$tre = $_POST['saisie'];
$decoupe = explode(",",$tre);
echo "$tre";

$boucle=0;
  while ($boucle < sizeof($tre)) 
  {
    echo $decoupe[$boucle];
    echo "n";
    $boucle = $boucle+1; 
  }



dans ma page precédente, je post une chaine du jenre 12,25,35,36 nommée "$saisie"
jvoudrai la découper et recuperer 12 25 35 et 36 par exemple séparement ! voyez vous ?

Merci
Configuration: Windows XP
Internet Explorer 6.0

Meilleures réponses pour « php ! Explode() need help » dans :
[PHP] Upload de fichiers VoirLe langage PHP permet de gérer des fichiers envoyés (uploadés) grâce à un formulaire HTML. Formulaire d'envoi de fichiers Configuration de PHP pour permettre l'upload Récupération du fichier avec PHP Formulaire d'envoi de fichiers La...
[PHP] Notice: Undefined index: VoirSi vous utilisez les tableaux $_POST ou $_GET pour récupérer les variables de vos formulaires ou autres, il se peut que vous tombiez sur cette erreur: Notice: Undefined index 'champs du tableau' in 'chemin du fichier php en cours d'execution' on line...
[PHP] Parse error, unexpected T_STRING, expecting ',' or ';' VoirCette erreur, fréquente, se produit notamment lorsqu'un guillemet est présent dans une chaîne délimitée par ce même type de guillemets, par exemple :
Télécharger PHP Edit VoirPHPEdit est un environnement de développement intégré (IDE) sous Windows pour le langage PHP. Il offre un grand nombre de fonctionnalités permettant de développer plus efficacement : Coloration syntaxique Auto-complétion des fonctions Débuggeur...
Télécharger PHP FTP Synchronizer VoirLa mise à jour de site web est aussi complexe que sa conception. Alors il faut utiliser le bon outil avec les bon paramètres et une bonne connaissance de programmation pour mettre à jour un site. PHP FTP Synchronizer est une application vous...
PHP - Bases de données VoirPhp permet un interfaçage très simple avec un grand nombre de bases de données. Lorsqu'une base de données n'est pas directement supportée par Php, il est possible d'utiliser un driver ODBC, pilote standard pour communiquer avec les bases de...
PHP - Récupération de données VoirPHP rend très simple la récupération de données envoyées par l'intermédiaire de formulaires HTML. Création d'un formulaire Grâce à la balise FORM du langage HTML, il est très simple de créer des formulaires comprenant : des champs de saisie des...
PHP - Les fichiers VoirLa gestion des fichiers avec PHP Avec PHP, la création ou la lecture de fichiers est, une fois de plus, assez simple. Il existe une multitude de fonctions dédiées à l'utilisation des fichiers. La communication entre le script PHP et le fichier...

1

Reivax962, le 1 jui 2008 à 12:49:20

Bonjour,

Dans ta boucle, sizeof($tre) doit être remplacé par sizeof($decoupe).

Bonne chance,

Xavier

Répondre à Reivax962

2

xclsaian, le 1 jui 2008 à 12:52:03

Bonjour,

Il y a une erreur dans la valeur testée par sizeof. Tu devrais faire un sizeof ($decoupe), c'est à dire le tableau qui est retourné par la fonction explode.

Voilà j'espère avoir pu t'aider. Si tu as encore des problèmes, n'hésite pas... Et si cette explication a résolu ton problème, n'hésite pas à le faire savoir également. Les réponses positives encouragent souvent à répondre ;-)

Bonne journée
[XCL]*Ange-Saian* 
Ingénieur Informatique – Spé. Ingénierie des Logiciels Libre­s

Répondre à xclsaian

3

dubuducu, le 1 jui 2008 à 12:54:36

Cela fonctionne parfaitement merci,voila ce qu'il fallai mettre :

$tre = $_POST['saisie'];
$decoupe = explode(",",$tre);
echo "$tre";

$boucle=0;
  while ($boucle < sizeof($decoupe)) 
  {
    echo $decoupe[$boucle];
    echo "  ";
    $boucle = $boucle+1; 
  }




par contre maintenant le probleme est le suivant :
$sql = "SELECT clic FROM devis_table where id IN ($decoupe)  "; 
$result = mysql_query( $sql) or die( "Erreur : " . mysql_error() ); 


me provoque l'erreur suivante :
Erreur : Unknown column 'Array' in 'where clause'

:( pas cool

Répondre à dubuducu

4

xclsaian, le 1 jui 2008 à 13:01:00

Ton echo $decoupe retourne la chaine "Array" car il correspond à un tableau.
La fonction d'affichage des contenus d'un tableau est la fonction print_r($tab), mais la syntaxe du résultat retourné ne correspondra pas pour être directement injectée dans le SQL.
Un exemple de résultat pour print_r($decoupe) => Array ( [0] => 12 [1] => 25 [2] => 35 [3] => 36 ) .

Si tu veux chacune des valeurs de ton tableau tu peux plutôt les parcourir et les ecrire dans ton IN.

Voilà, bonne journée.
[XCL]*Ange-Saian* 
Ingénieur Informatique – Spé. Ingénierie des Logiciels Libres

Répondre à xclsaian

5

dubuducu, le 1 jui 2008 à 13:04:07

Hum voila ... je n'ai rien compris !
cela semble pas tres dur a comprendre mais je ne vois toujours pas comment faire pour injecter dans sql les valeurs séparées afin qu'il me resssorte le "$clic" corespondant au 26 ainsi que celui au 15 etc ... est-ce possible ?


$sql = "SELECT clic FROM devis_table where id IN ($decoupe)  "; 
$result = mysql_query( $sql) or die( "Erreur : " . mysql_error() ); 
		
	if($result) { 
 echo '<table>'; 

echo '<tr>'; 
echo '<td width="80" bgcolor="#3366ff"><b><u><font color="#FFFFFF">Devis n° :</font></u></b></td>'; 
echo '</tr>'."\n"; 
// lecture et affichage des résultats sur 4 colonnes, 1 résultat par ligne. 

while($row = mysql_fetch_array($result)) 
{ 	
		echo '<tr>'; 
		echo '<td width="80" bgcolor="#e8e2e2">'.$row[clic].'</td>'; 
echo '</tr>'; 				
} 

} 
else 
{
echo 'Pas d\'enregistrements dans cette table...'; 
}
 echo '</table>'; 

Répondre à dubuducu

6

xclsaian, le 1 jui 2008 à 13:18:55

La syntaxe de ta requête n'est pas bonne. dans la section Where, le IN attend quelque chose du style (valeur1, valeur2, valeur3) alors que là tu lui envoi une chaine "Array".

Dans le fond, le principe est bon mais pour la syntaxe tu ne peux pas envoyer directement un tableau dans un echo.

Essai ce code :

tu verras la différence entre les 2 instructions SQL.

<html>
<head>
</head>
<body>
<form method="POST">
	<input type="text" name="saisie" />
	<input type="submit" />
</form>
<br />
<?php

$tre = $_POST['saisie'];
$decoupe = explode(",",$tre);
echo "POST : $tre<br />";

$sql = "SELECT clic FROM devis_table where id IN ($decoupe)  "; 
echo "SQL 1 : ".$sql."<br/>";

$sql = "SELECT clic FROM devis_table where id IN (";
$boucle=0;
  while ($boucle < sizeof($decoupe)) 
  {
    $sql .= $decoupe[$boucle];
    $boucle++;
    if ($boucle < sizeof($decoupe))
	$sql .= ", ";
  }

$sql .= ")  "; 
echo "SQL 2 : ".$sql;

?>
</body>
</html>


Bonne chance.
[XCL]*Ange-Saian* 
Ingénieur Informatique – Spé. Ingénierie des Logiciels Libres

Répondre à xclsaian

7

dubuducu, le 1 jui 2008 à 13:46:15

Impressionnant ... !
je cherche a comprendre la synthaxe (pas evidente).
Je te remercie infiniment pour cette solution qui n'etait pas vraiment evidente.

$tre = $_POST['saisie'];
$decoupe = explode(",",$tre);
echo "$tre";



$sql = "SELECT clic FROM devis_table where id IN (";
$boucle=0;
  while ($boucle < sizeof($decoupe)) 
  {
    $sql .= $decoupe[$boucle];
    $boucle++;
    if ($boucle < sizeof($decoupe))
	$sql .= ", ";
  }

$sql .= ")  "; 
$result = mysql_query( $sql) or die( "Erreur : " . mysql_error() ); 



Parfait!!

A bientot pour de plus amples echanges!

Répondre à dubuducu

8

Reivax962, le 2 jui 2008 à 09:50:25
  • +1

C'est idiot ^^
Tu explose ta chaîne séparée par des virgules, pour la recréer... séparée par des virgules aussi !!!

$tre = $_POST['saisie'];
echo "$tre";

$sql = "SELECT clic FROM devis_table where id IN ($tre)  "; 
$result = mysql_query( $sql) or die( "Erreur : " . mysql_error() ); 
C'est pas plus simple comme ça ?
Enfin ça dépend du format d'entrée de ta chaîne, si tu as une virgule finale ou pas.

Par contre, tu t'exposes à un gros problème d'injection SQL (c'est une technique de piratage)

Imagine qu'un utilisateur malveillant mette "DELETE FROM DEVIS_TABLE" comme valeur dans le formulaire 'saisie'.

Dans les deux solutions apportées, ta requête devient :
"SELECT clic FROM devis_table where id IN (DELETE FROM DEVIS_TABLE) ".
Je te laisse imagine le résultat ! Tu perds toutes tes données.

Suivant comment ton formulaire est fait, ce genre d'attaque est plus ou moins compliquée, mais n'est pas impossible.

Il me paraît indispensable de commencer par faire une vérification de la chaîne $tre.
Par exemple, une simple expression rationnelle peut te la valider.

Ton code devient alors :
$tre = $_POST['saisie'];
echo "$tre";
if (!preg_match("/^(([0-9]*)\s*,\s*)*([0-9]*\s*)$/", $tre))
{
    die("La chaîne donnée, « $tre », n'est pas valide !")
}

$sql = "SELECT clic FROM devis_table where id IN ($tre)  "; 
$result = mysql_query( $sql) or die( "Erreur : " . mysql_error() ); 
Le bloc que j'ai rajouté signifie que la chaîne d'entrée doit être écrite sous la forme :
« chiffres suivis d'une virgule » autant de fois que souhaité, se terminant par des chiffres sans virgule, en autorisant des espaces entre les chiffres et les virgules.

Répondre à Reivax962

9

 dubuducu, le 3 jui 2008 à 10:42:44

Merci effectivement c mieux !
tu m'a fait peur avec tes techniques de piratage la !!!! defacon ce script est utilisé dans lapartie admin de mon site accessible que par mon equipe et moi meme !
Merci beaucoup poiur les précisions !

Répondre à dubuducu