我有一个我似乎无法理解的复杂问题……

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

当前回答

您应该执行类似的操作来帮助调试

$sql = "insert into blah values ('$myVar')";
echo $sql;

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

参见神奇语录

其他回答

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

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

也许有更好的方法,但它对我有用,对你也应该有用。

对于任何在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:报价()

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

你应该在“mysql_real_escape_string(trim($val))”中传递变量(或数据)

其中$val是困扰您的数据。

Mysql_real_escape_string()或str_replace()函数将帮助您解决您的问题。

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