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 :

Nombre de lignes affectées par UPDATE vide


Sujet :

PHP & Base de données

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    204
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2005
    Messages : 204
    Points : 79
    Points
    79
    Par défaut Nombre de lignes affectées par UPDATE vide
    Bonjour,
    Je n'arrive pas à trouver d'où viendrai cette erreur :
    En effet, j'ai une page ou je sélectionne des informations en provenance d'une base(BDD1) et je fais une mise à jour dans cette base. Si tout se passe bien, on est redirigé vers une autre page avec ces mêmes informations (par des variables de sessions) pour la mise à jour d'une autre base(BDD2)
    première page :
    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
     
     
    $host="host";
    $user="user";
    $pass="pass";
     
    $bdd="BDD1";
                   $link=@mysql_connect($host,$user,$pass);
                   if(!$link){
                        header("location:../message/message_err.php?ERR=SRV");
    	            exit();
                     }else{
                            $link0=@mysql_select_db("$bdd");
                            if(!$link0){
                              header("location:../message/message_err.php?ERR=BSE");
    		          exit();
                            }
                     }
     
     
    $Table="agent";
     
    		$SQL_SELECT="Select Id_user_reservation, User_agent, Passe_agent from $Table where Num_agent=$lenumagent";
    		$lresult=mysql_query($SQL_SELECT) or die (mysql_error());
     
                    if($leresult=mysql_fetch_array($lresult)){
     
    			$leuseragent = $leresult['User_agent'];
    			$lepasseagent = $leresult['Passe_agent'];	
    			$lidagentreservation = $leresult['Id_user_reservation'];
    		}
     
                //--variable session
     
                $_SESSION['LIDRESERVATION']=$lidagentreservation;
                -------
                --------
     
     
                //--mise à jour BDD1
                 if(!empty($_POST['valid']))
    	     $lavalid=$_POST['valid'];
    	//$Table="agent";
     
    	if(!empty($lavalid)){
     
    		$leuser = $_POST['identif2'];
    		$lepass = $_POST['pass2'];	
     
            $ltheme = $_POST['theme'];
            $lvaleur = $_POST['valeur'];
     
     
    		//--Mise à jour dans la base
     
    		$SQL_UPDATE="UPDATE $Table
     
    			SET 
    			User_agent = '$leuser', 
    			Passe_agent = '$lepass',
                            Theme_agent = '$ltheme',
                            Val_Them_agent ='$lvaleur'
    			where Num_agent= $lenumagent";
     
    		$monresult=@mysql_query($SQL_UPDATE) or die (mysql_error());
     
    		$_SESSION['LENEWUSER']=$leuser;
    		$_SESSION['LENEWPASSE']=$lepass;
     
    		//--fermer la connexion
     
     
    		mysql_close();
     
     
    		//--redirection vers la page de MAJ dans la base réservation
     
    		header("location:newcoord_reservation.php");
    		exit();
     
    	}
    dans la page newcoord_reservation.php on a
    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
     
    $host="host"; //remarque c'est le même serveur
    $user="user1";
    $pass="pass1";
     
    $bdd="BDD2";
    $Table1="mrbs_users";
    $leuser = $_SESSION['LENEWUSER'];
    $lepass = $_SESSION['LENEWPASSE'];
    $lidagentreservation = $_SESSION['LIDRESERVATION'];
     
    $SQL_UPDATE="UPDATE $Table1 
    				SET 
    				name = '$leuser', 
    				password = '$lepass1' 
    				where id = $lidagentreservation";
     
    			$monresultat=@mysql_query($SQL_UPDATE);
     
                             if(!empty($monresultat)){
     
    				//retourne le nombre de ligne affecté par UPDATE, DELETE, etc. et non SELECT et SHOW
    				$nbr_lgn=mysql_affected_rows($monresultat);
    			}
     
                            mysql_close();
     
     
    			if($nbr_lgn<1){
    				//--pas d'update
    				header("location:../message/message_err.php?ERR=BSM");
    				exit();
     
    			}else{
     
    				//--redirection vers message lorsque tout s'est bien passé
    				header("location:../message/message.php?T=CCO");
    				exit();
    			}
    Ce que je ne comprend pas c'est que dans mes deux bases les mise à jour sont effectuées, mais dans la deuxième page je suis renvoyé vers la page d'erreur comme si l'update de cette page n'a pas été effectué. J'ai cherché à afficher la variable $nbr_lgn mais elle est vide. Pourtant j'ai utilisé mysql_affected_rows ailleurs mais je n'ai pas eu de problème. Je ne sais pas si c'est le fait de changer de base de données qui cause cela ? Toutefois je constate quand même que la base est mise à jour avec les données en provenance du premier fichier. Je suis sur PHP 5.1
    Quelqu'un pourrai s'il vous plaît me dire à quoi cela peut être dû ? En vous remerciant !

  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
    Déjà enlève les @ dans ton code, ce n'est pas une façon propre d'écrire un code.

    Ensuite, mysql_query renvoie un booleen, donc autant faire le test exact plutôt que d'utiliser empty() :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if($monresultat === TRUE){
    Pour ton problème, il faut se souvenir qu'une ligne déjà à jour, n'est pas comptée.
    Donc 2 hypothèses :
    - la table est déjà à jour
    - le script est appellé deux fois d'un coup, cela arrive avec des url males écrites dans un CSS par exemple
    N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP

  3. #3
    Expert éminent sénior

    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2010
    Messages
    5 380
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Septembre 2010
    Messages : 5 380
    Points : 10 410
    Points
    10 410
    Par défaut
    Et au passage l'extension mysql n'existera plus dans les prochaines versions de php. Tu es entrain de développer du code obsolète, dommage. Faut au minimum utiliser mysqli ou mieux pdo si tu as un peu plus de temps.

  4. #4
    Membre régulier
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    204
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2005
    Messages : 204
    Points : 79
    Points
    79
    Par défaut
    Bonjour,
    Je vous remercie de vos réponses. Voilà ce que je trouve drôle !
    l'affichage de $monresultat est égal à 1 et non à TRUE
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    $monresultat=mysql_query($SQL_UPDATE);
     
    //--et lorsque je fais
    if(($monresultat===TRUE) ||($monresultat===1)){
     
     
    				$nbr_lgn=mysql_affected_rows($monresultat);
    			}
    $nbr_lgn est vide est-ce normal ça ? Ma requête est faite une seule fois et la mise à jour dans cette base une seule fois ! Je ne comprends plus rien !
    Merci de m'aider !

  5. #5
    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
    $monresultat est égal à 1 et non à TRUE
    Qu'est ce qui te permet de le dire avec ce code ?
    Ma requête est faite une seule fois
    Sans avoir consulté les logs, c'est impossible de l'affirmer.
    N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP

  6. #6
    Membre régulier
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    204
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2005
    Messages : 204
    Points : 79
    Points
    79
    Par défaut
    Bonjour,
    J'ai fais un echo de $monresultat qui m'affiche 1 et non TRUE

    Je suppose que TRUE c'est 1 et FALSE c'est 0 .

    Ou se trouve le fichier log traçant les requêtes exécutées dans la base ?
    Merci de votre aide !

  7. #7
    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
    Echo d'un booléen affiche effectivement 1 pour TRUE et 0 pour FALSE.

    Pour le log, il faut l'activer dans ton fichier de configuration mysql. En alternative, tu peux aussi simplement faire un log specifique pour cette requête dans le code PHP.
    N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP

  8. #8
    Membre régulier
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    204
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2005
    Messages : 204
    Points : 79
    Points
    79
    Par défaut
    Merci !
    effectivement j'ai fait un log relatif à cette requête :
    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
     
    $dir_l=	'/var/www/html/Intranet_mission1/Log/fichier.log';	
    $Table1="mrbs_users";
    $date = date('d.m.Y h:i:s'); 
     
    			$SQL_UPDATE="UPDATE $Table1 
    				SET 
    				name = '$leuser', 
    				password = '$lepass1' 
    				where id = $lidagentreservation";
     
    			$monresultat=mysql_query($SQL_UPDATE);
     
     
    			if($monresultat===TRUE){
     
    				//retourne le nombre de ligne affecté par UPDATE, DELETE, etc. et non SELECT et SHOW
    				$nbr_lgn=mysql_affected_rows($monresultat); //j'ai l'impression qu'il ne connait pas cette fonction : mysql_affected_rows()
    			}
     
    			//--fermer la connexion		
    			mysql_close();
     
     
    			if($nbr_lgn<1){		//cette condition ne marche toujours pas malgré le if($monresultat===TRUE)
     
    			//if($monresultat<1){ //effectivement cette condition marche 
    				$txt="\n".$date."\n Fichier : newcoord_reservation.php Erreur SQL Requete_UPDATE : erreur MAJ user et passe dans base réservation \n".$SQL_UPDATE."\n";	
    				error_log($txt,3,$dir_l);
     
    				//--message à modifier si possible (on n'arrive pas à faire la mise à jour dans la base réservation )
     
    				header("location:../message/message_err.php?ERR=BSM");
    				exit();
     
    			}else{
     
    				//--redirection vers message lorsque tout s'est bien passé
    				header("location:../message/message.php?T=CCO");
    				exit();
    			}
    Peut-être mon fichier log ne m'apprendra rien car je trace le cas ou il y a une erreur mais pas le nombre de fois de l'exécution de la requête !
    Peut-être avez-vous d'autres pistes ?

  9. #9
    Membre régulier
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    204
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2005
    Messages : 204
    Points : 79
    Points
    79
    Par défaut
    Il me semble que cette façon de coder n'est pas bonne :
    Comment améliorer celle-ci car avec mysql_affected_rows() chez moi ça ne marche pas ?
    Merci

  10. #10
    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
    Pourquoi tu dis que ce n'est pas bon ?
    Que vaut $monresultat dans ton code ?
    N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP

  11. #11
    Membre régulier
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    204
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2005
    Messages : 204
    Points : 79
    Points
    79
    Par défaut
    Bonjour,
    En fait en faisant effectivement le test avec
    ça marche mais il me semblait que ce n'est pas une bonne façon de coder ? Si je comprend bien tant que ça marche je l'utilise malgré le fait qu'en utilisant la fonction
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $nbr_lgn=mysql_affected_rows($monresultat)
    ça ne marche pas ?
    Je n'ai pas pu trouver si la requête s'exécutait plusieurs fois !

Discussions similaires

  1. Réponses: 4
    Dernier message: 13/11/2006, 18h05
  2. [Oracle] Nombre de ligne affecté par un update
    Par vimanas dans le forum PHP & Base de données
    Réponses: 2
    Dernier message: 26/09/2006, 16h24
  3. [Oracle] Connaitre le nombre de lignes affectées par un update à l'avance
    Par lionheart33806 dans le forum PHP & Base de données
    Réponses: 15
    Dernier message: 10/08/2006, 10h35
  4. [9i] Nombre de lignes affectées par un update
    Par yac dans le forum Oracle
    Réponses: 5
    Dernier message: 13/01/2006, 15h59
  5. [SYBASE] nombre de ligne impactée par UPDATE
    Par metheorn dans le forum Sybase
    Réponses: 3
    Dernier message: 14/05/2004, 16h47

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