Voici mon problème : je dispose d'un table d'éléments qui peuvent être publiés ou dépubliés
Ces éléments ont un ID appelé "Listing" qui va de 1 à 15. La variable pour publier/dépublié est un booléen appelé "Approval"
Lorsqu'ils sont dépubliés, leur "Listing" est chiffré de 21 à 35. Il me suffit d'ajouter 20 à la donnée "Listing" pour faire changer mes éléments de ligne dans ma table.
Je souhaite modifier toutes les lignes de ma table pour faire passer les publiés en dépubliés.
J'ai donc écrit une requête SQL qui fonctionne très bien si je l'écris directement dans mon logiciel (HeidiSQL) :
UPDATE MaTable SET Listing=Listing+20 WHERE (!Approval AND Listing<20);
Seulement lorsque je tente un programme simple en PHP pour l'éxécuter pas moyen, j'ai beau effectuer une requête préparée, rien ne se passe, aucune ligne n'est affectée. Je dois passer à côté de quelque chose mais même en relisant les cours correspondant de fond en comble je n'arrive pas à comprendre mon erreur. Voici le code en PHP que j'utilise :
$nb_depub=$bdd->exec('UPDATE MaTable SET Listing=(Listing+20) WHERE (!Approval and Listing<20)');
echo $nb_depub." éléments ont été dépubliés.";
Merci si vous avez une idée de ce que j'ai fait de travers, et pardon pour le dérangement
Je ne comprends pas trop à quoi sert ton !approval
Pour info, le point d'exclamation est l'opérateur logique NOT ... Mais pour MySQL un booléen est en fait un TINYINT, donc potentiellement on peut stocker de -128 à 127, donc WHERE !approval revient à écrire WHERE approval = 0, et WHERE approval revient à écrire WHERE approval <> 0.
Je ne comprends pas trop à quoi sert ton !approval
Tu veux dire quoi par là que sa doit se faire quand il est différent de dépublié ? Si c'est un booléen imaginons 0pour publié 1pour dépublié
Pourquoi ne pas plutôt mettre
WHERE Approval <> 1
Après je ne te dis pas que c'est la solution, j'ai du mal à comprendre le tout un peu plus d'explication serrait bénéfique pour mieux t'aider
Pour le coup, Quand un élément est publié, Approval vaut 1 et toute la ligne du tableau (avec toutes ses données) à le numéro de listing inférieur à 20 (compris entre 1 et 15 pour rappel). Si un élément devient dépublié, Approval passe à 0 mais c'est tout, je souhaite rajouter un correctif qui ajoute 20 a Listing si Listing est <20 et que Approval vaut 0, pour eviter de répéter a l'infini ce dernier changement
Ainsi l'élément dépublié passe par exemple de 10 à 30, ce qui correspond au même élément mais dépublié.
Pour répondre à Benzouye, il me semble avoir suivi le cours à la lettre et déjà activer les erreurs et justement, il n'en affiche aucune !
J'ai rajouter la commande pour me signifier combien de lignes SQL sont touchées pour justement me rendre compte qu'aucune n'était affectée. Je retourne vérifier si je n'ai rien oublié cependant, on ne sait jamais...
On peut voir le reste de ton code ? Parce que si ta requête fonctionne a priori (et je ne vois pas non plus d'erreur), le pb vient peut-être de la connexion ou du code php.
<?php session_start();?>
<!DOCTYPE html>
<html>
<head>
<link rel="stylesheet" href="style.css" />
</head>
<body>
<?php include ("mon_entete.php"); ?>
<?php
//connection à la base de données
try {
$bdd = new PDO('mysql:host=monhote;dbname=mabase;charset=utf8','basename','motdepasse',
array(PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION));
} catch (Exception $e) {
die('Erreur : ' . $e->getMessage());
}
$nb_pub=$bdd->exec('UPDATE MaTable SET Listing=(Listing+20) WHERE (!Approval and Listing<20)');
$nb_depub=$bdd->exec('UPDATE MaTable SET Listing=(Listing-20) WHERE (Approval and Listing>20)');
echo "<br />Mise à jour effectuée avec succès !<br /><br />";
echo $nb_depub." éléments ont été dépubliés,<br />".$nb_pub." éléments ont été republiés.";
?>
</body>
</html>
- Edité par FrancoisGuillaume 17 novembre 2017 à 17:16:46
Voila, on est d'accord, je ne vois pas d'où peut venir le problème; par contre tu évoques un souci de connexion ca reste possible surtout que l'hébergeur a eu des soucis de maintenance dans la journée, je vais attendre avant de retester...
- Edité par FrancoisGuillaume 17 novembre 2017 à 17:39:58
- Tu ne l'as pas précisé, mais d'après ce que je comprends de ta table, les ID de 1 à 20 doivent être en Approval = TRUE (1) et sinon ceux de 21 à 35 doivent être en Approval = FALSE (0) Si je me trompe, toutes mes remarques ci-dessous seront probablement fausses
- Ton système est mauvais, car tu "encodes" 2 fois la même information dans ta table. Si tu as un booléen Approval à TRUE (1) ou FALSE (0), tu n'as absolument pas besoin de modifier les identifiants. Ou réciproquement, si tu sais que tes ID sont > 20 alors tu peux déduire la valeur ton booléen Approval. Donc c'est de l'information redondante qui complique ton code et risque de provoquer des incohérences de données un jour. Imagine si pour une raison X ou Y que tu as un ID 8 (par exemple) avec un Approval = 0. C'est incohérent pour ton application et provoquera des affichages d'informations erronées.
- Ta requête est la suivante :
UPDATE MaTable SET Listing=(Listing+20) WHERE (!Approval and Listing<20)
Ta requête est fausse, dans ton WHERE, tu cherches les Listing < 20 et qui ont Approval à FALSE (0). C'est pas bon, tu dois chercher ceux qui sont à TRUE (1) du coup :
UPDATE MaTable SET Listing=(Listing+20) WHERE (Approval and Listing<20)
- De plus, tu ne fais que ajouter 20 au Listing, mais tu laisses Approval à 1, donc voilà, ce que je disais auparavant est vrai, ta base est devenu incohérente. Il faudrait que tu modifies Approval à FALSE (0) en même temps :
UPDATE MaTable SET Listing=(Listing+20), Approval=false WHERE (Approval and Listing<20)
Ta remarque n'est pas fausse mais c'est que tu n'as pas tous les éléments. Ce code est un correctif pour rattraper des erreurs d'encodage où, justement, un ID<20 se retrouve en Approval=0 alors qu'il devrait être à 1, et inversement un ID >20 qui aurait un Approval=True.
Sinon tu as effectivement parfaitement compris la table, j'ai rajouté moi-même en fait les lignes >20 pour gérer ces !Approval et les déplacer pour mieux les regrouper. La requête fonctionne en direct sur la base SQL mais pas quand je l'appelle dans mon programme PHP et c'est là que je ne comprends pas parce que je ne pense pas avoir fait d'erreur....
tu évoques un souci de connexion ca reste possible
Si tu avais un souci de connexion, tu aurais une erreur d'exécution à la ligne 15 et tu irais donc dans le catch ...
Par contre si tu fais :
SELECT *
FROM MaTable
WHERE (!Approval and Listing<20)
As-tu un retour ? Il n'y a tout simplement pas d'enregistrement à mettre à jour ...
Là, au jour d'aujourd'hui, j'en ai 3... Edit : Pour être plus clair, ce n'est (malheureusement) pas moi qui ai codé le site qui gère ces données. Quand un élément n'a plus besoin d'être visible on a choisi de le "dépublier" plutôt que de le supprimer, puisqu'il arrive parfois qu'on ai besoin de le re-publier.
Mais celui qui a codé le bouton "publier/dépublier" n'a pas pensé à déplacer la donnée dans la base, ce qui fait qu'un hyperlien qui pointerait vers une de ces données avant la dépublication pointe toujours dessus après, d'où mon intervention avec ce correctif (tant que je n'arrive pas à joindre le responsable), puisque je n'ai pas accès à cette partie du code (c'est compliqué, je sais).
A l'heure où j'écris, une 4è donnée vient d'être dépubliée mais toujours pas de réussite avec mon programme, toujours 0 lignes modifiées mais pas d'erreur signalée
- Edité par FrancoisGuillaume 18 novembre 2017 à 18:56:11
Bien le bonjour, je viens de corriger mon erreur qui, comme c'est souvent le cas, était toute simple : je ne me connectai pas à la bonne BDD
Celle ci a migré récemment vers un autre serveur et je n'avais tout simplement pas modifié l'adresse de l'hôte dans mon programme.
Problème résolu donc, tout fonctionne correctement !
Merci pour votre patience et encore désolé ;P
[SQL 5.5] Modifier une ligne de ma BDD en PHP
× Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
× Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
N'oubliez pas d'activer les erreurs PDO.
N'oubliez pas d'activer les erreurs PDO.