插入MySQL时在PHP中转义单引号

插入MySQL时在PHP中转义单引号,php,mysql,insert,escaping,Php,Mysql,Insert,Escaping,我有一个困惑的问题,我似乎无法理解 我有两条SQL语句: 第一种方法是将表单中的信息输入数据库 第二个从上面输入的数据库中获取数据,发送电子邮件,然后记录事务的详细信息 问题是,似乎只有一个引号触发了第二个条目上的MySQL错误!第一个实例可以正常工作,但第二个实例会触发mysql\u错误() 表单中的数据处理方式是否与表单中捕获的数据不同 查询1-此操作没有问题(并且没有转义单个报价) 查询2-输入带有单引号的名称(例如,O'Brien)时失败 您应该使用mysql\u real\u es

我有一个困惑的问题,我似乎无法理解

我有两条SQL语句:

  • 第一种方法是将表单中的信息输入数据库
  • 第二个从上面输入的数据库中获取数据,发送电子邮件,然后记录事务的详细信息
问题是,似乎只有一个引号触发了第二个条目上的MySQL错误!第一个实例可以正常工作,但第二个实例会触发
mysql\u错误()

表单中的数据处理方式是否与表单中捕获的数据不同

查询1-此操作没有问题(并且没有转义单个报价)

查询2-输入带有单引号的名称(例如,O'Brien)时失败


您应该使用
mysql\u real\u escape\u string()
来转义这些字符串(在两个代码段中)

您的两个查询行为不同的原因可能是您启用了
magic\u quotes\u gpc
(您应该知道这是个坏主意)。这意味着从$\u GET、$\u POST和$\u COOKIES收集的字符串将为您转义(即,
“O'Brien”->“O'Brien”


存储数据并随后再次检索数据后,从数据库返回的字符串将不会自动为您转义。您将返回
“O'Brien”
。因此,您需要将其通过mysql\u real\u escape\u string()

您应该这样做以帮助调试

$sql = "insert into blah values ('$myVar')";
echo $sql;
您可能会发现,单引号在工作查询中用反斜杠转义。这可能是PHP通过magic_quotes_gpc设置自动完成的,也可能是您自己在代码的其他部分中完成的(addslashes和stripslashes可能是需要查找的函数)


请看

你有两件事在你的掌控之中

  • 缺少正确的MySQL引用(
    MySQL\u real\u escape\u string()
  • 潜在的自动“魔术报价”-检查您的gpc\U魔术报价设置
  • 嵌入字符串变量,这意味着您必须知道PHP如何正确查找变量

也可能第一个查询的参数中不存在单引号值。毕竟,您的示例是一个专有名称,只有第二个查询似乎处理名称。

我遇到了同样的问题,我这样解决了它:

$text = str_replace("'", "\'", $YourContent);
也许有更好的方法可以做到这一点,但它对我有效,对你也应该有效。

mysql\u real\u escape\u string()或str\u replace()函数将帮助你解决问题


您只需在“mysql\u real\u escape\u string(trim($val))中传递变量(或数据)


其中,
$val
是困扰您的数据。

您可以执行以下逃逸PHP和MySQL的操作

<?
$text = '<a href="javascript:window.open(\\\'http://www.google.com\\\');"></a>';
?> 
因为我们使用PHP来插入MySQL,所以我们需要PHP仍然将反斜杠写入MySQL,以便它也可以对其进行转义。 因此,我们使用反斜杠反斜杠的PHP转义字符和反斜杠撇号来实现这一点

\\\'

对于任何在2015年找到此解决方案并继续前进的人

从PHP5.5.0开始,mysql\u real\u escape\u string()函数已被弃用

见:

警告

从PHP5.5.0开始,此扩展已被弃用,将来将被删除。相反,应该使用MySQLi或PDO_MySQL扩展。有关更多信息,请参见MySQL:选择API指南和相关常见问题解答。此功能的替代方案包括:

mysqli\u real\u escape\u string()


PDO::quote()

是的,好的,谢谢你上了正确编码的课,但是,这并不能回答为什么两个查询不会抛出相同的错误……我不是在寻找如何修复它的答案-我知道如何修复它。我在寻找“为什么”!这不是一个正确编码的问题,而是一个巨大而危险的安全漏洞。话虽如此,我将在我的原始答案中添加一个片段来说明根本问题。我会在这里做,但格式都不可靠。:)@理发师,为什么在那里。这是因为你使用了神奇的引语…有一个更好的方法。。。除此之外的任何一个。说真的,如果你不想让你的数据库得到Bobby Table,就不要这样做。使用PDO(正确的方法)--它会为您解决逃逸问题。使用不推荐的
mysql\u real\u escape\u字符串
偶数(不是正确的方法)!或
addslashes
(不是正确的方式)。除此之外的任何内容。为此,您应该执行一个本机函数。Bobby Table'd:这不应该被否决,因为它没有“错误”mysqli\u real\u escape\u字符串需要两个参数,它需要两个参数says@coolcool1994-我也有这个问题,直到我发现这个问题-。mysqli_**()函数似乎要求第一个参数是mysqli数据库连接变量(我通常将我的名字命名为“$conn”)。@coolcool1994-是的,您需要连接字符串以及转义的内容。对于许多用户来说,这将是
$con
$conn
。。现在说“这个特性从PHP5.3.0开始就被弃用了,从PHP5.4.0开始就被删除了。”。
<?
$text = '<a href="javascript:window.open(\\\'http://www.google.com\\\');"></a>';
?> 
<a href="javascript:window.open('http://www.google.com');"></a>
\'
\\\'