Php ! Explode() need help

Résolu/Fermé
dubuducu Messages postés 391 Date d'inscription lundi 8 novembre 2004 Statut Membre Dernière intervention 19 mai 2010 - 1 juil. 2008 à 12:37
dubuducu Messages postés 391 Date d'inscription lundi 8 novembre 2004 Statut Membre Dernière intervention 19 mai 2010 - 3 juil. 2008 à 10:42
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
A voir également:

6 réponses

Reivax962 Messages postés 3671 Date d'inscription jeudi 16 juin 2005 Statut Membre Dernière intervention 11 février 2021 1 011
1 juil. 2008 à 12:49
Bonjour,

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

Bonne chance,

Xavier
1
xclsaian Messages postés 12 Date d'inscription mardi 21 juin 2005 Statut Membre Dernière intervention 1 juillet 2008 1
1 juil. 2008 à 12:52
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
1
dubuducu Messages postés 391 Date d'inscription lundi 8 novembre 2004 Statut Membre Dernière intervention 19 mai 2010 4
1 juil. 2008 à 13:04
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>'; 
0
xclsaian Messages postés 12 Date d'inscription mardi 21 juin 2005 Statut Membre Dernière intervention 1 juillet 2008 1
1 juil. 2008 à 13:18
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.
0
dubuducu Messages postés 391 Date d'inscription lundi 8 novembre 2004 Statut Membre Dernière intervention 19 mai 2010 4
1 juil. 2008 à 13:46
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!
0
Reivax962 Messages postés 3671 Date d'inscription jeudi 16 juin 2005 Statut Membre Dernière intervention 11 février 2021 1 011
2 juil. 2008 à 09:50
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.
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
dubuducu Messages postés 391 Date d'inscription lundi 8 novembre 2004 Statut Membre Dernière intervention 19 mai 2010 4
3 juil. 2008 à 10:42
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 !
0
dubuducu Messages postés 391 Date d'inscription lundi 8 novembre 2004 Statut Membre Dernière intervention 19 mai 2010 4
1 juil. 2008 à 12:54
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
-1
xclsaian Messages postés 12 Date d'inscription mardi 21 juin 2005 Statut Membre Dernière intervention 1 juillet 2008 1
1 juil. 2008 à 13:01
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.
0