php mysql单引号_插入MySQL时,在PHP中转义单引号
本问题已经有最佳答案,请猛点这里访问。
我有一个令人费解的问题,我似乎无法理解…我希望这里的人能给我指明正确的方向…
我有两个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')");
您应该使用mysql_real_escape_string()转义这些字符串中的每一个(在这两个片段中)。
http://us3.php.net/mysql-real-escape-string
您的两个查询行为不同的原因可能是您打开了magic_quotes_gpc(您应该知道这是一个坏主意)。这意味着从$GET、$U POST和$U cookies收集的字符串将为您转义(即,"O'Brien" ->"O\'Brien")。
一旦您存储了数据,然后再次检索它,从数据库返回的字符串将不会自动为您转义。你会回来的。所以,你需要通过mysql_real_escape_string()。
是的,好吧,谢谢你的正确编码课,但是,这并不能回答为什么两个查询不抛出相同的错误…
我不是在寻找如何修复它的答案-我知道如何修复它。我在找"为什么"!
这不是一个正确的编码问题,而是一个巨大而危险的安全漏洞。也就是说,我将在原始答案中添加一个片段,以说明底层问题。我会在这里做,但是格式会很不稳定。:)
@理发师,为什么在那里。这是因为你用的是魔法语录。
感谢更新awgy-现在灯完全亮了…现在我明白了…
在另一个问题上,你能告诉我你的评论背后的"为什么"吗"魔幻语录是个坏主意"-我是一个爱好编码者,所以没有正式的培训,只是玩弄IT建设个人网站…我甚至不知道它是否打开,直到你评论,我甚至不知道它存在或它做了什么!
不用太担心-我已经找到了与使用它和使用它的实践有关的信息…
我关于避免使用magic_quotes_gpc的理由基本上是,它是一种错误的安全感。您不能在运行时更改设置,因此您需要在配置中启用该设置(在某些安装中,例如某些宿主提供程序,将超出您的控制)。当您忘记必须对其他非GPC数据进行转义(这是这个问题的关键)时,它会导致错误。该特性本身在php 5.3中已被弃用,将在6.0中删除。关于它还有很多其他的看法,但这些是我的主要想法。很高兴听到这些答案。干杯!
对于任何在2015年找到这个解决方案并继续前进的人…
从php 5.5.0开始,不推荐使用mysql_real_escape_string()函数。
参见:PHP.NET
警告
该扩展自php 5.5.0起已被弃用,将来将被删除。相反,应该使用mysqli或pdo-mysql扩展。另请参见MySQL:选择API指南和相关常见问题解答以了解更多信息。此功能的替代方案包括:
mysqli_real_escape_string()
PDO::quote()
mysqli_real_escape_字符串需要2个参数
@CoolCool1994——我也有这个问题,直到我发现这个问题——stackoverflow.com/questions/25636975/…。似乎mysqli_**()函数需要第一个参数作为mysqli数据库连接变量(我通常将我的名称命名为"$conn")。
@CoolCool1994-是的,你需要你的连接字符串以及你要逃离的东西。对于许多用户来说,这将是$con或$conn。
您可以执行以下操作,这将同时避开php和mysql。
$text = '';
?>
这将反映mysql为
它是如何工作的?
我们知道php和mysql的撇号都可以用反斜杠转义,然后用撇号转义。
\'
因为我们使用php来插入mysql,所以我们需要php仍然将反斜杠写到mysql中,这样它也可以逃脱它。所以我们使用反斜杠反斜杠的php转义字符和反斜杠撇号来实现这一点。
\\'
你有两件事要处理。
缺乏正确的mysql引用(mysql_real_escape_string())
潜在的自动"magic quote"--检查您的gpc_magic_quotes设置
嵌入式字符串变量,这意味着您必须知道php如何正确地查找变量
也可能第一个查询的参数中不存在单引号。毕竟,您的示例是一个正确的名称,只有第二个查询似乎在处理名称。
您应该这样做以帮助调试
$sql ="insert into blah blah....";
echo $sql;
您可能会发现单引号在工作查询中是用反斜杠转义的。这可能是由php通过magic_quotes_gpc设置自动完成的,也可能是您自己在代码的其他部分完成的(addslashes和stripslashes可能是要查找的函数)。
见http://php.net/manual/en/security.magicQuotes.php
您应该只传递"mysql-real-escape-string(trim($val))"中的变量或数据。
其中$val=困扰您的数据。
mysql_real_escape_string()或str_replace()函数将帮助您解决问题。
http://phpturial.co.in/php-echo-print/
我也有同样的问题,我是这样解决的:
$text=str_replace("'","\'",$YourContent);
也许有更好的方法可以做到这一点,但这对我很有用,而且对你也很有用。
有更好的方法…除此之外的任何一个。说真的,如果你不想让你的数据库得到Bobby表,就不要这样做。使用PDO(正确的方法)——它可以帮你逃走。使用不推荐使用的mysql_real_escape_string偶数(不是正确的方法)!或者是addslashes(不是正确的方式)。除了这个。
为此,您应该执行本机函数。
本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!
