为什么数据没有插入到数据库中?
Why is the data not inserted into the database?
我用下面的代码做了一个注册表单。正如您在图片底部看到的,最后一行是 header("Location: ../signup.php?signup=success");出口();当我尝试注册时,顶部的 url 显示注册=成功。但是当我进入我的数据库时,没有插入数据。
请帮帮我 :( 我检查了 name/variable 的任何拼写错误,但有 none。我还检查了 linking/connections,我相信它是正确的。表单已正确链接到右侧 php 文件,该文件位于此处。
<?php
if(isset($_POST['submit'])) {
include_once 'dbh.inc.php';
$first = $_POST['first'];
$last = $_POST['last'];
$email = $_POST['email'];
$uid = $_POST['uid'];
$pwd = $_POST['pwd'];
if (empty($first) || empty($last) || empty($email) || empty($uid) || empty($pwd)) {
header("Location: ../signup.php?signup=empty"); exit();
}
else {
if (!preg_match("/^[a-zA-z]*$/", $first) || !preg_match("/^[a-zA-z]*$/", $last)) {
header("Location: ../signup.php?signup=flnameinvalid"); exit();
}
else {
if (!filter_var($email, FILTER_VALIDATE_EMAIL)) {
header("Location: ../signup.php?signup=emailinvalid"); exit();
}
else{
$mysql = "SELECT * FROM users WHERE user_uid='uid'";
$result = mysqli_query($conn, $mysql);
$resultCheck = mysqli_num_rows($result);
if ($resultCheck > 0) {
header("Location: ../signup.php?signup=uidtaken"); exit();
}
else {
$hashedPwd = password_hash($pwd, PASSWORD_DEFAULT);
$sql = "INSERT INTO users (user_first, user_last, user_email, user_uid, '$hashedPwd') VALUES (?, ?, ?, ?, ?);";
$stmt = mysqli_stmt_init($conn);
if (!mysqli_stmt_prepare ($stmt, $sql)){
echo "SQL error!";
}
else {
mysqli_stmt_bind_param ($stmt, "sssss", $first, $last, $email, $uid, $hashedPwd);
mysqli_stmt_execute ($stmt);
}
header("Location: ../signup.php?signup=success"); exit();
代码看起来不错,发现一个问题。
替换这一行
mysqli_stmt_bind_param ($stmt, "sssss", $first, $last, $email, $uid, $hashedPwd);
与
mysqli_stmt_bind_param ($stmt, "sssd", $first, $last, $email, $uid, $hashedPwd);
以下是官方文档表格php。你可以检查
official doc with example
$sql = "INSERT INTO users (user_first, user_last, user_email, user_uid, '$hashedPwd')
VALUES (?, ?, ?, ?, ?);";
在您的 SQL 语句中,您将密码的列名称设置为散列密码的值。这将导致 SQL 查询失败。
$sql = "INSERT INTO users (user_first, user_last, user_email,
user_uid, whateverthiscolumnnameis)
VALUES (?, ?, ?, ?, ?);";
您需要此处 table 中的列名称。只需将 whateverthiscolumnnameis
替换为 table.
中密码列的名称
编辑:
正如 Cillian Collens 指出的那样,您确实应该在您进行的其他查询中清理输入 and/or 使用准备好的语句来避免经典 SQL injection attacks.
为什么要在 POST 请求中接受 uid,通常你会根据你的数据库(增量等)自动确定。
老实说,您需要重新编写大量代码,不会有一种解决方案,因为您的代码完全容易受到攻击。
记住只接受你需要的输入,顺便说一下,如果我要编辑我的 UID,除了能够发送我喜欢的任何 UID 之外,我还可以将它变成恶意负载,比如:
10000; DROP TABLE users;
哪个,应该给我 10,000 的 UID 并删除整个 table 用户,所以我只是给自己一个很棒的 UID 并不重要,因为现在整个 table 被删除。也可以通过执行类似 10000; SELECT * FROM users;
之类的操作以这种方式转储整个数据库。不确定这些查询是否特别有效,但它们很容易受到攻击。
我知道这并不能完全回答您的问题,但我建议您重写大部分代码并采用良好做法。
顺便说一句,您很可能会获得该重定向,因为如果您启动初始 isset($_POST['submit']) 然后点击每一个 else 语句,您会得到成功消息。
乍一看我注意到你说你已经更正的错误列名。所以错误大概在这部分:
if (!mysqli_stmt_prepare ($stmt, $sql)){
echo "SQL error!";
} else {
mysqli_stmt_bind_param ($stmt, "sssss", $first, $last, $email, $uid, $hashedPwd);
mysqli_stmt_execute ($stmt);
}
试试这个:
if (mysqli_stmt_prepare ($stmt, $sql)){
mysqli_stmt_bind_param ($stmt, "sssss", $first, $last, $email, $uid, $hashedPwd);
mysqli_stmt_execute ($stmt);
header("Location: ../signup.php?signup=success");
} else {
echo "SQL error!";
}
exit();
我用下面的代码做了一个注册表单。正如您在图片底部看到的,最后一行是 header("Location: ../signup.php?signup=success");出口();当我尝试注册时,顶部的 url 显示注册=成功。但是当我进入我的数据库时,没有插入数据。
请帮帮我 :( 我检查了 name/variable 的任何拼写错误,但有 none。我还检查了 linking/connections,我相信它是正确的。表单已正确链接到右侧 php 文件,该文件位于此处。
<?php
if(isset($_POST['submit'])) {
include_once 'dbh.inc.php';
$first = $_POST['first'];
$last = $_POST['last'];
$email = $_POST['email'];
$uid = $_POST['uid'];
$pwd = $_POST['pwd'];
if (empty($first) || empty($last) || empty($email) || empty($uid) || empty($pwd)) {
header("Location: ../signup.php?signup=empty"); exit();
}
else {
if (!preg_match("/^[a-zA-z]*$/", $first) || !preg_match("/^[a-zA-z]*$/", $last)) {
header("Location: ../signup.php?signup=flnameinvalid"); exit();
}
else {
if (!filter_var($email, FILTER_VALIDATE_EMAIL)) {
header("Location: ../signup.php?signup=emailinvalid"); exit();
}
else{
$mysql = "SELECT * FROM users WHERE user_uid='uid'";
$result = mysqli_query($conn, $mysql);
$resultCheck = mysqli_num_rows($result);
if ($resultCheck > 0) {
header("Location: ../signup.php?signup=uidtaken"); exit();
}
else {
$hashedPwd = password_hash($pwd, PASSWORD_DEFAULT);
$sql = "INSERT INTO users (user_first, user_last, user_email, user_uid, '$hashedPwd') VALUES (?, ?, ?, ?, ?);";
$stmt = mysqli_stmt_init($conn);
if (!mysqli_stmt_prepare ($stmt, $sql)){
echo "SQL error!";
}
else {
mysqli_stmt_bind_param ($stmt, "sssss", $first, $last, $email, $uid, $hashedPwd);
mysqli_stmt_execute ($stmt);
}
header("Location: ../signup.php?signup=success"); exit();
代码看起来不错,发现一个问题。 替换这一行
mysqli_stmt_bind_param ($stmt, "sssss", $first, $last, $email, $uid, $hashedPwd);
与
mysqli_stmt_bind_param ($stmt, "sssd", $first, $last, $email, $uid, $hashedPwd);
以下是官方文档表格php。你可以检查 official doc with example
$sql = "INSERT INTO users (user_first, user_last, user_email, user_uid, '$hashedPwd')
VALUES (?, ?, ?, ?, ?);";
在您的 SQL 语句中,您将密码的列名称设置为散列密码的值。这将导致 SQL 查询失败。
$sql = "INSERT INTO users (user_first, user_last, user_email,
user_uid, whateverthiscolumnnameis)
VALUES (?, ?, ?, ?, ?);";
您需要此处 table 中的列名称。只需将 whateverthiscolumnnameis
替换为 table.
编辑:
正如 Cillian Collens 指出的那样,您确实应该在您进行的其他查询中清理输入 and/or 使用准备好的语句来避免经典 SQL injection attacks.
为什么要在 POST 请求中接受 uid,通常你会根据你的数据库(增量等)自动确定。
老实说,您需要重新编写大量代码,不会有一种解决方案,因为您的代码完全容易受到攻击。
记住只接受你需要的输入,顺便说一下,如果我要编辑我的 UID,除了能够发送我喜欢的任何 UID 之外,我还可以将它变成恶意负载,比如:
10000; DROP TABLE users;
哪个,应该给我 10,000 的 UID 并删除整个 table 用户,所以我只是给自己一个很棒的 UID 并不重要,因为现在整个 table 被删除。也可以通过执行类似 10000; SELECT * FROM users;
之类的操作以这种方式转储整个数据库。不确定这些查询是否特别有效,但它们很容易受到攻击。
我知道这并不能完全回答您的问题,但我建议您重写大部分代码并采用良好做法。
顺便说一句,您很可能会获得该重定向,因为如果您启动初始 isset($_POST['submit']) 然后点击每一个 else 语句,您会得到成功消息。
乍一看我注意到你说你已经更正的错误列名。所以错误大概在这部分:
if (!mysqli_stmt_prepare ($stmt, $sql)){
echo "SQL error!";
} else {
mysqli_stmt_bind_param ($stmt, "sssss", $first, $last, $email, $uid, $hashedPwd);
mysqli_stmt_execute ($stmt);
}
试试这个:
if (mysqli_stmt_prepare ($stmt, $sql)){
mysqli_stmt_bind_param ($stmt, "sssss", $first, $last, $email, $uid, $hashedPwd);
mysqli_stmt_execute ($stmt);
header("Location: ../signup.php?signup=success");
} else {
echo "SQL error!";
}
exit();