【问题标题】:Special Characters in PHP PDO Sqlite Query cause unrecognized tokenPHP PDO Sqlite 查询中的特殊字符导致无法识别的令牌
【发布时间】: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 页面字符集和 &lt;form&gt; 编码?对我来说,输入看起来像一个 Latin-1 子集。
  • 使用PHP命令utf8_encode将输入转换为utf-8。
  • 这听起来很对,尽管如果输入已经是 UTF-8 就显得多余了。如果可能的话,做一个verifyable 的例子。测试文字 PHP 字符串而不是表单输入。如果确实是 2 个字节,请使用 strlen("Ä") 进行探测。 Sqlite 本身与二进制无关,并且只有表与字符集相关(如果它们是使用正确的PRAGMA 创建的;也转储表.schema)。
  • 我解决了这个问题。这既是 sqlite 问题,也不是 PHP 问题。这是我的数据中的一个问题。

标签: php sqlite pdo special-characters


【解决方案1】:

数据库仍然默认设置为使用 ISO-8859-15。 尝试在任何其他查询之前执行此查询以修复编码设置

SET NAMES "utf8"

【讨论】:

  • 抱歉您的查询有问题。正确的说法是:PRAGMA encoding="UTF-8;。但这对我的问题没有任何影响。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-03-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-02-10
  • 2020-12-18
相关资源
最近更新 更多