Traiter donnée d'un mysql_fetch_array

Résolu/Fermé
Digit@lChord Messages postés 129 Date d'inscription mardi 24 novembre 2009 Statut Membre Dernière intervention 5 septembre 2012 - 29 déc. 2011 à 00:03
Alain_42 Messages postés 5361 Date d'inscription dimanche 3 février 2008 Statut Membre Dernière intervention 13 février 2017 - 31 déc. 2011 à 17:43
Bonsoir.
J'ai placé un mysql_fetch_array qui me donne toute les lignes de ma table (JR_tutorials) comportant un ID précis (ID nommé 'ID_JB').
Bref sa sa fonctionne, et j'affiche tout ces résultats dans un tableau :

<form>
<form name="edit_existing_tutorials" action="edit_tutorials.php" method="POST">
<table>
<?php
$req = mysql_query("SELECT * FROM JR_tutorials WHERE id_jb=$id ORDER BY id_tu DESC"); 		
while ($data = mysql_fetch_array($req)) { 
echo '<tr><td><input type="text" class="input_text_2" value="'.$data['DEVICES'].'"></td>';
echo '<td><input type="text" class="input_text_2" value="'.$data['NAME'].'"></td>';
echo '<td><input type="text" class="input_text_2" value="'.$data['LINK'].'"></td>';
echo '<td><input type="text" class="input_text_2" value="'.$data['LANG'].'"></td>';
echo '<td><input type="text" class="input_text_2" value="'.$data['RATE'].'"></td></tr>';
}
mysql_free_result ($req); 
?>
</table>
<input type="submit" name="b1" id="input_btn" value="submit"> 


Donc une fois quelles sont affichés je peut les modifier et cliquer sur "submit" pour les envoyer vers la page de traitement (edit_tutorials.php)

Mais la ou je bloque c'est sur leur traitement parceque le nombre de lignes du tableau est variable, donc je vois vraiment pas comment identifier quel ligne de ma bdd je doit modifier en fonction des données que j'envoi dans ma page de traitement.

En vous remerciant par avance.

23 réponses

Alain_42 Messages postés 5361 Date d'inscription dimanche 3 février 2008 Statut Membre Dernière intervention 13 février 2017 894
30 déc. 2011 à 17:01
ha bon parce que chez moi ça marche, je n'ai pas de BDD mais je vois les valeurs dans la requette

j'ai testé avec ce code:

<html>
<head>
<title>Test update de mysql_fetch_array avec foreach</title>
</head>
<body>
<?php
      
if(isset($_POST['b1'])){
	mysql_connect('localhost','root','');
	mysql_select_db('test');
	$lignes=array();
	 $lignes=$_POST['ligne']; 
		/*
	echo '<pre>';
	print_r($_POST['ligne']);
	echo '</pre>';
	*/
	 foreach($_POST['ligne'] as $key=>$value){
		echo '<pre>';
		print_r($value);
		echo '</pre>';
		
	 
	$sql="UPDATE JR_tutorials SET     
	DEVICES='".mysql_real_escape_string($value['DEVICES'])."',    
	NAME='".mysql_real_escape_string($value['NAME'])."',    
	LINK='".mysql_real_escape_string($value['LINK'])."',    
	LANG='".mysql_real_escape_string($value['LANG'])."',    
	RATE='".mysql_real_escape_string($value['RATE'])."' WHERE id_tu='$key' ";    
	//$req = mysql_query($sql, $cnx) or die( mysql_error()); 
		echo '<br />Requette ligne '.$key.' : '.$sql;
		
	 }      
     
}      
?> 

<form name="edit_existing_tutorials" action="" method="POST">
<table>
<tr>
<td>2</td>
<td><input type="text" name="ligne[2][DEVICES]" value=""></td>
<td><input type="text" name="ligne[2][NAME]" value=""></td>
<td><input type="text" name="ligne[2][LINK]" value=""></td>
<td><input type="text" name="ligne[2][LANG]" value=""></td>
<td><input type="text" name="ligne[2][RATE]" value=""></td>
</tr>
<tr>
<td>1</td>
<td><input type="text" name="ligne[1][DEVICES]" value=""></td>
<td><input type="text" name="ligne[1][NAME]" value=""></td>
<td><input type="text" name="ligne[1][LINK]" value=""></td>
<td><input type="text" name="ligne[1][LANG]" value=""></td>
<td><input type="text" name="ligne[1][RATE]" value=""></td>
</tr>
</table><input type="submit" name="b1"value="Save">
</form>	
<pre></pre>
</body>
</html>
1
phoenamandre Messages postés 36 Date d'inscription mercredi 28 décembre 2011 Statut Membre Dernière intervention 15 novembre 2012 5
29 déc. 2011 à 00:09
Bonjour,

Bien je ne sais pas si j'ai tout compris, mais si vous souhaitez modifier les données il suffit dans la page traitant l'update de spécifier la ligne grâce à un "Where id_jb=$id " non ?
0
Digit@lChord Messages postés 129 Date d'inscription mardi 24 novembre 2009 Statut Membre Dernière intervention 5 septembre 2012 8
29 déc. 2011 à 00:22
Sa aurais été aussi simple si j'avais qu'une ligne a modifier.
Or la mon mysql_fetch_array me génère plusieurs ligne (toute les ligne qui contienne une valeur précise au champ "ID_JB" (et il y en a plusieurs).

Par exemple si mon ID_JB = 11, mon mysql_fetch_array me retourne 2 lignes ok ?
en image sa donne sa : http://img841.imageshack.us/img841/9971/89708719.png

Et ces 2 lignes je souhaiterais qu'après les avoir modifié et avoir cliqué sur le bouton submit (situé en dessous du tableau), bah sa me traite les 2 lignes en question et que sa me fasse une requête "UPDATE SET ...ect".

Je me suis renseigné et j'ai trouvé la piste du "Foreach" mais j'ai pas bien compris comment il fonctionnais.

j'espère avoir été assez clair ^^
0
Digit@lChord Messages postés 129 Date d'inscription mardi 24 novembre 2009 Statut Membre Dernière intervention 5 septembre 2012 8
29 déc. 2011 à 01:08
up !
0
phoenamandre Messages postés 36 Date d'inscription mercredi 28 décembre 2011 Statut Membre Dernière intervention 15 novembre 2012 5
29 déc. 2011 à 09:44
foreach va prendre une à une les données d'un tableau.
Don dans votre cas, le mieux serait de faire une boucle pour modifier les données je pense non ?
Vous avez sans doute un ID général qui prendre une valeur différente à chaque ligne.

J'ai une idée, mais c'est un peu gros.
D'abord, étrangement vos input n'ont pas de name ??? Il me semble qu'il faut un name pour les identifier avec php, l'idée serait d'ajouter un champ ID en hidden qui transporterait l'ID de la ligne à traiter.
En plus de ça, pour correctement identifier les input par exemple en disant ce
<input type="text" class="input_text_2" value="'.$data['NAME'].'"> va avec la ligne d'ID 12
et ce
<input type="text" class="input_text_2" value="'.$data['NAME'].'"> va avec celle d'ID 15

il faudrait leur donner un name de la façon suivante

<input type="text" name="name'".$ID."'" class="input_text_2" value="'.$data['NAME'].'">
Comme ça pour la ligne d'ID 12 on aurait
<input type="text" name="name12" class="input_text_2" value="'.$data['NAME'].'">
et pour 15
<input type="text" name="name15" class="input_text_2" value="'.$data['NAME'].'">

et ainsi de suite pour les inputs

Ensuite les ID, on pourrait les obtenir à partir des noms des inputs mais je ne suis pas sûr de savoir le faire donc le mieux serait de mettre dans le while une variable
$IDs
qui ajouterait chaque $ID séparé d'une virgule donc :
$IDs = $IDs.",".$ID ;
et après la boucle on transporte $IDs dans un input invisible.

Ensuite dans la partie traitement, on commence par séparer tous les IDs

$IDsTab = array_map('trim', explode(',', $_POST['IDs']));

foreach($IDsTab as $ID)
{
//et ici on entre les inputs avec le nom $_POST['blabla$ID'] (je ne sais pas si on peut écrire "blabla$ID" dans $_POST, j'ai jamais essayé et je ne peux pas vérifier

}

Donc ça donnerait





<form>
<form name="edit_existing_tutorials" action="edit_tutorials.php" method="POST">
<table>
<?php
$IDs;
$req = mysql_query("SELECT * FROM JR_tutorials WHERE id_jb=$id ORDER BY id_tu DESC");
while ($data = mysql_fetch_array($req)) {
$ID=$data['ID'];
echo '<tr><td><input type="text" class="input_text_2" name="device'".$ID."'" value="'.$data['DEVICES'].'"></td>';
echo '<td><input type="text" name="name'".$ID."'" class="input_text_2" value="'.$data['NAME'].'"></td>';
$IDs=$IDs.",".$ID;

}
mysql_free_result ($req);
echo '<input type="hidden" name="hidden" value="$IDs">"
?>
</table>
<input type="submit" name="b1" id="input_btn" value="submit">



Pour la première partie et ensuite ce que j'ai dit pour le traitement.

En espérant que ça fonctionne, je ne peux pas vérifier là !
Mais c'est vraiment peu optimiser, ça me paraît un peu bricolé mais bon...

Bonne chance !
0

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

Posez votre question
Alain_42 Messages postés 5361 Date d'inscription dimanche 3 février 2008 Statut Membre Dernière intervention 13 février 2017 894
29 déc. 2011 à 10:20
une solution:
<!-- <form> pourquoi deux balise form ? -->
<form name="edit_existing_tutorials" action="edit_tutorials.php" method="POST">
<table>
<?php
$req = mysql_query("SELECT * FROM JR_tutorials WHERE id_jb=$id ORDER BY id_tu DESC");

//il faut obligatoirement un name= aux input on va les mettre pour qu'ils renvoient un array a deux dimentions ligne[id_tu][type_data]	
while ($data = mysql_fetch_array($req)) { 
	echo '<tr><td><input type="text" name="ligne[\'id_tu\'][\'DEVICES\']" class="input_text_2" value="'.$data['DEVICES'].'"></td>';
	echo '<td><input type="text" name="ligne[\'id_tu\'][\'NAME\']" class="input_text_2" value="'.$data['NAME'].'"></td>';
	echo '<td><input type="text" name="ligne[\'id_tu\'][\'LINK\']" class="input_text_2" value="'.$data['LINK'].'"></td>';
	echo '<td><input type="text" name="ligne[\'id_tu\'][\'LANG\']" class="input_text_2" value="'.$data['LANG'].'"></td>';
	echo '<td><input type="text" name="ligne[\'id_tu\'][\'RATE\']" class="input_text_2" value="'.$data['RATE'].'"></td></tr>';
	
}
mysql_free_result ($req); 
?>
</table>
<input type="submit" name="b1" id="input_btn" value="submit"> 
</form>

<?php
if(isset($_POST['b1'])){
	//le bouton submit a été cliqué
	//recup de l'array contenant les valeurs des input
	$lignes=$_POST['ligne'];
	//tu fais ta connexion a la base ...  puis
	
	//on le parcours fait les UPDATE
	foreach($lignes as $key=>$value){
		$req="UPDATE ta_table SET(DEVICES='".mysql_real_escape_string($value['DEVICES']."',NAME='".mysql_real_escape_string($value['NAME'], etc... ) WHERE id_tu='".$key."' ";	
		etc....
	
	
	}

}



?>

si tu a vraiement beaucoup de lignes, on peut mémoriser , comparer et faire les UPDATE uniquement si différent
0
Digit@lChord Messages postés 129 Date d'inscription mardi 24 novembre 2009 Statut Membre Dernière intervention 5 septembre 2012 8
Modifié par Digit@lChord le 29/12/2011 à 12:53
Merci de votre aide a tout les deux ;D
J'ai parcouru vos idée et celle de Alain_42 me semble plus adaptée a mon faible niveau en php ^^
Bref, j'ai optimisé sa à ma table et sa me donne ceci :

<form name="edit_existing_tutorials" action="" method="POST">     
<table><tr><td>> Edit Tutorials</td>     
<td><input type="submit" name="b1" class="input_btn_2" value="Save Existing Tutorials"></td>     
</tr></table>     

 <div id="editable">      
  <table style="padding-left: 4px;padding-top:2px;">      
   <?php         
    $req = mysql_query("SELECT * FROM JR_tutorials WHERE id_jb=$id ORDER BY id_tu DESC");         
    while ($data = mysql_fetch_array($req)) {       
echo '<tr><td><input type="text" name="ligne[\'id_tu\'][\'DEVICES\']" class="input_text_2" maxlength="11" style="color:#FF00FF;width: 50px;" value="'.$data['DEVICES'].'"></td>';     
echo '<td><input type="text" name="ligne[\'id_tu\'][\'NAME\']" class="input_text_2" value="'.$data['NAME'].'"></td>';     
echo '<td><input type="text" name="ligne[\'id_tu\'][\'LINK\']" class="input_text_2" style="width: 342px;" value="'.$data['LINK'].'"></td>';     
echo '<td><input type="text" name="ligne[\'id_tu\'][\'LANG\']" class="input_text_2" style="width: 30px;" maxlength="2" value="'.$data['LANG'].'"></td>';     
echo '<td><input type="text" name="ligne[\'id_tu\'][\'RATE\']" class="input_text_2" style="width: 30px;" maxlength="3" value="'.$data['RATE'].'"></td></tr>';     
    }      
    mysql_free_result ($req);        
   ?>      
  </table>      
 </div>      
</form>      
       
<?php      
if(isset($_POST['b1'])){ $lignes=$_POST['ligne'];      

 foreach($lignes as $key=>$value){      
$sql="UPDATE JR_tutorials SET     
DEVICES='".mysql_real_escape_string($value['DEVICES'])."',    
NAME='".mysql_real_escape_string($value['NAME'])."',    
LINK='".mysql_real_escape_string($value['LINK'])."',    
LANG='".mysql_real_escape_string($value['LANG'])."',    
RATE='".mysql_real_escape_string($value['RATE'])."' WHERE id_tu=$key";    
$req = mysql_query($sql, $cnx) or die( mysql_error());    
 }      
if($req) {echo'requete executée';}else{echo'requete non executée';}      
}      
?> 


EDIT : Bon finalement la requete s'exécute mais pas correctement parceque quand je clique sur mon bouton, il m'affiche "requete exécutée" mais je n'observe aucune modifications sur mes lignes !
J'ai créer une erreur et j'ai vu que le php me lisais la requete sans remplacer "$value['DEVICES']", $value['NAME']... par leur vrai valeur.

En gros la requête s'exécute comme sa : 'UPDATE JR_tutorials SET DEVICES='', NAME='', LINK='', LANG='', '...ect

Cette erreur provient aussi des input, dont les name ne retourne aucune valeur particulière : <input type="text" name="ligne['ID_TU']['NAME']" class="input_text_2" value="www.url_du_tuto.com">

Dommage sa m'avais l'air d'être la bonne solution...
0
Alain_42 Messages postés 5361 Date d'inscription dimanche 3 février 2008 Statut Membre Dernière intervention 13 février 2017 894
29 déc. 2011 à 13:10
oups j'ai fait une grosse erreur!

mets comme ça:

while ($data = mysql_fetch_array($req)) { 
	$id_tu=$data['id_tu'];
	echo '<tr><td><input type="text" name="ligne['.$id_tu.'][\'DEVICES\']" class="input_text_2" value="'.$data['DEVICES'].'"></td>';
	echo '<td><input type="text" name="ligne['.$id_tu.'][\'NAME\']" class="input_text_2" value="'.$data['NAME'].'"></td>';
	echo '<td><input type="text" name="ligne['.$id_tu.'][\'LINK\']" class="input_text_2" value="'.$data['LINK'].'"></td>';
	echo '<td><input type="text" name="ligne['.$id_tu.'][\'LANG\']" class="input_text_2" value="'.$data['LANG'].'"></td>';
	echo '<td><input type="text" name="ligne['.$id_tu.'][\'RATE\']" class="input_text_2" value="'.$data['RATE'].'"></td></tr>';
	
}
0
Digit@lChord Messages postés 129 Date d'inscription mardi 24 novembre 2009 Statut Membre Dernière intervention 5 septembre 2012 8
29 déc. 2011 à 14:01
Ah oui bien vu :p On y est presque, la les input ressemble a sa avec cette modification, par exemble pour le champ NAME de la l'ID 2
<input type="text" name="ligne['2']['NAME']" class="input_text_2" value="www.url_du_tuto.com">

Et la requete sql pour cette même ligne ressemble a sa : 'UPDATE JR_tutorials SET DEVICES='', NAME='', LINK='', LANG='', RATE='' WHERE id_tu=2 '
Donc du coup quand je clique sur submit, il m'exécute la requête en remplaçant toute les donnée par un vide (LINK='') puisqu'aucune valeur n'arrive a être placé dans la requête mise a part l'id.
0
Alain_42 Messages postés 5361 Date d'inscription dimanche 3 février 2008 Statut Membre Dernière intervention 13 février 2017 894
29 déc. 2011 à 17:54
fais un print_r du POST pour voir ce que tu reçoit:

echo '<pre>';
print_r($_POST['ligne']);
echo </pre>';
0
Digit@lChord Messages postés 129 Date d'inscription mardi 24 novembre 2009 Statut Membre Dernière intervention 5 septembre 2012 8
29 déc. 2011 à 20:01
Les données sont reçu, mais elle ne sont pas envoyée dans la BDD

Array
(
[2] => Array
(
['DEVICES'] => aa
['NAME'] => aaaaaaaaaaaaaaaa
['LINK'] => aaaaaaaaaa
['LANG'] => aaaaaaaaaa
['RATE'] => aaaaaaaaa
)

[1] => Array
(
['DEVICES'] => aaaaaaaaaa
['NAME'] => aaaaaaaaa
['LINK'] => aaaaaaaa
['LANG'] => aaaaaaaaa
['RATE'] => aaaaaaaa
)

)

Voyez par vous même : http://cluster1.easy-hebergement.net/
0
Alain_42 Messages postés 5361 Date d'inscription dimanche 3 février 2008 Statut Membre Dernière intervention 13 février 2017 894
29 déc. 2011 à 20:25
effectivement y a un truc qui m'échappe.

Et si tu supprime les mysql_real_escape_string et laisse seulement $value['....']
0
Digit@lChord Messages postés 129 Date d'inscription mardi 24 novembre 2009 Statut Membre Dernière intervention 5 septembre 2012 8
30 déc. 2011 à 02:32
Aucun changement pour les mysql_real_escape_string.
C'est vraiment dommage qu'on ne puisse pas résoudre cette énigme, ce script est indispensable a mon interface admin et je n'ai pas vu d'autre alternative :(

Je pense que la méthode utilisée pour la récupération des donnée dans la requête update n'est pas la bonne, il faudrai récupérer les valeurs des array, et c'est possible vu qu'elle s'affiche après qu'on est cliqué sur submit !!! :/
0
Alain_42 Messages postés 5361 Date d'inscription dimanche 3 février 2008 Statut Membre Dernière intervention 13 février 2017 894
30 déc. 2011 à 11:31
eureka !!!!!
j'ai trouvé, c'est tout con, il ne faut pas de guillements dans name de l'input pour le nom de définition de l'index

 name="ligne['.$id_tu.'][DEVICES]"

while ($data = mysql_fetch_array($req)) { 
	$id_tu=$data['id_tu'];
	echo '<tr><td><input type="text" name="ligne['.$id_tu.'][DEVICES]" class="input_text_2" value="'.$data['DEVICES'].'"></td>';
	echo '<td><input type="text" name="ligne['.$id_tu.'][\'NAME\']" class="input_text_2" value="'.$data[NAME].'"></td>';
	echo '<td><input type="text" name="ligne['.$id_tu.'][LINK]" class="input_text_2" value="'.$data[LINK].'"></td>';
	echo '<td><input type="text" name="ligne['.$id_tu.'][LANG]" class="input_text_2" value="'.$data[LANG].'"></td>';
	echo '<td><input type="text" name="ligne['.$id_tu.'][RATE]" class="input_text_2" value="'.$data[RATE].'"></td></tr>';
	
}


0
Digit@lChord Messages postés 129 Date d'inscription mardi 24 novembre 2009 Statut Membre Dernière intervention 5 septembre 2012 8
30 déc. 2011 à 16:52
Aucuns changement :(
0
Alain_42 Messages postés 5361 Date d'inscription dimanche 3 février 2008 Statut Membre Dernière intervention 13 février 2017 894
Modifié par Alain_42 le 30/12/2011 à 17:28
je viens de faire le test en réel avec une BDD, avec cette boucle while ça fonctionne:

while ($data = mysql_fetch_assoc($req)) {  
 $id_tu=$data['id_tu']; 
 echo '<tr><td><input type="text" name="ligne['.$id_tu.'][DEVICES]" class="input_text_2" value="'.$data['DEVICES'].'"></td>'; 
 echo '<td><input type="text" name="ligne['.$id_tu.'][NAME]" class="input_text_2" value="'.$data['NAME'].'"></td>'; 
 echo '<td><input type="text" name="ligne['.$id_tu.'][LINK]" class="input_text_2" value="'.$data['LINK'].'"></td>'; 
 echo '<td><input type="text" name="ligne['.$id_tu.'][LANG]" class="input_text_2" value="'.$data['LANG'].'"></td>'; 
 echo '<td><input type="text" name="ligne['.$id_tu.'][RATE]" class="input_text_2" value="'.$data['RATE'].'"></td></tr>'; 
  
}
0
Digit@lChord Messages postés 129 Date d'inscription mardi 24 novembre 2009 Statut Membre Dernière intervention 5 septembre 2012 8
30 déc. 2011 à 17:38
Je test ton code je te tien au jus dans 10 min ;)
0
Digit@lChord Messages postés 129 Date d'inscription mardi 24 novembre 2009 Statut Membre Dernière intervention 5 septembre 2012 8
30 déc. 2011 à 18:00
Sa fonctionne !!!!
Magnifique *-*

Merci beaucoup c'est parfait !
0
Alain_42 Messages postés 5361 Date d'inscription dimanche 3 février 2008 Statut Membre Dernière intervention 13 février 2017 894
30 déc. 2011 à 18:05
on y est arrivé qd même !
0
Digit@lChord Messages postés 129 Date d'inscription mardi 24 novembre 2009 Statut Membre Dernière intervention 5 septembre 2012 8
30 déc. 2011 à 18:14
Je n'y croyais plus :)
0
Alain_42 Messages postés 5361 Date d'inscription dimanche 3 février 2008 Statut Membre Dernière intervention 13 février 2017 894
30 déc. 2011 à 18:45
Si tu as beaucoup de lignes, on peut améliorer le système pour éviter l'update si pas de modif dans la ligne ?
0
Digit@lChord Messages postés 129 Date d'inscription mardi 24 novembre 2009 Statut Membre Dernière intervention 5 septembre 2012 8
30 déc. 2011 à 18:53
Se serais pas mal du tout mais c'est pas indispensable, surtout je t'ai déjà assez embété avec ce script je veut pas te déranger plus longtemps ^^

La sur cette page il me reste la partis ou on l'utilisateur créera une ligne au lieu de la modifier, avec un bouton "insérer une ligne" qui ajoutera une ligne dans le tableau de création des tutoriels, ensuite le script détectera le nombre de ligne créé et réalisera une requête insert into un peu de la même manière que le script utilisé pour les editer, enfin je l'espère :)
0