2010-10-19 19 views
1

je code similaire à ce qui suit:Postgres/PHP PDO :: PDOStatement-> bindParam() Caractère du champ (1)

$data['someField'] = (isset($_POST['someField'])) ? 'Y' : 'N'; 
$stmt = $db->prepare("INSERT INTO public.someTable (someField) VALUES (':someField');"); 
$stmt->bindParam(':someField', ($data['someField']), PDO::PARAM_STR, 1); 
$db->beginTransaction(); 
$stmt->execute(); 
$db->commit(); 

Le champ est un caractère (1) qui contient un ou l'autre Y ou N (je préfère utiliser un bool/int (1), mais je ne peux malheureusement pas le changer). Comme vous pouvez le voir, cela prend les données POST à ​​partir d'un formulaire HTML et définissez Y ou N en fonction d'une case à cocher. La variable semble correctement définie lorsque je lui fais écho. La requête fonctionne si je mets manuellement un « Y » ou « N » dans la déclaration, mais lorsque vous utilisez bindParam() Je reçois l'erreur suivante:

SQLSTATE[22001]: String data, right truncated: 7 ERROR: value too long for type character(1) 

La chose vraiment étrange est, même si je fais quelque chose comme ça :

$stmt->bindParam(':someField', substr($data['someField'], -1), PDO::PARAM_STR, 1); 

Je reçois toujours l'erreur. D'après les commentaires des utilisateurs sur la page de fonction à php.net:

Steve M 19-Nov-2009 07:28 Note that when using PDOStatement::bindParam an integer is changed to a string value upon PDOStatement::execute(). (Tested with MySQL).

Il n'y a aucune autre mention de cela, ou quoi que ce soit sur la façon de contourner le problème. Je suppose que c'est la racine du problème. J'ai aussi essayé d'utiliser bindValue() sans changement.

Répondre

1

a trouvé la réponse à ce problème ici: String encoding problem on PdoStatement->bindParam()?

Fondamentalement PDO échapperont automatiquement le paramètre pour vous, alors quand je fait ma requête:

"INSERT INTO public.someTable (someField) VALUES (':someField');" 

Une fois PDO a été fait avec elle, il a fini par qui ressemble à ceci:

"INSERT INTO public.someTable (someField) VALUES (''Y'');" 

utilisation correcte de la fonction prepare() est:

$stmt = $db->prepare("INSERT INTO public.someTable (someField) VALUES (:someField);");