在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可能是需要查找的函数)。
你有一些事情在你的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()函数将帮助你解决你的问题。
我有同样的问题,我解决这个问题:
$text=str_replace("'","\'",$YourContent);
可能有更好的方法来做到这一点,但它为我工作,它也应该为你工作。