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

我有一个令人困惑的问题,我似乎无法理解…我希望这里有人能够指引我在正确的方向…

我有两个SQL语句: – 第一个从表单中input信息到数据库中。 – 第二个从上面input的数据库中获取数据,发送一封电子邮件,然后logging事务的详细信息

问题是,似乎一个单引号仅在第二个条目触发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('Ymd H:i:s', time())."', '".date('Ymd H:i:s', time())."', '1')"); 

查询#2 – input一个单引号的名字(例如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('Ymd H:i:s', time())."', '$email', '$from', '$row->supplier_id', '$row->primary_email' ,'$row->secondary_email', '$subject', '$message_content', '1')"); 

你应该用mysql_real_escape_string()来转义每个string(在两个片段中mysql_real_escape_string()

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

你的两个查询行为不同的原因可能是因为你有magic_quotes_gpc打开(你应该知道这是一个坏主意)。 这意味着从$ _GET,$ _POST和$ _COOKIES收集到的string会被转义(即"O'Brien" -> "O\'Brien" )。

一旦你存储了数据,然后再次检索,你从数据库中取回的string将不会自动为你转义。 你会回来"O'Brien" 。 所以,你需要通过mysql_real_escape_string()来传递它。

对于任何人在2015年find这个解决scheme,并前进…

mysql_real_escape_string()函数从PHP 5.5.0开始已弃用。

请参阅: php.net

警告

此扩展从PHP 5.5.0开始已被弃用,并将在未来被删除。 应该使用MySQLi或PDO_MySQL扩展。 另请参阅MySQL:select一个API指南和相关的FAQ以获取更多信息。 这个function的替代包括:

mysqli_real_escape_string()

PDO::quote()

你应该这样做来帮助你debugging

 $sql = "insert into blah blah...."; echo $sql; 

您可能会发现单引号在正在运行的查询中反斜杠。 这可能是由php通过magic_quotes_gpc设置自动完成的,也可能是你自己在代码的其他部分完成的(addslashes和stripslashes可能是需要查找的函数)。

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

你有一些事情在你的string战斗。

  • 缺less正确的MySQL引用( mysql_real_escape_string()
  • 潜在的自动'魔术报价' – 检查你的gpc_magic_quotes设置
  • embedded的stringvariables,这意味着你必须知道PHP如何正确地findvariables

单引号值也可能不在第一个查询的参数中。 毕竟,你的例子是一个合适的名字,只有第二个查询似乎是处理名称。

您可以执行以下转义PHP和MySQL。

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

这将反映MySQL为

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

它是如何工作的?

我们知道PHP和MySQL撇号都可以用反斜杠和撇号转义。

 \' 

因为我们使用PHP插入到MySQL中,所以我们需要PHP仍然向MySQL写反斜杠,所以它也可以转义它。 所以我们使用反斜杠的PHP转义字符和反斜杠来实现这​​一点。

 \\\' 

你应该只传递variablesOR数据在“mysql_real_escape_string(trim($ val))”

$ val =这个令你烦恼的数据。

mysql_real_escape_string()或str_replace()函数将帮助你解决你的问题。

http://phptutorial.co.in/php-echo-print/

我有同样的问题,我解决这个问题:

 $text=str_replace("'","\'",$YourContent); 

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