PHP为字符串添加特殊字符,使查询无效

时间:2015-03-15 02:22:09

标签: php mysql

在我的脚本中,我遍历一个数组并从中创建一个INSERT INTO字符串,其中包含多个值。执行时我收到此错误:

.. right syntax to use near 'INSERT INTO

如您所见,PHP在字符串前面添加了一个奇怪的字符。该字符串使用

创建
$sql = "INSERT INTO table(`ItemID`, `Quantity`) VALUES "; 

foreach($articles as $item) 
{ 
    $sql .= "(".$item['ItemID'].",".$item['Quantity']."),"; 
} 

$sql = substr($sql, 0, -1); // to eliminate the trailing ","

$sql .= ";";  

为什么PHP会添加此字符,如何检测并删除它?该文件保存为UTF-8,无BOM。

2 个答案:

答案 0 :(得分:1)

您看到的字符可能是误读Byte Order Mark,Unicode字符(U + FEFF)表示哪个endianness用于UTF-16文件。引用Wikipedia

  

BOM的UTF-8表示是字节序列0xEF,0xBB,0xBF。将文本解释为ISO-8859-1或CP1252的文本编辑器或Web浏览器将为此显示字符

虽然您的PHP 文件可以在没有BOM的情况下轻松保存,但这并不代表您的查询之前没有。但是,如果没有看到$sql变量如何传递到mysql,我只会做一些猜测:

  • 字节顺序在UTF-8中并不重要,但BOMs are valid有时用于将字符串标识为Unicode。您可能需要手动指示MySQL将您的字符串解释为UTF-8而不是ISO-8859-1(使用mysql_set_charset或等效字符串)。无论如何,明确地设置客户端和服务器编码是一个好主意。
  • 如果这是特定于机器的问题,还要检查PHP的版本,并且您的MySQL客户端和服务器与生产(或您的其他计算机)相同。通过服务器/客户端版本进行默认编码,或者某些服务器(但不是其他服务器)检测字节顺序标记并自动切换到UTF-8,这是非常合理的。
  • 如果您的查询暂时保存到文件中(例如批量执行或缓存),您可能会发现它自动写入字节顺序标记。

答案 1 :(得分:0)

添加此行为我工作

$string_query = str_replace("\xEF\xBB\xBF", "", $string_query);