I';我正在使用PHP5.6.25并尝试过滤输入,但它只在mysqli中输入一次数据
我尝试了几种过滤方法,当我这样做时,我只能在表中插入一次,id设置为自动递增。 这就是变量的定义方式I';我正在使用PHP5.6.25并尝试过滤输入,但它只在mysqli中输入一次数据,php,mysqli,Php,Mysqli,我尝试了几种过滤方法,当我这样做时,我只能在表中插入一次,id设置为自动递增。 这就是变量的定义方式 <form action = "php/createaccount.php" method = "post"> First Name <br /> <input type ="text" placeholder="First name" name = "fname"><br /> Last Name <br /> <input t
<form action = "php/createaccount.php" method = "post">
First Name <br /> <input type ="text" placeholder="First name" name = "fname"><br />
Last Name <br /> <input type ="text" placeholder="Last name" name = "lname"><br />
User Name <br /> <input type ="text" placeholder="Username" name = "uname"><br />
Password <br /> <input type ="text" placeholder="Password" name = "pword"><br />
School Name <br /> <input type ="text" placeholder="School name" name = "sname"><br />
Email <br /> <input type ="text" placeholder="Email" name = "email"> <br />
<input type = "submit" value = "Create Account">
</form>
名字
姓氏
用户名
密码
学校名称
电子邮件
这是createaccount.php页面
<?php
error_reporting (-1); ini_set ("display_errors", "On");
$con = mysqli_connect("localhost" , "root" , "" , "epicreads");
//check connection
if (mysqli_connect_errno()) {
echo "Failed to connect to MySQL: " . mysqli_connect_error();
}
$sql = $con->prepare("INSERT INTO users (fname, lname, email, uname, sname)
VALUES
(?, ?, ?, ?, ?)");
$sql->bind_param('sssss', $fname, $lname, $email, $uname, $sname);
$sql->execute();
//Password and password security
//Set the cost
$cost = 10;
// Create a random salt
$salt = strtr(base64_encode(mcrypt_create_iv(16, MCRYPT_DEV_URANDOM)), '+', '.');
// Hash the password with the salt
$hash = crypt($pword, $salt);
//Post into table
$pword = "INERT INTO users (pword)
values
('$_POST[pword]')";
//Echo
die('Error: ' . mysqli_error($con));
echo "1 record added";
mysqli_close($con);
?>
您这里有一个输入错误:
//Post into table
$pword = "INERT INTO users (pword)
values
('$_POST[pword]')";
您想用S插入
此外:
您正在散列SQL语句,而不是变量
根据评论中的建议,您应该使用password\u hash
,似乎您有一个cost
数组值,这是password\u hash的典型值,因此您可能从使用它的地方复制/粘贴它,返回并阅读其余语法
不建议使用自己的盐
你的问题在这里:
报告错误时,表示列“fname”不能为空
是因为您试图输入一个空行;上面的密码SQL正在向MySQL中插入密码值,但您可能希望更新现有行,而不是插入一个只有密码的新行
因此,您应该做的是研究password\u hash
,将密码表列的长度编辑为至少72个字符,然后在将其余数据插入表的同时插入密码
如果需要编辑已经存在的行,则应使用MySQL函数
你也有你的
//Echo
die('Error: ' . mysqli_error($con));
将在每次运行脚本时运行,无论是否存在错误或是否拾取了错误。这不是检测面向对象的MySQL错误的方法。有关如何在PHP中检测MySQL错误的详细信息,请参阅
对于变量的来源也没有指导?我假设在他们到达SQL插入之前,您已经在与then合作,但是考虑到您正在研究输入过滤,我看不到任何关于您的问题代码的输入过滤的证据。我希望您没有使用全局变量,通常在提交表单后,可以通过$\u POST['name']
超级全局变量访问为变量发布的变量
永远不要存储纯文本密码!请使用PHP来处理密码安全性。如果您使用的PHP版本低于5.5,则可以使用密码\u hash()
。在散列之前,请确保对它们进行了清理或使用了任何其他清理机制。这样做会更改密码,并导致不必要的额外编码。如果您只能在db中插入一次,则某些操作失败;检查错误。顺便说一句,你从哪里提取这些变量/post数组?我不清楚问题出在哪里。您声称可以成功地插入数据库一次,我只看到执行了一条insert
语句。那么什么不起作用了?@JayBlanchard没有看到变量定义,你怎么能断定OP没有使用哈希呢?我尝试了上面提供的代码,它没有报告错误,也没有输入到表中。还感谢您提供的有用链接使用MySQL错误日志的链接来跟踪错误发生的位置@达米亚诺基夫
//Echo
die('Error: ' . mysqli_error($con));
<?php
error_reporting (-1);
ini_set ("display_errors", "On");
$con = mysqli_connect("localhost" , "root" , "" , "epicreads");
//check connection
if (mysqli_connect_errno()) {
echo "Failed to connect to MySQL: " . mysqli_connect_error();
}
/***
New password construct:
//Password and password security
//Set the cost
***/
$option['cost'] = 10;
$password = password_hash($_POST['pword'], PASSWORD_BCRYPT, $option);
$sql = $con->prepare("INSERT INTO users (fname, lname, email, uname, sname, pword)
VALUES (?, ?, ?, ?, ?,?)");
$sql->bind_param('ssssss', $fname, $lname, $email, $uname, $sname,$password);
$check = $sql->execute();
// execute() can fail for various reasons.
// And may it be as stupid as someone tripping over the network cable
// 2006 "server gone away" is always an option
if ( $check === false ) {
//much better than a die statement:
error_log('execute() failed: ' . htmlspecialchars($sql->error));
}
else {
echo "1 record added";
}
$sql->close();