Fatal error: Cannot pass parameter 2 by reference avec pdo-sqlyte

nounet
Invité n'ayant pas de compte PHPfrance

29 févr. 2008, 12:11

Bonjour a tous
Comme son sujet l'indique j'ai une erreur concernant une insertion dans une bars de donnée avec pdo
define('TYPE_DEMANDE_CONTACT','Contact Email');


try{
			$oConnection=new PDO('sqlite:./Db/MyDb.db');
		   	$oPDOStatement=$oConnection->prepare("INSERT INTO ".NOM_TABLE_CLIENT." (IdClient,TypeDemande,DesignationClient,MailClient,TelClient) VALUES (?,?,?,?,?)");
			$oPDOStatement->bindParam(1,'');
			$oPDOStatement->bindParam(2,TYPE_DEMANDE_CONTACT);
			$oPDOStatement->bindParam(3,$aData['Nom-Prenom']);
			$oPDOStatement->bindParam(4,$aData['Email']);
			$oPDOStatement->bindParam(5,$aData['Telephone']);
			$oPDOStatement->execute();
			$this->oConnection=NULL;
			}
			catch (PDOException $e){
				echo 'erreur'.$e->getMessage();
			}
J'ai bien essayé dans mon Bind Param de na pas utiliser ma constante defini mais le probleme persiste .Quelqu'unaurait dejat'il eu ce probleme?merci d'avance

Eléphant du PHP | 259 Messages

29 févr. 2008, 12:53

Hello,

PDO::bindParam() crée une référence sur une variable, ce qui pose un petit problème de logique lorsque tu lui passe une constante (qui par définition n'est pas une variable) ou une valeur (j'imagine que c'est ce que tu as fait dans ton second test ?)

Tu dois pouvoir contourner ce problème en passant comme ceci :
$truc = MA_CONSTANTE;
$pdo->bindParam( 2 , $truc );
Ou sinon, plus intéressant, PDO::bindValue est plus ou moins fait pour ça :
$pdo->bindValue( 2 , MA_CONSTANTE );

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 13231 Messages

29 févr. 2008, 12:53

Je pense que la colonne "id_client" est une clé primaire, surement auto-incrémentée. Je pense même que tu voudrais laisser Sqlite remplir ce champ.

Vrai ?

Si c'est vrai, il ne faut pas que tu l'indiques dans ton INSERT (ni la colonne, ni la valeur)
Connaître son ignorance est la meilleure part de la connaissance
Pour un code lisible : n'hésitez pas à sauter des lignes et indenter

twitter - site perso - Github - Zend Certified Engineer

Nounet
Invité n'ayant pas de compte PHPfrance

29 févr. 2008, 15:18

Tout a fait zeus.
Mon premier champ IdClient est auto incrementré et represente bien une clef primaire.Donc ,grace a vous je vais tester le code suivant:
$oConnection=new PDO('sqlite:./Db/MyDb.db');
		   	$oPDOStatement=$oConnection->prepare("INSERT INTO ".NOM_TABLE_CLIENT." (TypeDemande,DesignationClient,MailClient,TelClient) VALUES (?,?,?,?)");
			$oPDOStatement->bindValue(1,'Contact Email');
			$oPDOStatement->bindValue(2,$aData['Nom-Prenom']);
			$oPDOStatement->bindValue(3,$aData['Email']);
			$oPDOStatement->bindValue(4,$aData['Telephone']);
			$oPDOStatement->execute();
			$oConnection=NULL;
Je l'ai testé et cela marhe maintenant ,vraiment un grand merci a vous !!!

D'autre part,j'avais inseré des caracteres accentués dans ma base .Seulement ceci apparaisse mal une fois affiché dans ma page html.J'ai lu plusieurs choses sur le net comme quoi sqlyte ne pouvait les gerer.Est ce vrai?n'y a t'il pas un moyen de controuner le probleme ??

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 13231 Messages

29 févr. 2008, 16:56

Modération :
Puisque ta question est résolue, j'ajoute le tag [Résolu]
pour indiquer aux personnes qui voudront consulter ce sujet qu'il contient une solution.

Tu peux réaliser cette opération toi-même
en cliquant sur le bouton Image qui s'affiche en haut à gauche de ce sujet
si tu as posté le 1er message en tant que membre (inscrit et identifié).

Alors... inscris-toi !!! ;)

De plus, si tu as une autre question ouvre un nouveau sujet,
cela te permettra d'avoir plus de réponses.
Connaître son ignorance est la meilleure part de la connaissance
Pour un code lisible : n'hésitez pas à sauter des lignes et indenter

twitter - site perso - Github - Zend Certified Engineer