现在的问题是,代码无法检查用户名是否已被占用,是否有任何代码可以检查数据库中是否已经使用了用户名?
我正在尝试我的一些代码,然后可能在Stack Overflow中搜索了这个问题。我试过solution,但显然它给了我错误。当我试过它时,警告:
mysql_query()期望参数2是资源,对象是给定的 C:......在线...
和问题
mysql_num_rows()期望参数1为resource,null为null C:......在线...
我实际上是在寻找这个问题的解决方案或教程如何解决这个问题。
我的代码:
// The below JS function written outside app.controller
function sendVerifyEmail(firebaseUser){
firebaseUser.sendEmailVerification();
}
答案 0 :(得分:3)
在你遇到错误的行中,替换" mysql_query" for" mysqli_query"和" mysql_num_rows" for" mysqli_num_rows"。这是因为你不能将mysql调用与mysli连接混合在一起。
答案 1 :(得分:2)
作为如何使用预准备语句的示例,您可以使用以下内容(未经测试的btw)
在原始代码中,您在输出html代码后发送标题 - 这将导致错误,除非您使用输出缓冲,因此我在生成任何html内容之前移动了所有相关的PHP代码,如果有任何错误后输出它们。
我还注意到mysqli
连接的参数没有引用 - 如果这些参数被定义为常量,那就没问题了,否则也会产生错误。
保持mysqli
或pdo
- 因为您可以更好地保护您的网站免受恶意用户的侵害,因为您采用了我试图在此处展示的预备语句。
<?php
require_once("functions.php");
require_once("db-const.php");
session_start();
if (logged_in() == true) {
redirect_to("profile.php");
}
$errors=array();
if( $_SERVER['REQUEST_METHOD'] == 'POST' ) {
if( isset( $_POST['username'], $_POST['password'], $_POST['first_name'], $_POST['last_name'], $_POST['email'] ) ) {
$username = !empty( $_POST['username'] ) ? $_POST['username'] : false;
$mainpass = !empty( $_POST['password'] ) ? $_POST['password'] : false;
$password = !empty( $mainpass ) ? hash('sha256', $mainpass) : false;
$first_name = !empty( $_POST['first_name'] ) ? $_POST['first_name'] : false;
$last_name = !empty( $_POST['last_name'] ) ? $_POST['last_name'] : false;
$email = !empty( $_POST['email'] ) ? $_POST['email'] : false;
if( $username && $password ){
$mysqli = new mysqli( DB_HOST, DB_USER, DB_PASS, DB_NAME );
if( $mysqli->connect_errno ) {
$errors[]=$mysqli->connect_error;
} else {
/* Assume all is ok so far */
$sql='select username from users where username=?';
$stmt=$mysqli->prepare($sql);
$stmt->bind_param('s',$username);
$stmt->execute();
$stmt->bind_result( $found );
$stmt->fetch();
if( !$found ){
/* username is not alreday taken */
$sql='insert into `users` (`username`,`password`,`first_name`,`last_name`,`email`) values (?,?,?,?,?);';
$stmt=$mysqli->prepare( $sql );
$stmt->bind_param('sssss',$username,$password,$first_name,$last_name,$email);
$stmt->execute();
header("Location: checklogin.php?msg=Registered Successfully!");
} else {
/* username is taken */
$errors[]='Sorry, that username is already in use.';
}
}
}
} else {
$errors[]='Please fill in all details';
}
}
?>
<html>
<head>
<title>Prospekt Member Area</title>
</head>
<body>
<h1> Register Here </h1>
<h2>© Kirk Niverba</h2>
<hr />
<!-- The HTML registration form -->
<form action="<?=$_SERVER['PHP_SELF']?>" method="post">
Username: <input type="text" name="username" /><br />
Password: <input type="password" name="password" /><br />
First name: <input type="text" name="first_name" /><br />
Last name: <input type="text" name="last_name" /><br />
Email: <input type="type" name="email" /><br />
<input type="submit" name="submit" value="Register" />
<a href="login.php">Already have an account?</a>
</form>
<?php
if( !empty( $errors ) ){
echo implode( '<br />', $errors );
}
?>
<hr />
</body>
</html>
答案 2 :(得分:1)
可以很容易地使用 mysql唯一约束。
username varchar(50) NOT NULL,
//other fields,
UNIQUE (username)
对于它的php部分,只有当 mysql_num_rows 返回0时,才能使用 mysql_query 选择所需的用户名来验证和发送表单。