首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >插入到MySQL时在PHP中转义单引号

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

Stack Overflow用户
提问于 2010-04-22 10:25:33
回答 8查看 232.4K关注 0票数 216

我有一个令人困惑的问题,我似乎不能理解...

我有两条SQL语句:

  • 首先将表单中的信息输入到数据库中。
  • 第二个从上面输入的数据库中提取数据,发送电子邮件,然后记录transaction

的详细信息

问题是,单个引号似乎只在第二个条目上触发了MySQL错误!第一个实例可以正常工作,但第二个实例会触发mysql_error()

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

查询1-没有问题地工作(并且没有转义单引号)

代码语言:javascript
复制
$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')");

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

代码语言:javascript
复制
$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')");
EN

回答 8

Stack Overflow用户

回答已采纳

发布于 2010-04-22 10:32:36

您应该使用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()传递它。

票数 154
EN

Stack Overflow用户

发布于 2015-03-12 20:36:32

对于任何在2015年找到这个解决方案并继续前进的人来说...

从PHP5.5.0开始,不推荐使用mysql_real_escape_string()函数。

请参阅:php.net

警告

此扩展从PHP 5.5.0起已弃用,并将在将来删除。相反,应该使用MySQLi或PDO_MySQL扩展。有关更多信息,请参阅MySQL:选择应用程序接口指南和相关常见问题解答。此函数的替代方法包括:

mysqli_real_escape_string()

PDO::quote()

票数 67
EN

Stack Overflow用户

发布于 2010-04-22 11:10:59

您应该这样做,以帮助您调试

代码语言:javascript
复制
$sql = "insert into blah values ('$myVar')";
echo $sql;

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

请参阅

票数 21
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2687866

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档