【发布时间】:2014-11-28 11:03:06
【问题描述】:
我尝试在 Sqlite 上使用 PDO 在 PHP 中执行查询,该查询可能包含特殊字符(Ä、Ö、Ü、...)。但我无法执行查询。 PHP 返回以下错误:
array(3) { [0]=> string(5) "00000" [1]=> int(1) [2]=> string(35) "无法识别的标记:"'MÄÖÜ123DE"" }
我尝试以原生方式执行查询,并以使用准备语句和绑定值的方式执行。
$statement = "select * from list where param = ? and value = ?";
$stmt = $db->prepare($statement);
$stmt->bindValue(1, $setparam);
$stmt->bindValue(2, $val,PDO::PARAM_STR);
$stmt->execute();
原生方式:
$statement = "select * from list where param = '".$setparam."' and value = '".$val."'";
$res = $db->query($statement);
两种方式都返回相同的错误。我使用 XAMPP 1.8.3-5。使用的编码是 UTF-8。 在 sqlitestudio 中,查询运行良好。
编辑执行 PDO:
$db = new PDO("sqlite:database/lists.db","","",array(
PDO::ATTR_PERSISTENT => true));
使用的 UTF-8 HTML 元执行:
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
【问题讨论】:
-
如何设置 PDO 句柄?您实际使用的是哪种 HTML 页面字符集和
<form>编码?对我来说,输入看起来像一个 Latin-1 子集。 -
使用PHP命令
utf8_encode将输入转换为utf-8。 -
这听起来很对,尽管如果输入已经是 UTF-8 就显得多余了。如果可能的话,做一个verifyable 的例子。测试文字 PHP 字符串而不是表单输入。如果确实是 2 个字节,请使用
strlen("Ä")进行探测。 Sqlite 本身与二进制无关,并且只有表与字符集相关(如果它们是使用正确的PRAGMA创建的;也转储表.schema)。 -
我解决了这个问题。这既是 sqlite 问题,也不是 PHP 问题。这是我的数据中的一个问题。
标签: php sqlite pdo special-characters