Précédent   Forum des professionnels en informatique > PHP > PHP & SGBD > PDO
PDO Forum d'entraide sur PDO (PHP Data Objects) : pilote générique de bases de données avec PHP. Avant de poster -> FAQ PDO et Cours PDO
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 07/02/2011, 01h49   #1
Futur Membre du Club
 
Nicolas Bonnici
Inscription : janvier 2011
Messages : 59
Détails du profil
Informations personnelles :
Nom : Nicolas Bonnici

Informations forums :
Inscription : janvier 2011
Messages : 59
Points : 19
Points : 19
Par défaut PDO et UPDATE

Bonjour à tous,

Je ne comprend pas j'ai une méthode, qui me sert pour les 'INSERT, UPDATE et DELETE' et qui fonctionne correctement jusqu’à maintenant:

Code :
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
 
	public function dbExec($req,$condition) {
		try {
			$bdd = new PDO('mysql:host='.$this->dbhost.';dbname='.$this->db, $this->dbuser, $this->dbpass);
			$bdd->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
		} catch(Exception $log) {
			echo 'Erreur: '.$log->getMessage().'<br />';
			echo 'Code: '.$log->getCode();
		}
		if (empty($log)) {
			$requete = $bdd->prepare($req);
			if (!is_array($condition)) {
				$condition = array();
			}
			try {
				$do = $requete->execute($condition);
			} catch(Exception $log) {
				echo 'Erreur: '.$log->getMessage().'<br />';
				echo 'Code: '.$log->getCode();
			}		
			// Si on trouve une reponse			
			if ($do != false) {
				return true;
			} else {
				return false;
			}
		}
	}
Cette méthode fonctionne correctement pour faire des 'UPDATE' mais avec le code suivant le try/catch ne me renvoi aucune erreur et la méthode me renvoi TRUE alors que rien n'est modifié dans la BDD... C'est étrange! Voici le code en question:

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
 
	// Mettre à jour une note
	if ($_POST['updateNote']) {
		if ( ($_POST['id'] != '') && ($_POST['noteTitre'] != '') && ($_POST['noteContent'] != '') && ($_POST['noteKeywords'] != '') ) {
			// Recuperer le timestamp
			$time = time();
			if (!$Core->dbExec('UPDATE `notes` SET `titre`=?, `note`=?, `keywords`=?, `ts_lastmodif`=? WHERE `id_creator`=? AND `id`=?', array($_POST['noteTitle'], $_POST['noteContent'], $_POST['noteMetaKeywords'], $_SESSION['userid'], $time, $_POST['id'])) ) {
				$txt = '<p>Erreur lors de l\'enregistrement des modifications...</p>';
				$Core->newErrorMessage($txt);
			} else {
				$txt = '<p>Les modifications sont correctement enregistrés!</p>';
				$Core->newMessage($txt);
			}					
		} else {
			$txt = '<p>Erreur: Impossible de d\'enregistrer les modifications...</p>';
			$Core->newErrorMessage($txt);				
		}	
	}
Je ne comprend pas pourtant quand je teste coté serveurs les données que j'enregistre sont bien différentes de celles présentes dans ma DB (ne serai-ce que le timestamp) et pourtant rien ne change dans ma DB....

J'en perd mon latin et je suis fatigué alors ça n'arrange rien, si quelqu'un peut me filer un coup de main, il est le bienvenu!

Merci

Nico
nico78200 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/02/2011, 02h08   #2
Membre émérite
 
Avatar de vorace
 
Homme
Développeur
Inscription : août 2010
Messages : 586
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France, Meurthe et Moselle (Lorraine)

Informations professionnelles :
Activité : Développeur

Informations forums :
Inscription : août 2010
Messages : 586
Points : 859
Points : 859
dans ta liste de paramètres, tu as inversé $time et $_SESSION['userid'],
mes $time avant $_SESSION['userid']...
vorace est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/02/2011, 02h15   #3
Futur Membre du Club
 
Nicolas Bonnici
Inscription : janvier 2011
Messages : 59
Détails du profil
Informations personnelles :
Nom : Nicolas Bonnici

Informations forums :
Inscription : janvier 2011
Messages : 59
Points : 19
Points : 19
Citation:
Envoyé par vorace Voir le message
dans ta liste de paramètres, tu as inversé $time et $_SESSION['userid'],
mes $time avant $_SESSION['userid']...
Un grand merci Vorace, erreur stupide de fatigue... Juste pour la forme pourquoi je n'ai aucun message d'erreur alors que pourtant j’exécutais un UPDATE sur une entrée inexistante dans ma DB?
nico78200 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/02/2011, 09h23   #4
Membre éprouvé
 
Avatar de radicaldreamer
 
Homme Guillaume
Développeur Web
Inscription : décembre 2007
Messages : 353
Détails du profil
Informations personnelles :
Nom : Homme Guillaume
Âge : 21
Localisation : France, Haut Rhin (Alsace)

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

Informations forums :
Inscription : décembre 2007
Messages : 353
Points : 473
Points : 473
Parce que ne requête qui ne retourne pas de résultat n'est pas forcément une requête fausse. Alors il n'affiche pas d'erreur. (:
__________________
Si ce que tu as à dire n'est pas plus beau que le silence, alors tais toi.

- Pensez à voter pour les messages qui vous ont été utiles ainsi que de mettre
radicaldreamer est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/02/2011, 12h24   #5
Futur Membre du Club
 
Nicolas Bonnici
Inscription : janvier 2011
Messages : 59
Détails du profil
Informations personnelles :
Nom : Nicolas Bonnici

Informations forums :
Inscription : janvier 2011
Messages : 59
Points : 19
Points : 19
Citation:
Envoyé par radicaldreamer Voir le message
Parce que ne requête qui ne retourne pas de résultat n'est pas forcément une requête fausse. Alors il n'affiche pas d'erreur. (:
Oui attention ce commentaire est un résidu d'une autre méthode dbQuery() pour faire des SELECT dans la DB, mais dans le cas présent la requête PDO execute() est censé renvoyer un bool point barre.... Je l'ai ré-éecrite avec des opérateurs de type '===' .

Bonne journée
nico78200 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/02/2011, 13h07   #6
Expert Confirmé
 
Avatar de RunCodePhp
 
Inscription : janvier 2010
Messages : 2 706
Détails du profil
Informations personnelles :
Localisation : Réunion

Informations forums :
Inscription : janvier 2010
Messages : 2 706
Points : 3 274
Points : 3 274
Salut

Citation:
mais dans le cas présent la requête PDO execute() est censé renvoyer un bool point barre
Tout a fait.

Il me semble qu'il y aurait plus simple et plus fiable en procédant ainsi :
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
 
public function dbExec($req,$condition) {
	try {
		$bdd = new PDO('mysql:host='.$this->dbhost.';dbname='.$this->db, $this->dbuser, $this->dbpass);
		$bdd->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
                //
		$requete = $bdd->prepare($req);
		if (!is_array($condition)) {
			$condition = array();
		}
		try {
			return $requete->execute($condition);
		}
		catch(Exception $e) {
			echo 'Erreur: '.$e->getMessage().'<br />';
			echo 'Code: '.$e->getCode();
		}
	}
	catch(Exception $e) {
		echo 'Erreur: '.$e->getMessage().'<br />';
		echo 'Code: '.$e->getCode();
	}
	return FALSE;
}
Entre autre, il n'est pas utile de continuer le script si le 1er try/catch de connexion échou, du coup une vérif de $log devient par la même occasion inutile.
La suite du code, de l'exécution de la requête serait bien mieux dans ce 1er try/catch à mon avis.


Aussi, une vérif est faite sur $do après le 2ème bloc try/catch.
Là aussi, s'il y a erreur il vaut mieux ne pas poursuivre le script.

S'il y a une erreur de syntaxe sur la requête par exemple, une exception sera levée et seul le code dans le catch sera exécuté.
Du coup, $do n'existera pas à la suite du code, et ceci devrait provoquer une toute autre erreur, vois tu ?


Donc attention au déroulement du code, c'est un peu dommage de mettre en place une gestion des exceptions en recréant d'autres erreurs en cascades, même minimes.
__________________
Win XP | WampServer 2.2d | Apache 2.2.21 | Php 5.3.10 | MySQL 5.5.20
Si debugger, c'est supprimer des bugs, alors programmer ne peut être que les ajouter [Edsger Dijkstra]
RunCodePhp est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/02/2011, 13h30   #7
Modérateur
 
Inscription : septembre 2010
Messages : 7 101
Détails du profil
Informations forums :
Inscription : septembre 2010
Messages : 7 101
Points : 8 466
Points : 8 466
un seul try...catch suffis :

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
public function dbExec($req, $condition)
{
    try 
    {
        $bdd = new PDO('mysql:host='.$this->dbhost.';dbname='.$this->db, $this->dbuser, $this->dbpass);
        $bdd->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
 
        $requete = $bdd->prepare($req);
 
        if(!is_array($condition))
        {
            $condition = array();
        }
 
        return $requete->execute($condition);
    }
    catch(PDOException $e)
    {
        echo 'Erreur: ', $e->getMessage(), '<br />';
        echo 'Code: ', $e->getCode();
    }
 
    return false;
}
__________________
http://blog.stealth35.com/
stealth35 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/02/2011, 14h12   #8
Expert Confirmé
 
Avatar de RunCodePhp
 
Inscription : janvier 2010
Messages : 2 706
Détails du profil
Informations personnelles :
Localisation : Réunion

Informations forums :
Inscription : janvier 2010
Messages : 2 706
Points : 3 274
Points : 3 274
Citation:
un seul try...catch suffis :
Oui, parce qu'en cas d'erreur le message est exactement le même, donc pourquoi pas.


Mais en conservant les 2 try/catch, les 2 niveaux, on peu améliorer le débogage en y rajoutant la requête SQL par exemple dans le 2ème catch.
On ciblera mieux la nature de l'erreur à mon sens.


Il me semble qu'il est là l'avantage des try/catch, c'est d'attraper les erreurs le plus tôt possible afin de la gérer autrement ou/et alors informer le codeur/développeur de la vrai nature de l'erreur, et aussi où elle a eu lieu.
Ces messages d'erreurs risquent d'être peu explicites d'ailleurs, un $e->getMessage() c'est maigre bien souvent, m'enfin.


D'ailleurs, là j'ai un doute, mais il faudrait voir lorsqu'une exception est levée si le message est enregistré dans les logs (php_errors.log).
A mon avis ce n'est pas le cas, et ce serait un manque (voir gros manque).
__________________
Win XP | WampServer 2.2d | Apache 2.2.21 | Php 5.3.10 | MySQL 5.5.20
Si debugger, c'est supprimer des bugs, alors programmer ne peut être que les ajouter [Edsger Dijkstra]
RunCodePhp est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/02/2011, 14h21   #9
Modérateur
 
Inscription : septembre 2010
Messages : 7 101
Détails du profil
Informations forums :
Inscription : septembre 2010
Messages : 7 101
Points : 8 466
Points : 8 466
Citation:
Envoyé par RunCodePhp Voir le message
D'ailleurs, là j'ai un doute, mais il faudrait voir lorsqu'une exception est levée si le message est enregistré dans les logs (php_errors.log).
A mon avis ce n'est pas le cas, et ce serait un manque (voir gros manque).
non c'est a toi de faire ça.
__________________
http://blog.stealth35.com/
stealth35 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/02/2011, 01h41   #10
Futur Membre du Club
 
Nicolas Bonnici
Inscription : janvier 2011
Messages : 59
Détails du profil
Informations personnelles :
Nom : Nicolas Bonnici

Informations forums :
Inscription : janvier 2011
Messages : 59
Points : 19
Points : 19
Merci beaucoup à tous pour votre aide, oui en effet j'ai bien compris le pourquoi du comment grâce à vos explications.

Pour le débogage, je vais ajouter une méthode dans mon application pour les logger proprement dans un fichier.

Bonne continuation
nico78200 est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 08h50.


 
 
 
 
Partenaires

Hébergement Web