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

sjw*_*sjw 181 php mysql escaping insert

我有一个令人困惑的问题,我似乎无法理解......我希望有人能指出我正确的方向......

我有两个SQL语句: - 第一个将表单中的信息输入数据库. - 第二个从上面输入的数据库中获取数据,发送电子邮件,然后记录交易的详细信息

问题是看起来单引号只在第二个条目上触发MySQL错误!第一个实例没有问题,但第二个实例触发了mysql_error().

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

查询#1 - 这没有问题(并且没有转义单引号)

$result = mysql_query("INSERT INTO job_log
(order_id, supplier_id, category_id, service_id, qty_ordered, customer_id, user_id, salesperson_ref, booking_ref, booking_name, address, suburb, postcode, state_id, region_id, email, phone, phone2, mobile, delivery_date, stock_taken, special_instructions, cost_price, cost_price_gst, sell_price, sell_price_gst, ext_sell_price, retail_customer, created, modified, log_status_id)
VALUES
('$order_id', '$supplier_id', '$category_id', '{$value['id']}', '{$value['qty']}', '$customer_id', '$user_id', '$salesperson_ref', '$booking_ref', '$booking_name', '$address', '$suburb', '$postcode', '$state_id', '$region_id', '$email', '$phone', '$phone2', '$mobile', STR_TO_DATE('$delivery_date', '%d/%m/%Y'), '$stock_taken', '$special_instructions', '$cost_price', '$cost_price_gst', '$sell_price', '$sell_price_gst', '$ext_sell_price', '$retail_customer', '".date('Y-m-d H:i:s', time())."', '".date('Y-m-d H:i:s', time())."', '1')");
Run Code Online (Sandbox Code Playgroud)

查询#2 - 输入带单引号的名称时失败(即O'Brien)

$query = mysql_query("INSERT INTO message_log
(order_id, timestamp, message_type, email_from, supplier_id, primary_contact, secondary_contact, subject, message_content, status)
VALUES
('$order_id', '".date('Y-m-d H:i:s', time())."', '$email', '$from', '$row->supplier_id', '$row->primary_email' ,'$row->secondary_email', '$subject', '$message_content', '1')");
Run Code Online (Sandbox Code Playgroud)

awg*_*wgy 132

你应该使用转义每个字符串(在两个片段中)mysql_real_escape_string().

http://us3.php.net/mysql-real-escape-string

你的两个查询表现不同的原因很可能是因为你已经magic_quotes_gpc打开了(你应该知道这是一个坏主意).这意味着从$ _GET,$ _POST和$ _COOKIES收集的字符串将为您转义(即"O'Brien" -> "O\'Brien").

存储数据并随后再次检索数据后,您从数据库中返回的字符串将不会自动为您转义.你会回来的"O'Brien".所以,你需要通过它mysql_real_escape_string().

  • [Function * mysql_real_escape_string()*在PHP 5.5.0中已弃用,而在PHP 7.0.0中已删除] [https://www.php.net/manual/zh/function.mysql-real-escape-string.php) 。 (2认同)

Amy*_*bie 52

对于在2015年找到这个解决方案并向前发展的任何人

mysql_real_escape_string()自PHP 5.5.0起,该函数已弃用.

请参阅:php.net

警告

自PHP 5.5.0起,此扩展已弃用,将来将被删除.相反,应该使用MySQLi或PDO_MySQL扩展.另请参阅MySQL:选择API指南和相关的常见问题解答以获取更多信息.该功能的替代方案包括:

mysqli_real_escape_string()

PDO::quote()

  • mysqli_real_escape_string需要2个参数 (2认同)

sta*_*san 16

你的角色里有几件事情在争吵.

  • 缺少正确的MySQL引用(mysql_real_escape_string())
  • 潜在的自动'魔术引用' - 检查你的gpc_magic_quotes设置
  • 嵌入式字符串变量,这意味着您必须知道PHP如何正确地找到变量

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


goa*_*oat 15

你应该做这样的事情来帮助你调试

$sql = "insert into blah values ('$myVar')";
echo $sql;
Run Code Online (Sandbox Code Playgroud)

您可能会发现单引号在工作查询中使用反斜杠进行转义.这可能是由php通过magic_quotes_gpc设置自动完成的,或者你可能是在代码的其他部分自己完成的(addslashes和stripslashes可能是要查找的函数).

http://php.net/manual/en/security.magicquotes.php


小智 15

您可以执行以下操作,从而逃避PHP和MySQL.

<?
$text = '<a href="javascript:window.open(\\\'http://www.google.com\\\');"></a>';
?> 
Run Code Online (Sandbox Code Playgroud)

这将反映MySQL为

<a href="javascript:window.open('http://www.google.com');"></a>
Run Code Online (Sandbox Code Playgroud)

它是如何工作的?

我们知道PHP和MySQL撇号都可以使用反斜杠然后撇号进行转义.

\'
Run Code Online (Sandbox Code Playgroud)

因为我们使用PHP插入MySQL,我们需要PHP仍然将反斜杠写入MySQL,因此它也可以逃脱它.所以我们使用反斜杠反斜杠的PHP转义字符和反斜杠撇号来实现这一点.

\\\'
Run Code Online (Sandbox Code Playgroud)


小智 11

你应该只在"mysql_real_escape_string(trim($ val))"中传递变量OR数据

其中$ val =困扰你的数据.


小智 10

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

$text = str_replace("'", "\'", $YourContent);
Run Code Online (Sandbox Code Playgroud)

可能有更好的方法来做到这一点,但它对我有用,也应该对你有用。

  • 有一种更好的方法……除此之外的任何其他方法。说真的,如果你不想让你的数据库得到 Bobby Table,就不要这样做。使用 PDO(正确的方式)——它会为你转义。甚至使用不推荐使用的`mysql_real_escape_string`(不是正确的方法)!或者`addslashes`(不是正确的方式)。除此之外的任何事情。 (3认同)