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 :

Fatal error: Cannot pass parameter 2 by reference [PDO]


Sujet :

PHP & Base de données

  1. #1
    Membre actif
    Inscrit en
    Octobre 2005
    Messages
    908
    Détails du profil
    Informations forums :
    Inscription : Octobre 2005
    Messages : 908
    Points : 271
    Points
    271
    Par défaut Fatal error: Cannot pass parameter 2 by reference
    Bonjour à tous,

    j'ai un problème avec l'utilisant de la méthode bindParam() sur une base MySQL.
    Lorsque j'utilise la requête $sql_1, j'obtiens ce message d'erreur :
    Fatal error: Cannot pass parameter 2 by reference
    au niveau du champ t_diaporama.active (Boolean) alors que la seconde requête fonctionne (t_diaporama.active étant à FALSE directement dans la requête avec la ligne $sth->bindParam(':active', FALSE, PDO:: PARAM_BOOL) en commentaire)...

    Mon code:
    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
    try {	
    	$sql_1 = "
    	INSERT INTO `t_diaporama` (`fichier`, `legende`, `active`, `etablissement_id`, `datetime_creation`, `login_creation`) 
    	VALUES (:fichier, :legende, :active, :etablissement_id, :datetime_creation, :login_creation) 
    	";
    	$sql_2 = "
    	INSERT INTO `t_diaporama` (`fichier`, `legende`, `active`, `etablissement_id`, `datetime_creation`, `login_creation`) 
    	VALUES (:fichier, :legende, FALSE, :etablissement_id, :datetime_creation, :login_creation) 
    	";
     
    	$sth = $cnxPDO->prepare($sql_1);
    	$sth->bindParam(':fichier', 		$fichier, 		PDO::PARAM_STR, 40);
    	$sth->bindParam(':legende', 		$legende, 		PDO::PARAM_STR, 100);
    	$sth->bindParam(':active', 		FALSE,			PDO::PARAM_BOOL);
    	$sth->bindParam(':etablissement_id', 	$etablissement_id, 	PDO::PARAM_INT);
    	$sth->bindParam(':datetime_creation', 	date("Y-m-d H:i:s"));
    	$sth->bindParam(':login_creation', 	$session_login);
     
    	$success = $sth->execute();
    	if ($success === FALSE) {
    		die("<p>ERREUR : L'ajout a retourné une erreur.</p>");
    	} else {
    		echo("<p>OK</p>");
    	}
    } catch (PDOException $e) {
    	die("<p>ERREUR : Erreur PDO pendant l'ajout :<br />" . $e->getMessage() ."</p>");
    }
    Quelqu'un aurait une idée sur ce qui ne fonctionne pas ?
    Merci d'avance.
    @+

  2. #2
    Membre actif
    Profil pro
    Développeur Web
    Inscrit en
    Octobre 2006
    Messages
    251
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Octobre 2006
    Messages : 251
    Points : 292
    Points
    292
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    $sth->bindParam(':active', $bool, PDO::PARAM_BOOL);
    $bool = false;
    Comme ceci ça devrai marcher, il faudra faire pareil pour le champs date

    Car il faut passer une référence et pas une valeur à la méthode bindParam.

    Mais il est vrai que la documentation sur PDO n'est pas très clair

  3. #3
    Membre émérite
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    1 448
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 448
    Points : 2 284
    Points
    2 284
    Par défaut
    Salut,

    Perso j'avais,moi aussi, eu des soucis sur les booleens avec PDO.
    J'avai du redéfinir PDO_STATMENT::bindParam

    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
     
    public function bindParam ( $parameter, 
    								$variable , 
    								$data_type = NULL ,  
    								$length = NULL ,  
    								$driver_options = array() )
    	{
    		if( is_bool($variable) && $data_type == PDO::PARAM_INT ){ $variable = intval($variable); }
     
    		$param 						= array();
    		$param["parameter"] 		= $parameter;
    		$param["variable"] 			= $variable;
    		$param["data_type"] 		= $data_type;
    		$param["length"] 			= $length;
    		$param["driver_options"] 	= $driver_options;
    		$this->p_params[] 			= $param;
     
    		return parent::bindParam($parameter,$variable,$data_type,$length,$driver_options);
    	}

    Après je fais ainsi :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $sth->bindParam(':active', $bool, PDO::PARAM_INT);
    Mais bon PDO à beaucoup évolué depuis alors la solution de benji07 est surement tout aussi fonctionnel et plus propre.

    bye

  4. #4
    Membre actif
    Inscrit en
    Octobre 2005
    Messages
    908
    Détails du profil
    Informations forums :
    Inscription : Octobre 2005
    Messages : 908
    Points : 271
    Points
    271
    Par défaut
    Merci à vous et surtout à benji07

    effectivement, il suffit de déclarer la variables en dehors de la méthode bindParam() !

    @+

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

Discussions similaires

  1. Fatal error: Cannot redeclare function checkdate()
    Par gscorpio dans le forum Langage
    Réponses: 2
    Dernier message: 08/07/2008, 17h28
  2. Réponses: 4
    Dernier message: 14/02/2008, 21h41
  3. [Dates] Fatal error : Cannot redeclare class
    Par ediawara dans le forum Langage
    Réponses: 10
    Dernier message: 27/11/2007, 15h47
  4. Fatal error: Cannot redeclare extension()
    Par karimphp dans le forum Langage
    Réponses: 3
    Dernier message: 12/06/2007, 13h56
  5. Réponses: 3
    Dernier message: 30/11/2006, 21h54

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