PHP mysql无法插入数据

时间:2016-09-27 11:12:34

标签: php mysql

enter image description here

// Do not put any echo code other than the last line.

// didnt include $con in the post.
    $userlvlid            = $_POST["userlvlid"]; 
    $username             = $_POST["username"];
    $password             = $_POST["password"];
    $lname                = $_POST["lname"];
    $fname                = $_POST["fname"];
    $mname                = $_POST["mname"];
    $birthdate            = $_POST["birthdate"];
    $streename            = $_POST["streetname"];
    $province             = $_POST["province"];
    $city                 = $_POST["city"];
    $barangay             = $_POST["barangay"];

    $organization_name    = $_POST["orgname"];
    $email_address        = $_POST["email_address"];
    $license              = $_POST["license"];


    if (!$con) {
    die("Connection failed: " . mysqli_connect_error());
    }
    else{
      // means connection successful.
     echo "sucess";
    }


    $response = array();
    $response["success"] = false;  


    $sql = "SELECT * FROM users WHERE username = '$username'  ";
    $result = $con->query($sql);
    if ($result->num_rows > 0) {
      // means username already exists.
    }

    else {
           $passwordHash = password_hash($password, PASSWORD_DEFAULT);
    $sql = "INSERT INTO accounts (`userlvlid`,
                                  `username`,
                                  `password`,
                                  `lname`,
                                  `fname`,
                                  `mname`,
                                  `birthdate`,
                                  `streetname`,
                                  `region`,
                                  `province`,
                                  `city`,
                                  `barangay`,
                                  `orgname`,
                                  `email`,
                                  `license`)

               VALUES  
                                   ('$userlvlid',
                                    '$username',
                                    '$password',
                                    '$lname',
                                    '$fname',
                                    '$mname',
                                    '$birthdate'
                                    '$streetname', 
                                    '$region',
                                    '$province',
                                    '$city',
                                    '$barangay',
                                    '$organization_name',
                                    '$email_address',
                                    '$license')";


        if (mysqli_query($con, $sql)) {

        $response["success"] = true;  
           } 

           else {

           }       


        }


        }

    echo json_encode($response);
?>

有人可以解释为什么" mysqli_query($ con,$ sql)"是假的?我无法找到代码中的错误。我的数据库包含所有字段,这里可能是语法错误。代码没有给我任何错误,也没有将信息添加到数据库中。

2 个答案:

答案 0 :(得分:1)

一些事情,首先不需要这部分:

$sql = "SELECT * FROM users WHERE username = '$username'  ";
$result = $con->query($sql);
if ($result->num_rows > 0) {
  // means username already exists.
}

为什么呢?因为在检查用户存在的时间和插入新记录的时间之间,另一个客户端可能会创建具有相同用户名的用户。所以你的第二个查询如果发生插入就会失败(前提是你的用户名上有一个唯一的索引)。

其次,你没有逃避参数。这使您对SQL注入攻击持开放态度。并且它还可能导致格式错误的查询无法正确执行 - 未插入结果数据。请改用预备语句。

$sql = mysqli_prepare($con,"INSERT INTO accounts (`userlvlid`,
                              `username`,
                              `password`,
                              `lname`,
                              `fname`,
                              `mname`,
                              `birthdate`,
                              `streetname`,
                              `region`,
                              `province`,
                              `city`,
                              `barangay`,
                              `orgname`,
                              `email`,
                              `license`)

           VALUES  
                               (?,?,?,?,?,?,?,?,?...)";

然后你需要绑定参数

mysqli_bind_params($stmt,('$userlvlid',"ssssssssssssss",
                                $userlvlid
                                $username,
                                $password,
                                $lname,
                                $fname,
                                $mname,
                                $birthdate,
                                $streetname, 
                                $region,
                                $province,
                                $city,
                                $barangay,
                                $organization_name,
                                $email_address,
                                $license));
丑陋不是吗?这就是为什么人们应该使用PDO而不是mysqli,但是使用mysqli而没有准备好的语句是非常可怕的,所以我们不得不勉强通过这个。

现在,在浏览此复制粘贴时,我发现了问题的真正原因

                                '$mname',
                                '$birthdate' /*** no comma here ***/
                                '$streetname', 

答案 1 :(得分:0)

尝试对$sql使用echo,并在该语句后面放置退出。这样它就会破坏查询执行。

通过执行此操作,您可以查找查询中是否存在任何错误,您可以对其进行纠正。

  

注意:首先将echo放入Insert语句,然后通过放置退出来中断执行;然后复制回显的语句并将其放在DB的SQL中,然后检查插入中是否发生错误。如果没有错误发生,请删除echo并删除退出;

如果您有任何表列不匹配或数据差异,您可以借助此回显查询进行纠正。

确保提供与数据库中给出的值匹配的值。

  

**注意:**(例如)if userlvlid - varchar(11) - 如果输入大于11的值,则应提供等于11或小于11的值,否则将不会插入并且查询将从那里失败。