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 :

Requête SQL update inopérante [MySQL]


Sujet :

PHP & Base de données

  1. #1
    Candidat au Club
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Novembre 2007
    Messages : 4
    Points : 2
    Points
    2
    Par défaut Requête SQL update inopérante
    Bonjour à tous,

    Voilà deux après-midi que je me casse la tête sur un script pourtant trivial. Je ne comprends pas où est mon erreur. Vous êtes mon derniers recours

    J'écris un petit script PHP pour poster des news. Ces dernières sont enregistrées dans une table 'news'. Un des champs de la table s'appelle 'statut' (tinyint(1)) qui peut prendre la valeur 0 ou 1, pour respectivement non publié et publié, soit un boléen.

    J'ai écrit un script tout simple qui met à jour cette valeur. Le voici :

    Script de mise à jour de la valeur du statut :
    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
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
     
    //Instanciation de l'objet
    		$news = new news;
     
    //Méthode news_content : récupère les données d'une ligne de la table pour un id de news donné.
    		$tableauNews = $news -> news_content($newsId);
     
    //Mise à jour de la table suivant la valeur du statut.
    		if ($tableauNews['statut']) { 
     
    			$requete = "UPDATE news
    				        SET statut = 0
    			    	    WHERE id = '$newsId'";
     
    	    	        mysql_query($requete);
     
    		}else{
     
    			$requete = "UPDATE news
    				        SET statut = 1
    			    	    WHERE id = '$newsId'";
     
    	    	        mysql_query($requete);
     
    		}
    La méthode news_content de la classe news :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    function news_content($idNews) {
     
    		global $tableMySQL;
     
    		$requete = "SELECT redacteur, titre, article, timestamp, statut 
    					FROM " . $tableMySQL . "news
    					WHERE id = '$idNews' ";
     
    		$ressource = mysql_query($requete);
    		return mysql_fetch_array($ressource);
     
    	}
    Et cela ne fonctionne pas. A vrai dire, si je fais une requête SELECT juste après le script de mise à jour, la valeur apparaît bien à jour. Sauf que, dans phpmyadmin ou même dans mon listage de news, rien n'a changé. Je ne comprends vraiment pas. Si quelqu'un aurait une piste ou aurait déjà rencontré un problème similaire, je suis prenant.

    Je tourne en rond. Quelque fois cela a un comportement assez bizarre. Par exemple si j'enlève le "else", le script fonctionne. Les données sont bien mises à jour. J'ai essayé de réécrire le script sans utiliser les classes (initialement, la mise à jour de la table se fait aussi par une méthode de classe), cela ne change rien.

    Merci d'avance.

  2. #2
    Modérateur
    Avatar de sabotage
    Homme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    29 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2005
    Messages : 29 208
    Points : 44 155
    Points
    44 155
    Par défaut
    Il faut que tu debug : Controle la valeur de ton tableau $tableauNews et affiche tes requetes.
    N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP

  3. #3
    Candidat au Club
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Novembre 2007
    Messages : 4
    Points : 2
    Points
    2
    Par défaut
    Déjà fait.

    Par exemple, voici le résultat d'un debug pour le script ci-dessus :

    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
    16
    17
    18
    19
    20
    21
    22
     
     
    //Valeur $tableauNews
    array(10) { [0]=> string(1) "1" ["redacteur"]=> string(1) "1" [1]=> string(6) "News 3" ["titre"]=> string(6) "News 3" [2]=> string(6) "News 3" ["article"]=> string(6) "News 3" [3]=> string(19) "2008-10-04 16:32:58" ["timestamp"]=> string(19) "2008-10-04 16:32:58" [4]=> string(1) "1" ["statut"]=> string(1) "1" } 
     
     
    //Valeur $tableauNews['statut'] avant la requête update (newsId = 3, statut = 1)
    Valeur du statut pour la news 3 : 1
     
    //Requête
    string(65) "UPDATE news SET statut = 0 WHERE id = '3'" 
     
    //Valeur $tableauNews['statut'] après la requête update (newsId = 3, statut = 0)
    Valeur du statut pour la news 3 : 0
     
    //Requête SELECT sur la table (id de la news - statut).
    1 - 1
    2 - 0
    3 - 0 //La ligne qui vient d'être modifiée.
     
    //Message de confirmation
    La news a été mise hors ligne.
    Bref, tout semble fonctionner, sauf que...

    Le plus bizarre est que le script me renvoie la valeur mise à jour, mais que rien ne change dans phpmyadmin ou pour le quidam du monde réel. Existe-t-il un moyen de voir les "logs" du serveur MySQL ou de les faire apparaître via PHP ?

    La requête fonctionne en la copiant dans phpmyadmin.

    Autre chose étrange. Si je ne teste qu'une des conditions dans le script, cela fonctionne. La valeur est mise à jour. Dès lors que je mets les deux conditions pour les deux cas, cela ne fonctionne plus.

  4. #4
    Modérateur
    Avatar de sabotage
    Homme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    29 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2005
    Messages : 29 208
    Points : 44 155
    Points
    44 155
    Par défaut
    Tu es sur de travailler sur la bonne base / bon serveur ?

    Dès lors que je mets les deux conditions pour les deux cas, cela ne fonctionne plus.
    Et que donne ton debug dans ce cas la ?
    N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP

  5. #5
    Candidat au Club
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Novembre 2007
    Messages : 4
    Points : 2
    Points
    2
    Par défaut
    Le débug ci-dessus correspond à cette situation. Si je schématise mon code :


    idNews = 20 //au hasard
    statut = tableau['statut'] = 0 //La news n'est actuellement pas publié.

    Si le statut correspond à 0
    => Mettre à jour le statut dans la table news à 1 pour l'id 20.
    => La news a été publié.
    Sinon
    => Mettre à jour le statut dans la table news à 0 pour l'id 20.
    => La news a été mise hors-ligne.

    Requête SELECT
    => Le statut de la news 20 correspond à 1.
    Cela correspond au Code de mon premier post. Lors de mon debug, je fais une requête SELECT sur la table que le script vient de modifier et il me retourne la valeur effectivement modifiée.

    Sauf que ce code ne fonctionne pas. Si je vais vérifier la table dans phpmyadmin, la valeur n'a pas été modifiée. (Littéralement, j'ai une fenêtre sur mon script, l'autre sur phpmyadmin. J'exécute mon code, le debug me répond que tout est bon, mais la valeur reste inchangée dans phpmyadmin.). Le débug me dit oui alors que phpmyadmin me dit non.

    Même problème si la valeur du statut correspond à 1.


    Par contre il me suffit de modifier le code de cette manière :


    idNews = 20 //au hasard
    statut = tableau['statut'] = 0 //La news n'est actuellement pas publié.

    Si le statut correspond à 0
    => Mettre à jour le statut dans la table news à 1 pour l'id 20.
    => La news a été publié.

    //Suppression de la deuxième condition.

    Requête SELECT
    => Le statut de la news 20 correspond à 1.
    J'enlève la deuxième condition, le débug me répond de la même manière qu'avant. Sauf que la modification s'est effectivement faite. Elle est visible dans phpmyadmin. Pour modifier ma valeur de 1 à 0, il me suffit de modifier la condition. Mais dès que je mets les deux conditions dans le même script en même temps, cela ne fonctionne pas. Que ça soit par deux if, un if/else ou même un switch.

    C'est comme si les opérations suivantes étaient impossibles :


    SELECT statut depuis news
    => statut == 0 ou 1

    si statut == 0
    => UPDATE sur news, statut à 1
    sinon
    => UPDATE sur news, statut à 0

    SELECT statut depuis news
    => statut == 0 ou 1

    si statut == 0
    => UPDATE sur news, statut à 1
    si statut == 1
    => UPDATE sur news, statut à 0

    SELECT statut depuis news
    => statut == 0 ou 1

    switch statut
    case 0 => UPDATE sur news, statut à 1
    case 1=> UPDATE sur news, statut à 0
    Alors que les codes suivants fonctionnent :


    SELECT statut depuis news
    => statut == 0 ou 1

    si statut == 0
    => UPDATE sur news, statut à 1

    SELECT statut depuis news
    => statut == 0 ou 1

    si statut == 1
    => UPDATE sur news, statut à 0

  6. #6
    Modérateur
    Avatar de sabotage
    Homme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    29 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2005
    Messages : 29 208
    Points : 44 155
    Points
    44 155
    Par défaut
    J'ai repris ton code et il fonctionne comme attendu chez moi.

    Est-ce que tu pourrais nous mettre un dump de ta base et la partie minimal de ton code ?

    Tu ne m'as pas repondu sur l'eventualité du fait que ton phpmyadmin et le code sur lequel tu travailles ne se connectent pas a la meme base.
    N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP

  7. #7
    Candidat au Club
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Novembre 2007
    Messages : 4
    Points : 2
    Points
    2
    Par défaut
    Après 3 après-midi à plancher sur le problème, j'ai finalement décidé de faire autrement. C'est moins beau, c'est moins propre, mais ça fonctionne...

    A la place d'une page et d'un if/else suivant que le statut est égal à 1 ou à 0, j'utilise une page dédié pour un statut égal à 1 et une page pour un statut égal à 0.

    Sabotage,

    J'ai rapidement mis en place une page avec la partie minimale du code et il fonctionne. Le même code, les mêmes classes, les mêmes paramètres de connexion MySQL, un simple copier-coller dans un fichier unique. Et le code fonctionne.

    Pour les connexions, le problème ne devrait pas venir de là. J'utilise les mêmes paramètres de connexions pour d'autres scripts. Ils fonctionnent parfaitement.

    Je donne encore une copie de la table + le code minimal (qui fonctionne). Si qqun verrait qqch de flagrant. Sinon... ben voilà.

    Encore un grand merci à ceux qui se seraient creusé la tête

    Dump Table News :
    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
    16
    17
    18
    19
    20
    21
    22
    23
     
    -- 
    -- Structure de la table `news`
    -- 
     
    CREATE TABLE `news` (
      `id` int(6) NOT NULL auto_increment,
      `redacteur` int(6) NOT NULL default '0',
      `titre` varchar(255) NOT NULL,
      `article` text NOT NULL,
      `timestamp` timestamp NOT NULL default CURRENT_TIMESTAMP,
      `statut` smallint(1) NOT NULL default '0',
      PRIMARY KEY  (`id`)
    ) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=4 ;
     
    -- 
    -- Contenu de la table `news`
    -- 
     
    INSERT INTO `news` (`id`, `redacteur`, `titre`, `article`, `timestamp`, `statut`) VALUES 
    (1, 1, 'News 1', 'News 1', '2008-10-04 16:32:34', 1),
    (2, 1, 'News 2', 'News 2', '2008-10-04 16:32:42', 1),
    (3, 1, 'News 3', 'News 3', '2008-10-04 16:32:58', 1);
    Le script.
    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
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
     
    <?php
     
    //==========================================================================
     
    //Connexion à MySQL
     
    $serveur = 'localhost'; 
    $utilisateur = 'username';
    $password = 'password';
    $bdd = 'database';
     
     
    @ $connexion = mysql_connect($serveur, $utilisateur, $password);
    @ $connexion2 = mysql_select_db($bdd);
     
    if ( !$connexion ) {
     
       print('Erreur connexion serveur');	
     
    }
     
    if ( !$connexion2 ) {
     
       print('Erreur connexion base de données');	
     
    }
     
    $tableMySQL = "" //Préfixe des tables.
     
    //==========================================================================
     
    //Classes
     
    class news {
     
     
    	//Fonction qui permet de retourner toutes les informations d'une news pour son id donné sous sous la forme d'un tableau
    	function news_content($idNews) {
     
    		global $tableMySQL;
     
    		$requete = "SELECT redacteur, titre, article, timestamp, statut 
    					FROM news
    					WHERE id = '$idNews' ";
     
    		$ressource = mysql_query($requete);
     
    		return mysql_fetch_array($ressource);
     
    	}
     
    }
     
     
    //==========================================================================
     
     
    //Début du code :
     
     
    	//On récupère la valeur. Si rien n'est spécifié, on attribue la valeur 0.
    	$newsId = $_GET['a'];
     
    	if ( !$newsId ) {
     
    		$newsId = 0;	
     
    	} 
     
    	//On vérifie que la variable $newsId soit bien un nombre.
    	if ( !ereg("[0-9]{1,}", $newsId) ) { 
     
     
    		print "Invalide";
     
     
    	//Sinon on continue la suite des opérations.
    	}else{
     
    		//Avec l'id de la news, on va maintenant récupérer le statut de la news et mettre à jour cette valeur
     
    		//Instanciation de l'objet
    		$news = new news;
     
    		//On récupère les données pour $newsId
    		$tableauNews = $news -> news_content($newsId);
     
     
    		//Si $tableauNews['statut'] est égal à 1, la news est mise hors-ligne.
    		if ($tableauNews['statut']) { 
     
    			$requete = "UPDATE news
    				        SET statut = 0
    			    	    WHERE id = '$newsId'";
     
    			mysql_query($requete);
     
    	    	$message = "La news a été mise hors ligne";
     
     
    	    //Sinon $tableauNews['statut'] est égal à 0, la news est mise en ligne.	
    		}else{
     
    			$requete = "UPDATE news
    				        SET statut = 1
    			    	    WHERE id = '$newsId'";
     
    	    	mysql_query($requete);
     
    	    	$message = "La news a été mise en ligne"; 	
     
    		}		
     
    		//HTML
     
    		?>
     
    		<table>
    			<tr>
    				<th>ID news</th>
    				<th>Statut</th>
    			</tr>
     
    			<?php
     
    //Listage des News avec le lien de mise à jour publié/non publié
    			$requete = "SELECT id, statut
    			            FROM news";
     
    			$ressource = mysql_query($requete);
     
    			while ( $ligne = mysql_fetch_array($ressource) ) {
     
    					$bddNewsId  = $ligne['id'];
    					$bddStatut  = $ligne['statut'];
     
    					switch ($bddStatut) {
     
    					case 0:
    					$bddStatut = 'Hors-Ligne';
    					break;
     
    					case 1:
    					$bddStatut = 'En ligne';
    					break;
     
    					default:
    					$bddStatut = 'Défaut';	
     
    					}
     
    				?>
    				<tr>
    					<td><?=$bddNewsId ?></td>
    					<td><a href="news-post.php?a=<?=$bddNewsId ?>"><?=$bddStatut ?></a></td>
    				</tr>
    				<?php
     
    			}	
     
     
    			?>
     
    			</table>
     
    			<p>Résultat : <?=$message ?></p>
     
     
    			<?php
     
    	}
     
     
    ?>

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

Discussions similaires

  1. Requête SQL UPDATE dans VBA
    Par Pingouin22 dans le forum Requêtes et SQL.
    Réponses: 6
    Dernier message: 23/09/2022, 10h37
  2. Requête SQL 'UPDATE' en Java
    Par Grulf dans le forum JDBC
    Réponses: 5
    Dernier message: 11/06/2008, 09h32
  3. Aide requête SQL - UPDATE phpmyadmin
    Par laulau37 dans le forum Langage SQL
    Réponses: 2
    Dernier message: 20/06/2007, 10h19
  4. Aide Requête SQL (UPDATE)
    Par Glowprod dans le forum MS SQL Server
    Réponses: 4
    Dernier message: 26/07/2006, 14h04
  5. Access - Requête SQL - UPDATE
    Par tchoo83 dans le forum Requêtes et SQL.
    Réponses: 7
    Dernier message: 19/12/2005, 15h48

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