IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

PHP & Base de données Discussion :

Erreur lors d'une récupération de données avec critère de sélection [MySQL]


Sujet :

PHP & Base de données

  1. #1
    Membre régulier Avatar de Squalthor
    Homme Profil pro
    Autodidacte
    Inscrit en
    Juillet 2006
    Messages
    176
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ariège (Midi Pyrénées)

    Informations professionnelles :
    Activité : Autodidacte

    Informations forums :
    Inscription : Juillet 2006
    Messages : 176
    Points : 103
    Points
    103
    Par défaut Erreur lors d'une récupération de données avec critère de sélection
    Bonjour,

    Voilà je viens poster car je me retrouve à court d'idées pour résoudre mon problème...

    J'espère me trouver dans la bonne section du forum.

    Je travail actuellement sur un forum et plus précisément sur la partie admin pour gèrer les sections du forum.

    La partie sur laquelle je travaille en ce moment est l'ajout des sections du forum, cette partie comporteras un bouton "supprimer" ainsi que des boutons "monter" et "descendre".
    Hors les choses se présentes assez mal car je rencontre un problème avec le bouton supprimer, mais afin que vous compreniez bien ce que je veux faire il me semble indispensable de détailler.

    Je gère la position des section via les Id, Mysql se charge de les ressortir dans l'ordre, pour le positionnement je me servirais du même schéma en modifiant les id concernées.

    Pour celà il m'est indispensable d'avoir des Id qui se suivent, hors quand j'efface une section je me retrouve avec un vide donc je suis en train de travailler sur cette fonction pour réorganiser les sections, cette fonction utilise Xajax mais ça c'est juste pour info.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
     
    function Effacer_section($id)
    	{
    	$Reponse = new xajaxResponse();
    	query('DELETE FROM Sections_forum WHERE Id=\''.$id.'\'');
    	$sql = query('SELECT Id FROM Sections_forum WHERE Id > \''.$id.'\' ORDER BY Id') or die(mysql_error());
    	while($donnees = mysql_fetch_array($sql, MYSQL_ASSOC))
    		{
    		$n_id = $donnees['Id']-1;
    		query('UPDATE Sections_forum SET Id=\''.$n_id.'\'') or die(mysql_error());
    		}
    	mysql_free_result($sql);
    	$Reponse->addScript('xajax_Afficher_sections_forum();');
    	return $Reponse->getXML();
    	}
    J'ai déjà écris cette fonction de plusieurs façons et je rencontre toujours le même problème:

    J'ai l'impression que le critère de sélection ">" n'est pas pris en compte car la fonction modifie aussi bien l'Id 1 que la 3, alors qu'elle ne devrait modifier que la 3.

    Bon je pense que mon niveau doit se voir via mon sujet mais je précise quand même que je suis débutant.

    Enfin, quoi qu'il en soit je vous remercie.

  2. #2
    Membre émérite Avatar de Djakisback
    Profil pro
    Inscrit en
    Février 2005
    Messages
    2 022
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 2 022
    Points : 2 273
    Points
    2 273
    Par défaut
    Salut,
    le problème vient peut-être du fait que ton id est un int et que tu le compares avec un string :
    WHERE Id > \''.$id.'\'
    au final tu as :
    WHERE Id > '2'

    Essaie d'afficher le résultat du select pour être sûr.
    D'autre part tu n'as pas besoin de toutes ces requêtes, une seul suffit :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $sql = "UPDATE table SET Id = Id - 1 WHERE Id > ".$id;
    [Edit] Je crois d'ailleurs qu'il y a une commande Sql qui permet de réorganiser les Id mais je ne sais plus laquelle.[/]
    En fait je me trompe, ca permet de réordonner la table mais ca ne décale pas les ID : ALTER TABLE `items` ORDER BY `id` (en autre, de recalculer l'auto-increment)

    Bye
    Vive les roues en pierre

  3. #3
    Membre expert
    Avatar de trotters213
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    2 571
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Gard (Languedoc Roussillon)

    Informations forums :
    Inscription : Janvier 2005
    Messages : 2 571
    Points : 3 145
    Points
    3 145
    Par défaut

    Essaie comme ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    "... WHERE Id > CAST('".$id."' AS UNSIGNED)"
    Juste une question, pourquoi tu ne pars pas de la fin ? tu prend le dernier enregistrement et déplace à la la place du premier trou : ça serait plus simple non (et surtout plus rapide) ?

    PS : utilise les doubles-quotes plutôt que les simples pour tes requêtes, c'est beaucoup plus lisible (mais plus lent je sais mais bon tu ne fais 10000 requêtes si )

  4. #4
    Membre régulier Avatar de Squalthor
    Homme Profil pro
    Autodidacte
    Inscrit en
    Juillet 2006
    Messages
    176
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ariège (Midi Pyrénées)

    Informations professionnelles :
    Activité : Autodidacte

    Informations forums :
    Inscription : Juillet 2006
    Messages : 176
    Points : 103
    Points
    103
    Par défaut
    Bonjour Et grand merci pour votre aide !

    Voilà, j'ai utilisé vos conseils pour réecrire la fonction, ce qui donne ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    function Effacer_section($id)
    	{
    	$Reponse = new xajaxResponse();
    	query('DELETE FROM Sections_forum WHERE Id=\''.$id.'\'');
    	$sql = 'UPDATE Sections_forum SET Id = Id-1 WHERE Id > CAST(\''.$id.'\' AS UNSIGNED';
    	$Reponse->addScript('xajax_Afficher_sections_forum();');
    	return $Reponse->getXML();
    	}
    Mais malheureusement ça ne marche toujours pas. L'entrée à effacer est correctement effacée mais hélas les id devant être décrémentées ne le sont pas.

    Comme tu peux le voir, Trotters213, j'adore optimiser, de plus je me suis habitué à ne pas utiliser les doubles quotes donc ça ne me gêne nullement.

    Ta solution (d'utiliser simplement la dernière entrée) pourrait être plus pratique c'est vrai mais comme je me sert des Id pour classer les sections elle n'est pas applicable dans ce cas.

    Je vous remercie, encore une fois je sais , pour votre aide.

  5. #5
    Membre expert
    Avatar de trotters213
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    2 571
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Gard (Languedoc Roussillon)

    Informations forums :
    Inscription : Janvier 2005
    Messages : 2 571
    Points : 3 145
    Points
    3 145
    Par défaut
    Tu as essayé de faire comme a dit Djakisback
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    query('UPDATE Sections_forum SET Id='.$id)
    ?

  6. #6
    Membre régulier Avatar de Squalthor
    Homme Profil pro
    Autodidacte
    Inscrit en
    Juillet 2006
    Messages
    176
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ariège (Midi Pyrénées)

    Informations professionnelles :
    Activité : Autodidacte

    Informations forums :
    Inscription : Juillet 2006
    Messages : 176
    Points : 103
    Points
    103
    Par défaut
    Merci beaucoup !

    Maintenant ça marche, le seul dommage c'est que je n'ai pas vraiment compris pourquoi ça ne marchais pas.

    Voici la fonction, ça pourrais servir à quelqu'un d'autre que moi:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    function Effacer_section($id)
    	{
    	$Reponse = new xajaxResponse();
    	query('DELETE FROM Sections_forum WHERE Id=\''.$id.'\'');
    	query('UPDATE Sections_forum SET Id= Id - 1 WHERE Id > '.$id);
    	$Reponse->addScript('xajax_Afficher_sections_forum();');
    	return $Reponse->getXML();
    	}
    Encore une fois, quand je butais, vous avez pût m'aider.

    Merci encore et bon courage à vous et à la prochaine.

    (dommage que ce ne soit que quand j'ai des problèmes)

  7. #7
    Membre expert
    Avatar de trotters213
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    2 571
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Gard (Languedoc Roussillon)

    Informations forums :
    Inscription : Janvier 2005
    Messages : 2 571
    Points : 3 145
    Points
    3 145
    Par défaut
    ça ne marchait car tu mettait ton $id entre simples quotes : tu faisait ceci
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    query('UPDATE Sections_forum SET Id=\''.$n_id.'\'')
    donc la requête était (pour un $id=2)
    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    UPDATE Sections_forum SET Id='2'
    donc SQL prenait le 2 comme une chaine de caractères et non comme comme un entier.
    En supprimant les simples quotes, tu as
    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    UPDATE Sections_forum SET Id=2
    donc 2 est interprété comme un entier et plus une chaine comme la comparaison se fait correctement.

    See you soon.

  8. #8
    Membre régulier Avatar de Squalthor
    Homme Profil pro
    Autodidacte
    Inscrit en
    Juillet 2006
    Messages
    176
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ariège (Midi Pyrénées)

    Informations professionnelles :
    Activité : Autodidacte

    Informations forums :
    Inscription : Juillet 2006
    Messages : 176
    Points : 103
    Points
    103
    Par défaut
    Ah, oui désolé je ne savais pas ça.

    Merci, cette fois c'est compris et bien compris, je ne suis pas prêt d'oublier ça

    Au plaisir et à la prochaine pour de nouvelles mésaventures...

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [XL-2010] Addition d'une plage de données avec critère
    Par adrian95 dans le forum Excel
    Réponses: 4
    Dernier message: 23/04/2013, 18h42
  2. Réponses: 0
    Dernier message: 17/02/2012, 18h51
  3. [Dojo] Erreur lors de la récupération des données JSON
    Par benoxy dans le forum Bibliothèques & Frameworks
    Réponses: 2
    Dernier message: 21/05/2010, 18h12
  4. Réponses: 7
    Dernier message: 15/11/2006, 10h14
  5. Réponses: 1
    Dernier message: 04/06/2006, 16h08

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo