2015-03-19 79 views
0

我有一个简单的调查页面,我试图做。除了在我对调查页面的评论中使用单引号时,一切运行良好。当我对它的单引号发表评论时,数据库查询不会插入到数据库中。MYSQL转义字符串执行

在Googleing之后,我想我必须在将字符串插入到数据库之前将其转义。在插入数据库之前,我使用mysqli_real_escape_string来转义字符串,但这似乎没有帮助。

这里是我的代码,将用户的意见为DB(未显示安全$ CON)

mysqli_real_escape_string($con,$_POST['question_1']); 
    mysqli_real_escape_string($con,$_POST['question_2']); 
    mysqli_real_escape_string($con,$_POST['question_3']); 
    mysqli_real_escape_string($con,$_POST['question_4']); 
    mysqli_real_escape_string($con,$_POST['question_5']); 

    mysqli_query($con, "INSERT INTO feedback (question_1, question_2, question_3, question_4, question_5) VALUES ('$_POST[question_1]', '$_POST[question_2]', '$_POST[question_3]', '$_POST[question_4]', '$_POST[question_5]')"); 

同样,当注释包含一个单引号这只是发生。有什么建议么?我是否错误地脱离了字符串?

+1

处理的变量分配给它第一'$ Q1 = mysqli_real_escape_string($ CON,$ _ POST [ 'question_1']);'然后执行'VALUES(' “$ Q1。” ')'等等,因为你现在在做的是'VALUES'('$ _POST [question_1]','是没有意义的,你也可以使用'stripslashes()',或者使用[prepared statements](http: /www.php.net/manual/en/mysqli.quickstart.prepared-statements.php)并完成它,不需要使用附加函数 – 2015-03-19 03:08:27

+0

我会避免使用'stripslashes()',因为它往往会遗漏一些情况下,事情不是SQL安全的。我从来没有逃脱函数无法返回SQL安全(不要与安全性安全混淆)字符串 – Machavity 2015-03-19 03:30:54

+0

@Machavity条带允许有O'Malley写入数据库确切如图所示,而不是奥马利。 – 2015-03-19 03:32:16

回答

1

你误会了,这里

mysqli_real_escape_string($con,$_POST['question_1']); 

发生此函数返回一个字符串逃脱。然后您在您的SQL中使用此字符串

$question1 = mysqli_real_escape_string($con,$_POST['question_1']); 
//Do your other escapes here 
mysqli_query($con, "INSERT INTO feedback (question_1, question_2, question_3, question_4, question_5) 
    VALUES ('$question1', ...)"); 

此处更好的解决方案是准备语句。这并不要求你逃脱任何东西。数据被分开发送和适当

$prep = mysqli_prepare($con, 'INSERT INTO feedback (question_1, question_2, question_3, question_4, question_5) 
    VALUES (?, ?, ?, ?, ?)'); 
mysqli_stmt_bind_param($prep, "sssss", $_POST['question_1'], $_POST['question_2'], $_POST['question_3'], $_POST['question_4'], $_POST['question_5']); 
mysqli_stmt_execute($prep); 
+0

我之前对mysqli_real_escape_string的理解是,它会更新作为参数给出的变量。谢谢你纠正这一点。现在一切正常,但我将不得不考虑mysqli_prepare,因为这听起来像是一种更好的方式,以更少的代码行完成相同的任务。 – blazerunner44 2015-03-19 03:32:56