我已经在 Google 上搜索了 2 周,但没有找到任何结果。我只想知道如何检查给定的用户名是否存在于我的 MySQL 数据库表中。表名是用户。但它似乎绕过了我的 if 语句,并且继续添加用户名,导致我的表具有相同用户名的重复项。我尝试了很多代码和很多方法。一直在使用 Mysqli,因为那是我们现在应该使用的。我可以为您提供我尝试过的任何方法,但这是我第 100 次再次尝试的最新方法。请注意,我知道这还没有完全准备好防御 SQL 注入(inject),我现在还不担心。我只是想让这个东西先工作,然后我会添加安全性。 另一个要注意的是,我的数据库登录信息存储在一个名为“credentials.php”的单独 php 文件中。 先谢谢了。代码:
<?php
$password1 = ($_POST['pass1']);
$password2 = ($_POST['pass2']);
$firstname = ($_POST['fname']);
$lastname = ($_POST['lname']);
$username = ($_POST['user']);
$email = ($_POST['email']);
/*
include_once 'credentials.php';
$dbhandle = new mysqli($db_hostname, $db_username, $db_password, $db_database);
*/
// Check if any fields are empty
if (empty($_POST['fname']) or empty($_POST['lname']) or empty($_POST['user']) or empty($_POST['email']) or empty($_POST['pass1']) or empty($_POST['pass2'])){
?>
<div class="ERRORBOX">
<?php
// Empty Fields ERROR
echo "You must enter data into ALL of the fields to register. Please try again.";
header( "refresh:5;url=../index.php" );
?>
<p>You will be redirected in <span id="counter">5</span> second(s).</p>
<script type="text/javascript">
function countdown() {
var i = document.getElementById('counter');
if (parseInt(i.innerHTML)<=0) {
location.href = 'login.php';
}
i.innerHTML = parseInt(i.innerHTML)-1;
}
setInterval(function(){ countdown(); },1000);
</script>
</div>
<?php
} else {
// Check if passwords match
if ($password1 !== $password2) {
?>
<div class="ERRORBOX">
<?php
// Password mismatch ERROR
echo "You entered two different passwords! Please try again.";
header( "refresh:5;url=../index.php" );
?>
<p>You will be redirected in <span id="counter">5</span> second(s).</p>
<script type="text/javascript">
function countdown() {
var i = document.getElementById('counter');
if (parseInt(i.innerHTML)<=0) {
location.href = 'login.php';
}
i.innerHTML = parseInt(i.innerHTML)-1;
}
setInterval(function(){ countdown(); },1000);
</script>
</div>
<?php
} else {
// Create connection
include_once 'credentials.php';
$conn = new mysqli($db_hostname, $db_username, $db_password, $db_database);
// Check connection
if ($conn->connect_error) {
die("Connection failed: " . $conn->connect_error);
}
// Check if username exists <<<THIS IS WHERE I AM HAVING TROUBLE<<<<<
$username = ($_POST['user']);
$query = mysqli_query("SELECT * FROM users WHERE username='$username'");
if(mysqli_num_rows($query) > 0){
echo "That username already exists.";
$conn->close();
}
else{
//IT JUST SKIPS THE CODE ABOVE AND GOES STRAIGHT TO THE ONE BELOW
$firstname = ($_POST['fname']);
$lastname = ($_POST['lname']);
$username = ($_POST['user']);
$email = ($_POST['email']);
$password = ($_POST['pass1']);
$ipaddress = $_SERVER['REMOTE_ADDR'];
// Create connection
include_once 'credentials.php';
$conn = new mysqli($db_hostname, $db_username, $db_password, $db_database);
// Check connection
if ($conn->connect_error) {
die("Connection failed: " . $conn->connect_error);
$sql = "INSERT INTO users (`id`, `username`, `password`, `sign_up_date`, `email`, `email_activation`, `permit`, `status`, `first_name`, `last_name`, `dob`, `ipv4`) VALUES (NULL, '$username', '$password', NOW(), '$email', '0', 'c', 'a', '$firstname', '$lastname', '1985-01-01', '$ipaddress')";
if ($conn->query($sql) === TRUE) {
header('Location: ../success.php');
} else {
echo "Error: " . $sql . "<br>" . $conn->error;
}
$conn->close();
}
}
}
}
?>
最佳答案
首先,当您希望数据库表中某行的值只出现一次时,您需要将该列指定为UNIQUE
。因此,首先像这样更改 users
表:
ALTER TABLE users CHANGE COLUMN username username VARCHAR(255) NOT NULL UNIQUE;
完成后,如果您的脚本试图在数据库中插入包含已使用用户名的行,则该行不会插入,您也不会有重复项。但这还不够,您需要一种方法来通知用户他们想要的用户名已被使用,因此这就是您的 PHP 脚本的用武之地。
您的脚本不工作,因为您在没有数据库连接对象的情况下调用 mysqli_query
。
有两种方法可以调用mysql_query
:
- 使用程序风格:
mysqli_query($conn, "SELECT * FROM users WHERE username='$username'");
- 采用 OOP 风格:
$conn->query("SELECT * FROM users WHERE username='$username'");
您以过程化的方式调用 mysqli_query
而没有给它一个连接对象。将其更改为上述之一,它将起作用
关于php - 网站和数据库 : Check if username exists,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37650792/