// 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)"是假的?我无法找到代码中的错误。我的数据库包含所有字段,这里可能是语法错误。代码没有给我任何错误,也没有将信息添加到数据库中。
答案 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的值,否则将不会插入并且查询将从那里失败。