如何在mySQLi中编写注册脚本?

时间:2011-12-31 20:45:19

标签: php mysqli

我正在尝试将我用于在我的网站上注册用户的脚本从SQL转换为SQLi。我有一些代码,并想知道它是否正确。感谢。

$members = new mysqli("localhost", "root", "pass", "members");
$check = $members->prepare("select email from users where email = ?");
$check->bind_param('s', $_POST['r_email']);
$check->execute();
$check->store_result();
if ($check->num_rows > 0) {
echo "user already registered";
} else {
$user_id = mt_rand(100000000, 999999999);
$add_user = $members->prepare("insert into users(email, password, user_id) values(?, ?, ?)");
$add_user->bind_param('ssi', $r_email, $r_password, $user_id);
$r_email = $_POST['r_email'];
$r_password = md5($_POST['r_password']);
$add_user->execute();
$add_user->close();
}
$check->close();
$members->close();

2 个答案:

答案 0 :(得分:0)

在检查mysqli_stmt::store_result之前,您需要致电mysqli_stmt::num_rows(如mysqli_stmt::num-rows所述)。之后,您需要使用mysqli_stmt::closemysqli_stmt::close)关闭语句。

编辑:此外,使用md5进行密码哈希(特别是没有盐)是非常不安全的。请查看https://stackoverflow.com/a/1581919/140827以获取有关更安全解决方案(bcrypt,salt等)的建议

答案 1 :(得分:0)

处理您在评论中记下的错误消息'必须在新的语句准备发生之前获取所有数据'' ...

错误意味着它所说的内容:您在从前一个语句中获取所有数据之前尝试准备一个新语句。从mysqli::use_resultdocs上的手动输入...

  

用于启动从上一个查询中检索结果集   使用数据库上的mysqli_real_query()函数执行   连接。

     

必须调用this或mysqli_store_result()函数   在可以检索查询结果之前,以及其中一个或另一个   必须调用以防止对该数据库连接的下一个查询   从失败。

此外,从mysqli_stmt::num_rowsdocs上的手动输入...

  

返回结果集中的行数。指某东西的用途   mysqli_stmt_num_rows()取决于你是否使用过   mysqli_stmt_store_result()缓冲整个结果集   陈述句柄。