我的代码类似于以下内容:
$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()而没有任何改变。
答案 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);");