在将数据插入MySQL时,PHP中如何转义单引号

19 浏览
0 Comments

在将数据插入MySQL时,PHP中如何转义单引号

这个问题已经在这里得到了回答:

如何在PHP中防止SQL注入?

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

我有两个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')");

查询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')");

admin 更改状态以发布 2023年5月23日
0
0 Comments

对于在2015年以及之后遇到这个问题的人...

mysql_real_escape_string()函数在PHP 5.5.0版本开始已经被弃用。

参考:php.net

警告

这个扩展在PHP 5.5.0版本被弃用,并且将来会被移除。相反,应该使用MySQLi或PDO_MySQL扩展。有关更多信息,请参见MySQL: 选择API指南和相关FAQ。此函数的替代方法包括:

mysqli_real_escape_string()

PDO::quote()

0
0 Comments

你应该使用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()进行转义。

0