Page 1 sur 1

Problème avec ma requête préparée

Posté : 20 août 2012, 13:45
par JulieDev
Bonjour,
après avoir réussi plusieurs requêtes préparées, je ne comprends pas pourquoi celle relative à l'update ne fonctionne pas...
Après un test, la requête prend bien l'id s'il est écrit sous sa forme de variable : $id.
J'ai ensuite ajouté les PDO::PARAM... mais rien n'y fait..
Surtout que je suis bloquée avec celui relatif à la date...
public static function getBookModifie($connexion,$id, $titre, $description, $date,$activation){
    try{
        $sql_update = "UPDATE book
        SET    titre=:param2
               description=:param3
               date=:param3
               actif=:param4
        WHERE id=".$id."";

    $requetePreparee = $connexion->prepare($sql_update);
    $requetePreparee->bindParam(':param1', $id, PDO::PARAM_STR);
    $requetePreparee->bindParam(':param2', $titre, PDO::PARAM_STR);
    $requetePreparee->bindParam(':param3', $description, PDO::PARAM_STR);
    $requetePreparee->bindParam(':param4', $date, PDO::PARAM_INT);
    $requetePreparee->bindParam(':param5', $activation, PDO::PARAM_BOOL);
    $requetePreparee->execute();
        var_dump($requetePreparee);
    }catch ( Exception $e ) {
        echo "Problème de connexion : ". $e->getMessage();
        die();
    }
}
Après le var_dump ma requête affiche :
"UPDATE book SET titre=:param2 description=:param3 date=:param3 actif=:param4 WHERE id=44"
Les paramètres ne contiennent pas leur valeur...

Auriez-vous une idée de ce qui cloche ? Dans l'idéal j'aimerais bien conserver ma requête préparée....
Merci d'avance si vous avez le temps de jeter un coup d'oeil.
Bonne journée !

Re: Problème avec ma requête préparée

Posté : 20 août 2012, 14:23
par moogli
salut,

je vais commenter ton code se sera plus simple :)
<?php
$sql_update = "UPDATE book
        SET    titre=:param2
               description=:param3
               date=:param3
               actif=:param4
        WHERE id=".$id.""; // pas ici si tu utilise une requête préparée :)

    $requetePreparee = $connexion->prepare($sql_update);
    $requetePreparee->bindParam(':param1', $id, PDO::PARAM_STR); // pas de param1 dans la requête, et ton identifiant ce ne serais pas plutôt un entier ?
    $requetePreparee->bindParam(':param2', $titre, PDO::PARAM_STR);
    $requetePreparee->bindParam(':param3', $description, PDO::PARAM_STR);
    $requetePreparee->bindParam(':param4', $date, PDO::PARAM_INT); // ha pas non, vue le nom je dirais qu'une date c'est pas un entier :) une chaine de caractère plutot. 
    $requetePreparee->bindParam(':param5', $activation, PDO::PARAM_BOOL);
    $requetePreparee->execute();
?>
Il faut que tu test le retour de l'execute() si c'est false tu peux avoir un message d'erreur
<?php
$retour = $requetePreparee->execute();
if( $retour === false) {
$err = $requetePreparee->errorInfo();
throw new Exception('Erreur mise a jour livre : '.$err[2]); // on va profiter de la gestion des exception déjà existante
}
?>
Dans l'idéal j'aimerais bien conserver ma requête préparée...
Pourquoi ?

y a pas vraiment de raison d'avoir une requête préparée la. surtout que même si tu met ça dans une boucle tu vas redéfinir la requête à chaque fois donc perdre l'utilité de la requête préparée :mrgreen:

Il faut toujours vérifier ce que retourne une fonction, surtout quand comme ici cela peux mal se passer sans qu'il y a ai une exception de levée.

@+

Re: Problème avec ma requête préparée

Posté : 20 août 2012, 17:56
par JulieDev
Merci beaucoup pour cette réponse !
Effectivement il faut que je révise le pourquoi d'une requête préparée... :shock:
Je croyais que c'était du code plus propre ainsi (enfin pas le mien vu que ça ne marchait pas :| ).
En tout cas merci pour l'info supplémentaire concernant la gestion des erreurs, je corrige de ce pas mon script !
Bonne soirée !
Julie