时间:2010-10-19 17:31:32

标签: php string postgresql pdo prepared-statement

我的代码类似于以下内容:

$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();

该字段是包含Y或N的字符(1)(我宁愿使用bool / int(1),但不幸的是我不能改变它)。如您所见,这将从HTML表单中获取POST数据,并根据复选框设置Y或N.当我回显它时,变量看起来正确设置。如果我手动将“Y”或“N”放入语句中,但是使用bindParam()时,查询有效,我收到以下错误:

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

奇怪的是,即使我做了这样的事情:

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

我仍然得到错误。来自php.net上功能页面的用户评论:

  

Steve M 19-Nov-2009 07:28请注意   当使用PDOStatement :: bindParam时   整数更改为字符串值   在PDOStatement :: execute()上。 (测试   用MySQL)。

没有进一步提及这一点,或者有关如何解决它的任何事情。我假设这是问题的根源。我也尝试过使用bindValue()而没有任何改变。

1 个答案:

答案 0 :(得分:1)

在此处找到此问题的答案:String encoding problem on PdoStatement->bindParam()?

基本上PDO会自动为你转义参数,所以当我查询时:

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

PDO完成后,它看起来像这样:

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

正确使用prepare()函数是:

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