2014-12-04 49 views
-1

我想做一个注册表单,但sql查询只是不会工作..试图添加的内容和删除它们,添加(')标志插入的数据,并删除它们..没有任何作品!我不确定我的错误在哪里......有人可以帮忙吗?MySQL查询错误 - 隐藏错误?

PHP代码:

 $mysqli = new mysqli('localhost','root','','wisdom') or die("CONNECTION ERROR"); 

    $query = "INSERT INTO net_users VALUES (NULL,'$fname','$mname','$lname','$dob','$uname','$pasw','$phone1','$phone2','$email',NULL,NULL,NULL,'$date');"; 

     if($mysqli->query($query)) echo "REGISTERED"; 
     else echo "<br><br>FAILED: ".$mysqli->error; 

ERROR:

FAILED: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '123456789,987654321,[email protected],NULL,NULL,NULL,14/12/04)' at line 1 

数据($ _POST):

Array ( 
[fname] => A //$fname 
[mname] => A //$mname 
[lname] => A //$lname 
[dob] => 2014-07-17 //$dob 
[username] => bakriawad //$uname 
[password] => horray  //$passw 
[cpassword] => horray 
[email] => [email protected]   //$email 
[phone1] => 123456789 //$phone1 
[phone2] => 987654321 //$phone2 
[botchk] => 
[tos] => on) 

// $日期=日期( “年/月/ d” );

我确保数据匹配行数据类型...我试着改变和重写代码多次...没有任何作品!它只是卡在那里!

--------------------------------------------- ------------------------------------------ \

EDIT 服务器被冻结(或什么..),重新启动后它接受输入..抱歉的麻烦..但工作6小时后,你很难直接思考...即使sql不断变化,错误永远不会改变,那是一个明确的标志。

+1

** WARNING **:当使用'mysqli'你应该使用参数化查询,而['bind_param'(http://php.net/manual/en/mysqli-stmt.bind-param。 PHP)将用户数据添加到您的查询。 **不要**使用字符串插值来实现这一点,因为你会产生严重[SQL注入漏洞(http://bobby-tables.com/)。在你解决这个问题之前,这些代码都不会一直工作。 – tadman 2014-12-04 18:39:16

+0

有趣的是,这也会解决他目前遇到的问题。 – 2014-12-05 04:25:59

回答

0

您应该用单引号括住这些值。尝试将单引号添加到您的值。

$query = "INSERT INTO net_users VALUES (NULL,'$fname','$mname','$lname','$dob','$uname','$pasw','$phone1','$phone2','$email',NULL,NULL,NULL,'$date');"; 

您也有一个sqlinjection attack风险。建议您改为使用bind_param()

+0

我试过......没有工作!它正在与我搞砸!我知道,它不接受它,除非它被(')包围,但如果你看错误,它不显示错误的开始......为什么? – bakriawad 2014-12-04 18:36:55

+0

其实它只是工作....这使我疯了..我试图加入他们3次现在..每次它给了我一个错误。我认为生病要洗澡,谢谢。 – bakriawad 2014-12-04 18:40:07

+0

这不是任何延伸的解决方案,这只是挖一个更深的洞。 – tadman 2014-12-04 18:40:43

2

两件事;一个很糟糕,另一个很糟糕。

  1. 你忘记在字符串值中加引号,所以SQL表达式不是一个写得很好的表达式。
  2. 您首先遇到了SQL注入攻击风险。 Please read this看看它是什么以及如何预防它。
+0

如果遵守#2,#1是无关紧要的。 – tadman 2014-12-04 18:40:15

+0

我知道这两个...它没有插入,所以尝试尽量减少代码..我试着用报价3次,但它从来没有工作......但现在“出于某种原因”它的工作..我刚刚重新启动我的个人电脑,它开始回应罚款..那些是我花了3个小时试图解决这个问题 - 谢谢 – bakriawad 2014-12-04 18:42:03

2

您不能只将您的变量连接到SQL查询字符串,并期望它工作。您需要在字符串值附加引号,并确保每个字符都被正确格式化/转义。

$query = "INSERT INTO net_users VALUES (NULL,'$fname','$mname','$lname','$dob','$uname','$pasw','$phone1','$phone2','$email',NULL,NULL,NULL,'$date');"; 

虽然,我不建议做这种方式。如果您将用户输入连接到SQL查询中,您刚刚打开了SQL注入的大门。你想要做的是使用“准备好的陈述”。你要做的是将?添加到你想要变量去的查询中。然后这些变量被传递给一个单独的函数。没有引用,没有转义,没有SQL注入的担忧。

$mysqli = new mysqli('localhost','root','','wisdom') or die("CONNECTION ERROR"); 
$query = $mysqli->prepare('INSERT INTO net_users VALUES (NULL,?,?,?,?,?,?,?,?,?,NULL,NULL,NULL,?)'); 

// No quoting or escaping needed, this passes the values separate from the query 
$query->bind_param('ssssssssss', $fname, $mname, $lname, $dob, $uname, $pasw, $phone1, $phone2, $email, $date); 

// This actually runs the query 
$query->execute(); 
+1

绝对是永久解决这个问题的正确方法。 – tadman 2014-12-04 18:41:08

+0

我知道real_escape_string,但这是一个奇怪的..我看到它的其他地方,但现在它吸引了我的眼睛!你能给我这个方法的名称(或链接),所以我可以更详细地阅读它吗? – bakriawad 2014-12-04 18:48:09

+0

你不应该再使用'real_escape_string'。我正在使用的是所谓的“准备好的陈述”。看看这个:http://php.net/manual/en/mysqli.quickstart.prepared-statements.php另见http://php.net/manual/en/mysqli.prepare.php和http:// php .net/manual/en/mysqli-stmt.bind-param.php – 2014-12-04 18:50:54