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