8768 sujets

Développement web côté serveur, CMS

Pages :
Bonjour,

Je dois créer une formulaire de gestion pour gérer l'ordre d'affichage d'élément d'un tableau SQL. Mais j'ignore totalement comment m'y prendre. D'habitude je ne faire des UPDATE sql que pour une seule ligne alors que là il s'agit de faire un UPDATE sur plusieurs lignes. J'ai fait des recherche sur internet, mais je n'arrive pas à comprendre....

Voilà où j'en suis:
if (empty($_POST['enregistrer'])){
	
	$requete = mysql_query("SELECT * FROM spec_categories WHERE site != 'xcel' ORDER BY ordre") or die("22 - ".mysql_error());
	
	?>
<form action="" method="post" name="form" id="form" onsubmit="return verif()">
	<table width="600" border="0" cellspacing="0" cellpadding="0">
		<tr>
			<th height="53" colspan="3" scope="col"><h1>
				<legend>Modifier l'ordre des Catégories</legend></h1></th>
		</tr>
        <?php
		while ($modif = mysql_fetch_assoc($requete)){
			?>
		<tr>
          <td width="40%" height="31" align="right" valign="top" scope="col"> 
          	<select name="ordre" id="ordre">
                    <?php
                    $select = mysql_query('SELECT id,fr,ordre FROM spec_categories WHERE site != "xcel"') or die("42 - ".mysql_error());
                    while ($data = mysql_fetch_array($select)){
                        ?>
                    <option value="<?php echo $data['ordre'] ?>" <?php echo ($data['id'] == $modif['id']?'selected':''); ?>><?php echo $data['ordre'] ?></option>
                        <?php
                    }
                    ?>
          	</select>
          </td>
          <td width="60%" valign="top" scope="col">&nbsp;<?php echo $modif['fr']; ?>
          </td>
        </tr>
            <?php
		}
		?>
        <tr>
        	<td height="31" valign="top" scope="col">&nbsp;</td>
            <td valign="top" scope="col"><input name="enregistrer" type="submit" value="Enregistrer" /></td>
		</tr>
	</table>
</form>
    <?php
}
else{
	$ordre = mysql_real_escape_string($_POST['ordre']);
		
	if(mysql_query("UPDATE spec_categories SET ordre = (case when id='".$modif['id']."' then '$ordre' end) WHERE (id in '".$modif['id']."')") or die("79 - ".mysql_error())){
			
		echo "L'ordre des catégories a été modifié.";
		?>
		<?php
	}
}
?>


Le code html n'est pas génial, mais il s'agit ici d'une utilisation à l'interne.
Modifié par juliesunset (18 Feb 2015 - 16:46)
Salut... Smiley smile

2 choses au premier regard...

1 : D'où vient $modif Smiley id dans le else tout en bas ???

2 : tu as un or die... qu'elle est l'erreur ?? si il y en a une

Sinon

vu que tu fais un where ... in() dans ta requète pourquoi faire un case ???

avec le In ne seront modifié que ceux qui sont a modifier logiquement non ???
$modif vient de la première requête tout en haut.
$requete = mysql_query("SELECT * FROM spec_categories WHERE site != 'xcel' ORDER BY ordre") or die("22 - ".mysql_error());


Je suis bien consciente que ça ne fonctionnement pas... comme je disais, j'ignore comment m'y prendre pour la requête UPDATE multiple...


Erf, bon... au vue du code dégueux, j'ai refais... en espérant que ça soit plus claire:
if (!empty($_POST['enregistrer'])){
	$ordre = mysql_real_escape_string($_POST['ordre']);
	$id = $modif['id'];
	
	$update = "UPDATE spec_categories SET ordre = (case when id='$id' then '$ordre' end) WHERE (id in '$id')" ;
	$result = mysql_query($update) or die("22 - ".mysql_error());
			
		echo "L'ordre des catégories a été modifié.";
}
	
$requete = mysql_query("SELECT * FROM spec_categories WHERE site != 'xcel' ORDER BY ordre") or die("32 - ".mysql_error());
	
	?>
<h1>Modifier l'ordre des Catégories</h1>
<form action="" method="post" name="form" id="form" onsubmit="return verif()">
    <?php
	while ($modif = mysql_fetch_assoc($requete)){
		?>
	<select name="ordre" id="ordre">
		<?php
		$select = mysql_query('SELECT id,fr,ordre FROM spec_categories WHERE site != "xcel"') or die("42 - ".mysql_error());
		while ($data = mysql_fetch_array($select)){
			?>
		<option value="<?php echo $data['ordre'] ?>" <?php echo ($data['id'] == $modif['id']?'selected':''); ?>><?php echo $data['ordre'] ?></option>
			<?php
		}
		?>
  </select> &nbsp;<?php echo $modif['fr']; ?><br>
		<?php
	}
	?>
	<input name="enregistrer" type="submit" value="Enregistrer" />
</form>


Voici l'erreur obtenu:
22 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ''')' at line 1
alors déjà Smiley smile a aucun moment tu n'envoi modif[ "id" ]dans ton post Smiley smile donc pas facile de savoir à quoi ça correspond Smiley smile

tu envoi bien $data[ "ordre" ] mais c'est tout Smiley smile
Modifié par pchlj (18 Feb 2015 - 17:30)
ah ah Smiley smile masi non

tu l'as bien quand tu crée ton select mais quand tu cliques tu POST Smiley smile

et il n'y a aucun input qui contient $modif

fait un echo juste avant ton update de tes variables tu verra que tu n'a rien concernant modif Smiley smile ou alors tu n'as pas mis tout le code Smiley smile
Ah ok! c'est de ce modif dont tu parlais!

Ouais, ben c'est une des partie que j'ignore comment faire... seule la colonne "ordre" a besoin d'être modifié, pas les autres...

Il faut donc que je récupère l'info du "$modif['id']" qui correspond à $_POST['ordre'] à modifier... Mais comment faire?
ah bah ça c'est simple on est dans du formulaire de base Smiley smile

</select><input type='hidden' name='modif[]' value='<?php echo $modif['id']; ?>' /> &nbsp;<?php echo $modif['fr']; ?><br>
ok, je ne connaissait pas <input type='hidden'> enfin si, mais ne l'ais jamais utilisé.

Voilà après modif:
if (!empty($_POST['enregistrer'])){
	$ordre = mysql_real_escape_string($_POST['ordre']);
	$id = mysql_real_escape_string($_POST['id']);
	
	$update = "UPDATE spec_categories SET ordre = (case when id='$id' then '$ordre' end) WHERE (id in '$id')" ;
	$result = mysql_query($update) or die("22 - ".mysql_error());
			
		echo "L'ordre des catégories a été modifié.";
}
	
$requete = mysql_query("SELECT * FROM spec_categories WHERE site != 'xcel' ORDER BY ordre") or die("32 - ".mysql_error());
	
	?>
    <h1>Modifier l'ordre des Catégories</h1>
<form action="" method="post" name="form" id="form" onsubmit="return verif()">
    <!--<legend>Modifier l'ordre des Catégories</legend>-->
    <?php
	while ($modif = mysql_fetch_assoc($requete)){
		?>
	<select name="ordre" id="ordre">
		<?php
		$select = mysql_query('SELECT id,fr,ordre FROM spec_categories WHERE site != "xcel"') or die("42 - ".mysql_error());
		while ($data = mysql_fetch_array($select)){
			?>
		<option value="<?php echo $data['ordre'] ?>" <?php echo ($data['id'] == $modif['id']?'selected':''); ?>><?php echo $data['ordre'] ?></option>
			<?php
		}
		?>
	</select>&nbsp;
    <input type='hidden' name='id' value='<?php echo $modif['id']; ?>' /><?php echo $modif['fr']; ?><br>
  
		<?php
	}
	?>
	<input name="enregistrer" type="submit" value="Enregistrer" />
</form>


mais ça ne fonctionne toujours pas, nouvelle erreur:
22 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ''6')' at line 1
l'erreur se situe dans cette ligne

$update = "UPDATE spec_categories SET ordre = (case when id='$id' then '$ordre' end) WHERE (id in '$id')" ;


moi je l'écrirai plutot come ça

$update = "UPDATE spec_categories SET ordre ='$ordre' WHERE id in ('$id')" ;
ok, donc ça n'as updaté que la dernière ligne, pas les autre...
Je constate également que cette partie du code n'est pas bonne:
<select name="ordre" id="ordre">
		<?php
		$select = mysql_query('SELECT id,fr,ordre FROM spec_categories WHERE site != "xcel"') or die("42 - ".mysql_error());
		while ($data = mysql_fetch_array($select)){
			?>
		<option value="<?php echo $data['ordre'] ?>" <?php echo ($data['id'] == $modif['id']?'selected':''); ?>><?php echo $data['ordre'] ?></option>
			<?php
		}
		?>
	</select>

Après l'update, le dernier champs affichait 5, et mes options s'affichaient 1-2-3-4-5-5, impossible d'avoir 6...
Je doit donc plutôt compté le nombre d'entré et afficher ce nombre.

<select name="ordre" id="ordre">
            <?php
            $select = mysql_query('SELECT id,fr,ordre FROM spec_categories WHERE site != "xcel"') or die("65 - ".mysql_error());
			$d = mysql_num_rows($select);
			
            while ($data = mysql_fetch_array($select)){
                ?>
            <option value="<?php echo $d ?>" <?php echo ($data['id'] == $modif['id']?'selected':''); ?>><?php echo $d ?></option>
                <?php
            }
            ?>
        </select>

ne fonctionne pas.
Une boucle for?
si ça fonctionne suremnt

le truc c'est que tu n'as pas remis l'input HIDDEN

ensuite en haut dan sl'update

si tu veux en eupdater plusieurs il faut faire une boucle sur chaque résultat...

si tu relis mon input hidden j'avais mis name='modif[ ]'

si tu veux transformer le name en ID pas de soucis Smiley smile masi laisse les [ ] derrière cela va POSTER un tableau

donc tu aura $_POST[ id ][ 0 ] etc avec chacun une valeur d'id
t'inquiète j'avais laissé le input hidden, c'était juste pour cibler cette zone en particulier dont je parlais


Mais du coup ça ne fonctionne toujours pas et ne me renvoi plus d'erreur...
if (!empty($_POST['enregistrer'])){
	$ordre = mysql_real_escape_string($_POST['ordre']);
	$id = $_POST['id'];
	
	$update = "UPDATE spec_categories SET ordre ='$ordre' WHERE id in ('$id')";
	$result = mysql_query($update) or die("40 - ".mysql_error());
		
		if($result){	
			echo "L'ordre des catégories a été modifié.";
			echo "<br>".$ordre."<br>".$id;
		}
		else{
			$result = mysql_query($update) or die("40 - ".mysql_error());
		}
}
	
$requete = mysql_query("SELECT * FROM spec_categories WHERE site != 'xcel' ORDER BY ordre") or die("46 - ".mysql_error());
	
	?>
	<h1>Modifier l'ordre des Catégories</h1>
    <form action="" method="post" name="form" id="form" onsubmit="return verif()">
        <?php
        while ($modif = mysql_fetch_assoc($requete)){
			
            $select = mysql_query('SELECT id,fr,ordre FROM spec_categories WHERE site != "xcel"') or die("65 - ".mysql_error());
			$d = mysql_num_rows($select);
            ?>
        <select name="ordre" id="ordre">
            <?php
            while ($data = mysql_fetch_array($select)){
                ?>
            <option value="<?php echo $data['ordre'] ?>" <?php echo ($data['id'] == $modif['id']?'selected':''); ?>><?php echo $data['ordre'] ?></option>
                <?php
            }
            ?>
        </select>&nbsp;
        <input type='hidden' name='id[]' value='<?php echo $modif['id']; ?>' /><?php echo $modif['fr']; ?><br>
            <?php
        }
        ?>
        <input name="enregistrer" type="submit" value="Enregistrer" />
    </form>
ok déjà plus d'erreur c'est bien et si ça ne marche pas c'est que id = array Smiley smile

voici les modif je reprend TON code Smiley cligne

<?php
[b]$i=0;[/b]
        while ($modif = mysql_fetch_assoc($requete)){
			
            $select = mysql_query('SELECT id,fr,ordre FROM spec_categories WHERE site != "xcel"') or die("65 - ".mysql_error());
			$d = mysql_num_rows($select);
            ?>
        <select name="ordre[b][<?=$i?>][/b]" id="ordre">
            <?php

            while ($data = mysql_fetch_array($select)){
                ?>
            <option value="<?php echo $data['ordre'] ?>" <?php echo ($data['id'] == $modif['id']?'selected':''); ?>><?php echo $data['ordre'] ?></option>
                <?php
            }
            ?>
        </select>&nbsp;
        <input type='hidden' name='id[b][<?=$i?>][/b]' value='<?php echo $modif['id']; ?>' /><?php echo $modif['fr']; ?><br>
            <?php
        }
        ?>


voir les morceaux en gras Smiley cligne

et l'autre partie


if (!empty($_POST['enregistrer'])){
[b]foreach($_POST['ordre'] as $key=>$lordre){[/b]
	$ordre = mysql_real_escape_string([b]$lordre[/b]);
	$id = [b]$_POST['id'][$key];[/b]
	
	$update = "UPDATE spec_categories SET ordre ='[b]$lordre[/b]' WHERE [b]id ='$id'[/b]";
	$result = mysql_query($update) or die("40 - ".mysql_error());
		
		if($result){	
			echo "L'ordre des catégories a été modifié.";
			echo "<br>".[b]$lordre[/b]."<br>".$id;
		}
		else{
			$result = mysql_query($update) or die("40 - ".mysql_error());
		}
[b]}[/b]
}


là j'ai mis en gras aussi
Ah ben foreach j'avais commencé à le mettre, j'étais donc pas bien loin...

Mais ce que tu m'as donné ne fonctionne pas... Il n'y a que le dernier élément qui s'update, pas les autres...
voici ce que ça renvoi:
"L'ordre des catégories a été modifié.
5
6 "

if (!empty($_POST['enregistrer'])){
	foreach($_POST['ordre'] as $key=>$lordre){
		
	$ordre = mysql_real_escape_string($lordre);
	$id = $_POST['id'][$key];
		
		$update = "UPDATE spec_categories SET ordre ='$lordre' WHERE id ='$id'";
		$result = mysql_query($update) or die("32 - ".mysql_error());
		
		if($result){	
			echo "L'ordre des catégories a été modifié.";
			echo "<br>".$lordre."<br>".$id;
		}
		else{
			$result = mysql_query($update) or die("40 - ".mysql_error());
		}
	}
}
	
$requete = mysql_query("SELECT * FROM spec_categories WHERE site != 'xcel' ORDER BY ordre") or die("41 - ".mysql_error());
	
	?>
	<h1>Modifier l'ordre des Catégories</h1>
    <form action="" method="post" name="form" id="form" onsubmit="return verif()">
        <?php
		$i=0;
		
        while ($modif = mysql_fetch_assoc($requete)){
			
            $select = mysql_query('SELECT id,fr,ordre FROM spec_categories WHERE site != "xcel"') or die("49 - ".mysql_error());
            ?>
        <select name="ordre[<?=$i?>]" id="ordre">
            <?php
            while ($data = mysql_fetch_array($select)){
                ?>
            <option value="<?php echo $data['ordre'] ?>" <?php echo ($data['id'] == $modif['id']?'selected':''); ?>><?php echo $data['ordre'] ?></option>
            
                <?php
            }
            ?>
        </select>&nbsp;
        <input type='hidden' name='id[<?=$i?>]' value='<?php echo $modif['id']; ?>' /><?php echo $modif['fr']; ?><br>
            <?php
        }
        ?>
        <input name="enregistrer" type="submit" value="Enregistrer" />
    </form>


Et ça peu peut-être être utile, le code source généré:
L'ordre des catégories a été modifié.<br>5<br>6	<h1>Modifier l'ordre des Catégories</h1>
    <form action="" method="post" name="form" id="form" onsubmit="return verif()">
                <select name="ordre[0]" id="ordre">
                        <option value="1" selected>1</option>
                            <option value="2" >2</option>
                            <option value="3" >3</option>
                            <option value="4" >4</option>
                            <option value="5" >5</option>
                            <option value="5" >5</option>
                        </select>&nbsp;
        <input type='hidden' name='id[0]' value='1' />Caractéristiques principales<br>

                    <select name="ordre[0]" id="ordre">
                        <option value="1" >1</option>
                            <option value="2" selected>2</option>
                            <option value="3" >3</option>
                            <option value="4" >4</option>
                            <option value="5" >5</option>
                            <option value="5" >5</option>
                        </select>&nbsp;
        <input type='hidden' name='id[0]' value='2' />Cellulaire/Sans-fil<br>
   
                    <select name="ordre[0]" id="ordre">
                        <option value="1" >1</option>
                            <option value="2" >2</option>
                            <option value="3" selected>3</option>
                            <option value="4" >4</option>
                            <option value="5" >5</option>
                            <option value="5" >5</option>
                        </select>&nbsp;
        <input type='hidden' name='id[0]' value='3' />Fonctionnalités<br>

                    <select name="ordre[0]" id="ordre">
                        <option value="1" >1</option>
                            <option value="2" >2</option>
                            <option value="3" >3</option>
                            <option value="4" selected>4</option>
                            <option value="5" >5</option>
                            <option value="5" >5</option>
                        </select>&nbsp;
        <input type='hidden' name='id[0]' value='4' />Mémoire/Alimentation<br>
      
                    <select name="ordre[0]" id="ordre">
                        <option value="1" >1</option>
                            <option value="2" >2</option>
                            <option value="3" >3</option>
                            <option value="4" >4</option>
                            <option value="5" selected>5</option>
                            <option value="5" >5</option>
                        </select>&nbsp;
        <input type='hidden' name='id[0]' value='5' />Connecteurs/Fixation<br>
     
                    <select name="ordre[0]" id="ordre">
                        <option value="1" >1</option>
                            <option value="2" >2</option>
                            <option value="3" >3</option>
                            <option value="4" >4</option>
                            <option value="5" >5</option>
                            <option value="5" selected>5</option>
                        </select>&nbsp;
        <input type='hidden' name='id[0]' value='6' />Autres<br>

        <input name="enregistrer" type="submit" value="Enregistrer" />
    </form>
arf j'suis trop nul !!! Smiley biggol

j'ai oublié le $i++;

a positionner juste avant la fin de la boucle while de création Smiley lol

t'aurais pu le voir hein Smiley cligne

<input type='hidden' name='id[<?=$i?>]' value='<?php echo $modif['id']; ?>' /><?php echo $modif['fr']; ?><br>
            <?php
[b]$i++;[/b]
        }
        ?>
Oh well! ça fonctionne! Ça enregistrement bien les modifs sur tous les champs.

pchlj a écrit :
j'ai oublié le $i++;
t'aurais pu le voir hein Smiley cligne
En fait non, je n'aurais pas cette façon de faire. Je connais $i++; mais seulement dans une boucle For.


Bon maintenant il n'y qu'un seul petit problème... le champs select affiche le contenu de la colonne "ordre", alors qu'il faudrait que ça affiche le nombre de ligne entré et fait l'association avec le chiffre de la colonne ordre... je ne sais pas si je suis clair...

ex: J'ai 6 catégories entré, chacune est ordonné (colonne ordre) de 1 à 6. Présentement, si je modifie l'ordre via le formulaire et assigne le numéro 5 à 2 catégorie et qu'il n'y a pas de 6, la fois d'après dans le formulaire, ça affiche les nombres 1,2,3,4,5,5.

Je dois avoué que j'ai un mal de chien avec cette notion de $i et $i++ ...
Modifié par juliesunset (19 Feb 2015 - 14:55)
Hello du jour Smiley cligne

forcément ça fonctionne Smiley cligne

While et For sont très similaire.. while n'a pas de limite connue alors que for oui Smiley smile

Bon revenons à ton cas...

tes select se contente d'afficher des numéros de 1 à 6 ??? quel est l'intéret alors de passer par un select sql avant Smiley ohwell

si c'est bien ce que tu veux afficher de 1 à 6

il te suffit de faire ça

code original
while ($modif = mysql_fetch_assoc($requete)){
			
            $select = mysql_query('SELECT id,fr,ordre FROM spec_categories WHERE site != "xcel"') or die("49 - ".mysql_error());
            ?>
        <select name="ordre[<?=$i?>]" id="ordre">
            <?php
            while ($data = mysql_fetch_array($select)){
                ?>
            <option value="<?php echo $data['ordre'] ?>" <?php echo ($data['id'] == $modif['id']?'selected':''); ?>><?php echo $data['ordre'] ?></option>
            
                <?php
            }
            ?>
        </select>&nbsp;


NOUVEAU CODE


while ($modif = mysql_fetch_assoc($requete)){
            ?>
        <select name="ordre[<?=$i?>]" id="ordre">
            <?php
            for($o=1;$o <7;$o++){
           
                ?>
            <option value="<?php echo $o ?>" <?php echo ($data['id'] == $modif['id']?'selected':''); ?>><?php echo $o?></option>
            
                <?php
            }
            ?>
        </select>&nbsp;


j'utilise $o parce qu'on a déjà $i Smiley smile et parceque c'est pour Ordre donc o logique Smiley lol
pchlj a écrit :
tes select se contente d'afficher des numéros de 1 à 6 ??? quel est l'intéret alors de passer par un select sql avant Smiley ohwell

si c'est bien ce que tu veux afficher de 1 à 6

il te suffit de faire ça

while ($modif = mysql_fetch_assoc($requete)){
            ?&gt;
        &lt;select name="ordre[&lt;?=$i?&gt;]" id="ordre"&gt;
            &lt;?php
            for($o=1;$o &lt;7;$o++){
           
                ?&gt;
            &lt;option value="&lt;?php echo $o ?&gt;" &lt;?php echo ($data['id'] == $modif['id']?'selected':''); ?&gt;&gt;&lt;?php echo $o?&gt;&lt;/option&gt;
            
                &lt;?php
            }
            ?&gt;
        &lt;/select&gt;&amp;nbsp;


En travaillant dessus je me suis effectivement posé la question à savoir si cette boucle était bien utile finalement. J'avais enlevé cette boucle et commencé à mettre un for. J'étais pas bien loin de ta solution en fait...

Ta boucle for est trop simple... tu indique 7, mais ce chiffre pourrait très bien changé avec le temps. Je dois donc compter le nombre d'entré dans la bdd pour avoir le bon chiffre.

J'ai fait ça, mais je me retrouve avec des champs vide...
while ($modif = mysql_fetch_assoc($requete)){
        $l = count($modif['id']);
            ?>
        <select name="ordre[<?=$i?>]" id="ordre">
            <?php
            for($o=1;$o <$l;$o++){
                ?>
            <option value="<?php echo $o ?>" <?php echo ($o == $modif['ordre']?'selected':''); ?>><?php echo $o?></option>
                <?php
            }
            ?>
        </select>&nbsp;


J'avais utilisé $o aussi! Smiley cligne
Modifié par juliesunset (19 Feb 2015 - 15:44)
ok Smiley smile

en revanche je pense que ton $l ne correspond pas a ce que tu veux Smiley smile

tu le base sur $requètes masi $requètes te donne le nombre d'info qui auront un select avec l'ordre dedans...

ou alors je me paume..

c'est ça je pense que je me paume... Smiley smile

tu veux bien recoller le code ET la sortie HTML Smiley smile

là je sais plus où on en est Smiley lol
Pages :