Aide contrusction algorithme php/mysql svp

Fermé
Signaler
-
 goldstreet -
Bonjour à tous, je suis en train de développer un panneau d'administration. Dans ce panneau d'administration, il y a la possibilité d'ajouter des marques de produits. Une fois ajoutées, si vous cliquez sur "Modifier la marque", il y a la possibilité de modifier leur ordre d'apparition.

Exemple : dans ma table `t_marques` j'ai un marque_position, qui repertorie en fonction de l'id la position choisie pour l'affichage sur le site. Ex : la marque avec l'id 3 apparaît en première position, la 2 en 1, la 1 en 3 etc ...

Seul problème, je n'ai jamais fait d'études dans ce domaine, et j'avoue nager total dans la construction de l'algo qui me permettrait lorsque je modifie l'ordre d'affichage d'une marque (exemple : la marque avec l'id 3 est en position 3, je la passe en 1, ce qui veut dire que la 1 passe en 2, que la 2 passe en 3 et que les autres sont inchangées).

J'ai fait pas mal de tests que vous trouverez ci-dessous, mais aucun ne colle, j'ai toujours un problème, style un doublon sur la position (par exemple 2 marques qui ont la position 2) etc ...

Si vous pouviez m'aider à construire cet algo, je vous serais vraiment reconnaissant. Source du code :

// si on récupère la modification d'une marque

if(isset($_POST["marques_mod"]))
{
// on vérifie que les variables ont été déclarées
if($_POST["marque_id"] && $_POST["marque_nom"] && $_POST["marque_titre"] && $_POST["marque_langue"] && $_POST["marque_phare"] && $_POST["marque_photo"] && $_POST["marque_auteur"] && $_POST["marque_position"] && $_POST["content"])
{
// on déclare les variables
$mod_id = $_POST["marque_id"];
$mod_nom = mysql_real_escape_string(htmlentities(strip_tags($_POST["marque_nom"])));
$mod_titre = mysql_real_escape_string(htmlentities(strip_tags($_POST["marque_titre"])));
$mod_langue = mysql_real_escape_string(htmlentities(strip_tags($_POST["marque_langue"])));
$mod_phare = mysql_real_escape_string(htmlentities(strip_tags($_POST["marque_phare"])));
$mod_photo = mysql_real_escape_string(htmlentities(strip_tags($_POST["marque_photo"])));
$mod_auteur = mysql_real_escape_string(htmlentities(strip_tags($_POST["marque_auteur"])));
$mod_position = mysql_real_escape_string(htmlentities(strip_tags($_POST["marque_position"])));
$mod_contenu = mysql_real_escape_string($_POST["content"]);
$mod_user = $_SESSION["nom"];
// on se connecte à la bdd pour vérifier la position de la marque avant l'ajout dans la bdd
$result = mysql_query(" SELECT marque_position FROM `t_marques`WHERE marque_id = '".$mod_id."' ");
// on extrait
$row = mysql_fetch_array($result);
// si c'est <
if($row["marque_position"] > $mod_position)
// alors on modifie les données
{
if(($row["marque_position"]) - ($mod_position) == "1")
{
$sql = " UPDATE `t_marques` SET `marque_position` = marque_position+1 WHERE marque_position = '".$mod_position."' ";
$result = mysql_query($sql);
}
else
{
$sql = " UPDATE `t_marques` SET `marque_position` = marque_position+1 WHERE marque_position < '".$row["marque_position"]."' ";
$result = mysql_query($sql);
}
}
// si c'est >
else if($row["marque_position"] < $mod_position)
// alors on modifie les données
{
if(($mod_position) - ($row["marque_position"]) == "1")
{
$sql = " UPDATE `t_marques` SET `marque_position` = marque_position-1 WHERE marque_position = '".$mod_position."' ";
$result = mysql_query($sql);
}
else
{
$sql = " UPDATE `t_marques` SET `marque_position` = marque_position-1 WHERE marque_position <= '".$mod_position."' ";
$result = mysql_query($sql);
}
}
// on insère les données dans la table
$result = mysql_query("UPDATE `t_marques` SET `marque_nom` = '".$mod_nom."', `marque_titre` = '".$mod_titre."', `marque_langue` = '".$mod_langue."', `marque_phare` = '".$mod_phare."', `marque_photo` = '".$mod_photo."', `marque_auteur` = '".$mod_auteur."', `marque_position` = '".$mod_position."', `marque_contenu` = '".$mod_contenu."', `marque_user` = '".$mod_user."' WHERE `marque_id` = '".$mod_id."';");
// on renvoi vers la page d'accueil avec le message de confirmation
header("Location:index.php?message=mod_ok");
}
else header("Location:index.php?message=erreur");
}

Encore une fois merci à ceux qui trouveront le temps et la patience de me répondre.

Thomas

2 réponses

Je pense avoir trouvé comment faire, tout simplement en remplaçant la nouvelle variable dans la base de données, et en mettant l'ancienne variable là ou se trouve la valeur de la nouvelle.

Ainsi si la nouvelle variable est 1, et qu'elle était égale à 3, je me connecte à la bdd pour changer la 3 en 1, et je remplace la 1 par 3, ainsi je ne fais que remplacer et je m'embête pas à décaler toutes mes variables.

Si vous avez d'autres solutions je suis preneur.

Merci.

Thomas
Bonjour,
je pense que la technique appropriée serait :

Tu as un champ classement (sui contien des id unique)
quand tu ajoute un produit, tu regarde Max(classement) LIMIT 1 dans la bdd.
et tu insert en ajoutant 1 a max (pas de double auto_incremente, dommage).

ensuite si tu veux passer de la position 3 à 1, alors :

tu fais un update en premier pour resultats < 3 ( UPDATE truc SET classement = classement - 1 WHERE classement < 3)
tu fais un update de ton produit (UPDATE truc SET classement = 1 WHERE id_produit = identifiant_en_cours LIMIT 1)

idem pour le deplacement croissant.

A VERIFIER LES LIMIT DU DOCUMENT c'est a dire ( si tu est inférieur a 1 ou superieur ou egal au nombre d'entree dans la table (mysql_num_rows))


Peaaaaaaaaaaaaace