如何将特殊字符插入到数据库中?

18

请问有人能告诉我如何将特殊字符插入到MySQL数据库中吗?我写了一个PHP脚本,旨在将一些单词插入到数据库中,但如果单词包含',则无法插入。

使用PHPmyAdmin时,我可以轻松地插入特殊字符,但是通过PHP插入它们时却不起作用。可能是PHP将特殊字符更改为其他内容了吗?如果是这样,是否有方法使它们正确地插入?


你能否只粘贴处理和插入特定变量的代码部分? - OM The Eternity
13个回答

32
$insert_data = mysql_real_escape_string($input_data);
假设您将数据存储为$input_data,则:

1
那会教训我,因为我没有写一个简单的一行示例。 - zaf
我知道!当我看到你比我先回答时,我差点删除了我的答案。 - Anthony
6
此函数将在 PHP 5.5 中被弃用,您应该改用 mysqli_real_escape_string 函数。 - ssergei

12

你正在转义字符吗?试试mysql_real_escape_string()函数,它将处理特殊字符。


如果你使用反引号来格式化内联代码,我发现我会得到更多的投票,如果这有帮助的话,那就+1。 - Anthony
1
同情点赞,因为你回答得很快,但没有给出示例。好像这是一个可以通过PHP.net更快地回答的问题。 - dscher
@dscher 谢谢!如果有更多像你这样的人就好了!;) - zaf
@zaf 两年后,我想道歉。:P 当时我很愚蠢,对PHP一窍不通。当我看到Anthony的答案和代码示例时,我立即将其选为答案,甚至没有看过你的答案,因为它需要更少的努力。现在我知道得更多了,所以再次道歉。 :) - Joey Morani
1
@JoeyMorani 没关系,谢谢你的留言。你不再是新手了。 - zaf

6

您很可能正在转义SQL字符串,类似于:

SELECT * FROM `table` WHERE `column` = 'Here's a syntax error!'

您需要转义引号,如下所示:

SELECT * FROM `table` WHERE `column` = 'Here\'s a syntax error!'

mysql_real_escape_string()会为您处理此问题。


6

使用 mysql_real_escape_string

mysql_real_escape_string 是什么呢?它是 PHP 函数库中的一个函数,可以在以下字符前添加反斜杠:\n、\r、\\、\x00、\x1a、' 和 "。重要的是,单引号和双引号都被转义了,因为这些字符最容易打开漏洞。

请了解 SQL 注入。您可以使用此链接作为起点。


1
又一篇毫无头绪的愚蠢文章。关于删除表格的老生常谈(可以吓唬新手,但从未奏效),同样愚蠢的查询函数还要考虑魔术引号。像往常一样,没有提到非字符串值。以及最好的$badWords保护措施。 - Your Common Sense
好的,这篇文章可能不是最好的,但它应该可以让你熟悉基础知识(我从快速谷歌搜索中找到了它)。如果你有更好的文章链接,也可以分享给我。 - Peter Parker
我写了一些关于这个问题的SO答案。 http://stackoverflow.com/questions/2589820/is-it-necessary-to-use-mysql-real-escape-string-when-magic-quotes-gpc-is-on - Your Common Sense

5

3

请注意,正如其他人指出的那样,mysql_real_escape_string()可以解决这个问题(addslashes也可以),但是出于安全考虑,您应该始终使用mysql_real_escape_string() - 请考虑以下内容:

SELECT * FROM valid_users WHERE username='$user' AND password='$password'

如果浏览器发送了什么?
user="admin' OR (user=''"
password="') AND ''='"

查询变为:
SELECT * FROM valid_users 
WHERE username='admin' OR (user='' AND password='') AND ''=''

即安全检查完全被绕过。
C.

2
也许 "mysql_real_escape_string()" 对您有用。

0

例如:
$parent_category_name = 男装
在这里考虑SQL查询

$sql_category_name = "SELECT c.*, cd.name, cd.category_id  as iid FROM ". DB_PREFIX . "category c LEFT JOIN " . DB_PREFIX . "category_description cd ON (c.category_id = cd.category_id) WHERE cd.name = '" .  $this->db->escape($parent_category_name) . "' AND c.parent_id =0 "; 

错误:

Static analysis:

1 errors were found during analysis.

Ending quote ' was expected. (near "" at position 198)
SQL query: Documentation

SELECT c.*, cd.name, cd.category_id as iid FROM oc_category c LEFT JOIN oc_category_description cd ON (c.category_id = cd.category_id) WHERE cd.name = 'Men's Clothing' AND c.parent_id =0 LIMIT 0, 25

MySQL said: Documentation

#1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 's Clothing' AND c.parent_id =0 LIMIT 0, 25' at line 1

尝试实现:

$this->db->escape($parent_category_name)

以上方法适用于OpenCart框架。找到您的框架并实施OR在Core PHP中使用mysql_real_escape_string()

这将变成男装,即在我的情况下

$sql_category_name = "SELECT c.*, cd.name, cd.category_id  as iid FROM ". DB_PREFIX . "category c LEFT JOIN " . DB_PREFIX . "category_description cd ON (c.category_id = cd.category_id) WHERE cd.name = '" .  $this->db->escape($parent_category_name) . "' AND c.parent_id =0 "; 

通过实现escape(),您将清楚地了解查询的情况。

SELECT c.*, cd.name, cd.category_id as iid FROM oc_category c LEFT JOIN oc_category_description cd ON (c.category_id = cd.category_id) WHERE cd.name = 'Men\'s Clothing' AND c.parent_id =0

0
$var = mysql_real_escape_string("data & the base");
$result = mysql_query('SELECT * FROM php_bugs WHERE php_bugs_category like  "%' .$var.'%"');

这是一个处理PHP MySQL中特殊字符的工作示例。您可以将&替换为',它将正常工作。 - amarjit singh

0

htmlspecialchars函数是最好的解决方案。今天我在搜索如何插入带有特殊字符的字符串时,谷歌给出了很多Stackoverflow列表。但是它们都没有提供解决方案。我在w3schools页面上找到了答案。是的,我可以通过使用这个函数来解决我的问题:

$abc = $POST['xyz'];

$abc = htmlspecialchars($abc);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接