Php 为什么数据没有插入数据库?
我用下面的代码做了一个注册表格。如图底部所示,最后一行显示headerLocation:../signup.php?signup=success;出口当我尝试注册时,顶部的url显示signup=success。但是当我进入数据库时,数据没有被插入 请帮助我:我检查了名称/变量的拼写错误,但没有。我还检查了链接/连接,我相信它是正确的。表单正确链接到正确的php文件,如下所示Php 为什么数据没有插入数据库?,php,mysql,mysqli,wamp,Php,Mysql,Mysqli,Wamp,我用下面的代码做了一个注册表格。如图底部所示,最后一行显示headerLocation:../signup.php?signup=success;出口当我尝试注册时,顶部的url显示signup=success。但是当我进入数据库时,数据没有被插入 请帮助我:我检查了名称/变量的拼写错误,但没有。我还检查了链接/连接,我相信它是正确的。表单正确链接到正确的php文件,如下所示 <?php if(isset($_POST['submit'])) { include_once 'd
<?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);
与
下面是php的官方文档表单。你可以查一下
在SQL语句中,密码的列名设置为哈希密码的值。这将导致SQL查询失败
$sql = "INSERT INTO users (user_first, user_last, user_email,
user_uid, whateverthiscolumnnameis)
VALUES (?, ?, ?, ?, ?);";
您需要在此处输入表中列的名称。只需用表中密码列的名称替换WhateVerthisColumnName即可
编辑:
正如Cillian Collens指出的那样,您确实应该清理您在其他查询中的输入和/或使用准备好的语句来避开经典的为什么在POST请求中接受uid,通常您会根据数据库增量自动确定,等等 老实说,您需要重新编写大量代码,因为您的代码完全易受攻击,所以不会有一个解决方案 记住只接受您需要的输入,顺便说一句,如果我要编辑我的UID,除了可以发送任何我喜欢的UID外,我还可以将其作为恶意负载,如:
10000; DROP TABLE users;
这应该给我10000个UID,并且删除整个用户表,所以我给自己一个很棒的UID并不重要,因为现在整个表都被删除了。也可以通过执行类似10000的操作,以这种方式转储整个数据库;从用户中选择*;不确定这些查询是否特别有效,但它们很容易受到攻击
我知道这并不能完全回答您的问题,但我建议您重新编写大部分代码并使用良好的实践
顺便说一句,你很可能得到了重定向,因为如果你启动初始的isset$\u 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();
请在问题中以文本形式发布您的代码,为什么要将哈希密码作为列名发布?@FedericoklezCulloca,对此表示抱歉。我已经更改了,你能帮我吗?添加signup.php中的代码只是指出,即使$hashedPwd包含列名,也不能在列名周围使用单引号。您需要改为使用反勾号。sssd中没有足够的字符来说明所有参数。是否签入正式文档?我发现sssd有5个参数$first、$last、$email、$uid、$hashedPwd,但您只为变量类型提供了4个字符的sssd。仅供参考,不是我做了否决投票。“我不会为这么一个小小的错误去做的。”勒诺沃根诺维亚很高兴知道!如果某个答案对你有效,请将其标记为已接受,以便阅读该问题的其他人知道你的问题已成功回答。为欢呼声干杯。“我不喜欢在回答中大肆宣扬安全性,因为这不是他所期望的答案,但我觉得为了减轻SQL注入攻击,必须注意这点。”CillianCollins同意。安全是我们大家都应该高度关注的事情是的,我认为当人们学习语言,特别是像PHP这样的语言时,养成使用良好安全实践的习惯是很重要的。顺便说一句,mysqli_查询不允许在一个查询中使用多个语句,因此我发布的示例可能不起作用,具体取决于MySQL的版本,但这并不意味着不可能使用其他攻击手段。您仍然可以使用更复杂的负载转储数据库。@JustinPearce,我不明白。我刚开始学这个。我想我已经用我发布的代码使用了准备好的语句。我只是按照youtube教程播放列表上的一些说明来保护我的数据库不受sql注入的影响。我把它命名为user_uid,但实际上是为了获取用户名。对不起,这让人很困惑。但是非常感谢!我从你说的话中学到了一些东西:啊,你向他们请求用户名是有道理的,我假设你接受MySQL表中主键的POST输入,这是一种不好的做法,因为如果是这样的话,它将不是唯一的标识符。无论如何,您仍然需要对其进行消毒,请随时将经过消毒的代码发送给我,我会查看它是否易受攻击。
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();