php和MYSQL INSERT错误

时间:2012-07-14 11:10:58

标签: php mysql

我目前处于不在这行代码中发现任何错误的情况。我正在尝试使用PHP将几个数据添加到mysql数据库。

它得到“您的SQL语法中有错误;请检查与您的MySQL服务器版本对应的手册,以便在第5行使用'','geo''附近的正确语法。”当我尝试使用时出现错误消息注册某人。 “geo”是无线电组元素的值。

<?php
if($_GET["regname"] && $_GET["regemail"] && $_GET["regpass1"] 
   && $_GET["regpass2"]&& $_GET["regfamilyname"] 
   && $_GET["reggivenname"] && $_GET["radioGroup"] )
{
    if($_GET["regpass1"]==$_GET["regpass2"])
    {
       $servername="localhost";
       $database="aaa";
       $username="bbbb";
       $password="cccc";

       $conn=  mysql_connect($servername,$username, $password) 
               or die(mysql_error());
       mysql_select_db($database,$conn);

       $sql="INSERT INTO users (username,password,familyname, 
             email, givenname, is_admin, created_time, category) values 
             ('" . $_GET["regname"] . "', '" .$_GET["regpass"]. "', '" 
             .$_GET["regfamilyname"]. "','" .$_GET["regemail"]. "', '" 
             .$_GET["reggivenname"]. "', '0', NOW()', '" 
             .$_GET["radioGroup"]. "')";

       $result=mysql_query($sql,$conn) or die(mysql_error());          
       print "<h1>You have registered sucessfully</h1>"; 
       print "<a href='index.php'>Go to login page</a>";
    }
    else print "Passwords doesnt match.";
}
    else print"Invalid data;";
?>

2 个答案:

答案 0 :(得分:0)

很难说,因为您没有提供错误消息。

我猜错误就在这里:

$sql="INSERT INTO users (id,username,password,familyname, email, givenname, is_admin, created_time, category) values ('','$_GET["regname"]', '$_GET["regpass"]', '$_GET["regfamilyname"]', '$_GET["regemail"]', '$_GET["reggivenname"]', '0', NOW()', '$radiobutton')";

您正在将空字符串插入id列。尝试修复它,删除id'',还有一些引用相关的问题:

$sql="INSERT INTO users (username,password,familyname, email, givenname, is_admin, created_time, category) values ('".$_GET["regname"]."', '".$_GET["regpass"]."', '".$_GET["regfamilyname"]."', '".$_GET["regemail"]."', '".$_GET["reggivenname"]."', '0', NOW(), '".$radiobutton."')";

这可能无效,因为您已将id定义为int PRIMARY KEY AUTO_INCREMENT

此外,您正在使用旧的mysql_*函数,其方式导致sql inejction漏洞。您可以将PDO用于预处理语句。

<强>更新

答案 1 :(得分:0)

问题是查询会中断,因为'$_GET["regname"]'之类的所有字词都会使用"来破解它。如果您想这样做,可以使用连接:

$sql="INSERT INTO users (username,password,familyname, 
email, givenname, is_admin, created_time, category) values 
('" . $_GET["regname"] . "', '" .$_GET["regpass"]. "', '" .$_GET["regfamilyname"]. "',
  '" .$_GET["regemail"]. "', '" .$_GET["reggivenname"]. "', '0', 
  NOW()', '" . $radiobutton. "')";


但更好的做法是使用PDO.一个例如:

$stmt = $dbh->prepare("INSERT INTO users (username,password,familyname, 
email, givenname, is_admin, created_time, category) values 
(:username,:password,:familyname,:email,:givenname,:is_admin,:created_time,:category)");

$taValues = array(
 'username'   =>  $_GET["regname"],
 'password'   =>  $_GET["regpass"],
 'familyname' =>  $_GET["regfamilyname"],
 'email'      =>  $_GET["regemail"],
 'givenname'  =>  $_GET["reggivenname"],
 'is_admin'   => '0',
 'created_time'  =>  NOW(),
 'category'      =>  $radiobutton
); 

PDOBindArray($stmt,$taValues);

$stmt->execute();