【问题标题】:Special characters (i.e. '...' character) causing query to fail导致查询失败的特殊字符(即“...”字符)
【发布时间】:2014-09-30 19:07:12
【问题描述】:

我不确定这个字符“...”属于哪个字符集。但是,在某些情况下,用户会将数据复制并粘贴到我正在处理的应用程序的注释字段中。注释内容包含此特殊字符并导致插入/更新查询失败。

我想知道是否有一个字符串函数来检测和删除这个特殊字符(以及这个字符集中的其他不需要的字符),同时保留所有其他特殊字符?

例子:

$query = 'INSERT INTO notes (note) VALUES ("… hello … world!")';
mysqli_query($conn, $query); //nothing is inserted

提前致谢!

【问题讨论】:

  • 你用什么代码来处理这个?
  • 不确定你在问什么。我正在使用 PHP 进行编码,并使用 mysqli_query 来执行 db 命令。
  • “导致查询失败”不够具体。 如何导致它失败?有什么错误吗?
  • 您使用的代码是什么?你说 PHP,但实际代码是什么?给我们看一看。一个 MySQLi 数据库,好的。但是表中的设置是什么? InnoDB 引擎?字符集?
  • 是的,杰伊说的。这是没有意义的。你没有做插入。 INSERT INTO table (column1, column2) VALUES (value2, value2) 在哪里?

标签: php utf-8 character-encoding ascii


【解决方案1】:

如果我是你,我会考虑接受更广泛的字符集。 (您只需要记住正确转义字符。)去除某些字符对用户不友好,并且使用 UTF-8 似乎受到限制。

如果你真的想去掉 UTF-8 字符,你可以使用

$string = preg_replace('/[^(\x19-\x7F)]*/','', $string);

here 所述。


这是一个例子:

<?php
$string = "a bc…de f";
echo preg_replace('/[^(\x19-\x7F)]*/','', $string); 
?>

输出:

a bcde f

最后,你需要转义你的输入:

$string = preg_replace('/[^(\x19-\x7F)]*/','', $string);
$string = mysqli_escape_string($string);
$query = 'INSERT INTO notes (note) VALUES (' . $string . ')';
mysqli_query($conn, $query);

【讨论】:

  • 感谢您的回复。这些是导致失败的确切字符:forlang.wsu.edu/help/keyboards.asp。上面的 preg_replace 也不允许成功插入。但是,当我尝试仅对字母数字字符使用 preg_replace 时,它​​插入成功。
  • 添加了一个例子。做的时候省略号不是去掉了吗?
  • 嘿 aioobe,它确实删除了省略号,但是,它也删除了我们试图保留的空格、换行符等。没有 preg_replace,空格仍然存在。
  • 更新答案:从\x20 更改为\x19 以允许\x20 对应于空格。
  • 谢谢aioobe,但没有帮助。换行符仍被删除。
【解决方案2】:

在解决您的问题之前,您不应该将原始输入插入到您的数据库中。

你应该做的是:

error_reporting(E_ALL);
$string = mysqli_escape_string($conn, "… hello … world!");
mysqli_query($conn, $query);

error_reporting 将在屏幕上显示原始错误,转义字符串将:

a) 避免 SQL 注入。

b) 插入记录,即使它有特殊字符。

现在,如果您需要删除这些特殊字符,请使用以下内容:

$string = preg_replace($pattern, "", $string);

在转义之前。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-04-22
    • 2011-05-30
    • 2013-11-24
    • 2011-10-08
    • 2012-03-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多