我正在尝试验证来自3个不同表的用户名,因为我有3种类型的用户只有一个登录表单。没问题,它运作正常。但问题是如果用户名是从其他表中存在的话。因此,如果用户名已存在,我必须使用INNER JOIN来验证3个表。
以下是验证用户INNER JOIN的用户名到admin和staff表的代码。
<?php
if(isset($_POST["username"]))
{
if(!isset($_SERVER['HTTP_X_REQUESTED_WITH']) AND strtolower($_SERVER['HTTP_X_REQUESTED_WITH']) != 'xmlhttprequest') {
die();
}
$mysqli = new mysqli('localhost' , 'root', '', 'db');
if ($mysqli->connect_error){
die('Could not connect to database!');
}
$username = filter_var($_POST["username"], FILTER_SANITIZE_STRING, FILTER_FLAG_STRIP_LOW|FILTER_FLAG_STRIP_HIGH);
$statement = $mysqli->prepare("SELECT users.username FROM users
INNER JOIN admin ON users.username = admin.username
INNER JOIN staff ON users.username = staff.username
WHERE username=?");
$statement->bind_param('s', $username);
$statement->execute();
$statement->bind_result($username);
if($statement->fetch()){
die('<p style="color: red; font-weight:bold">Username is already taken! Please write another username.</p>');
}else{
die('<p style="color: green; font-weight:bold">Username is available!</p>');
}
}
?>
这是JS中的脚本
<script type="text/javascript">
$(document).ready(function() {
var x_timer;
$("#username").keyup(function (e){
clearTimeout(x_timer);
var user_name = $(this).val();
x_timer = setTimeout(function(){
check_username_ajax(user_name);
}, 500);
});
function check_username_ajax(username){
$("#user-result").html('<img src="ajax-loader.gif" />');
$.post('validate_username.php', {'username':username}, function(data) {
$("#user-result").html(data);
});
}
});
</script>
但是当我没有仅为用户表使用 INNER JOIN 时,它就有效。
我的INNER JOIN子句中有什么问题吗? 感谢有人可以提供帮助。 提前谢谢。
答案 0 :(得分:2)
因为您正在使用内部联接,所以如果所有三个表中都存在username
,则SQL查询将仅返回一些内容。如果username
中始终存在users
,而其他两个表中可能有也可能不存在LEFT JOIN
,那么您应admin
staff
和SELECT 1 FROM users WHERE username = ?
UNION
SELECT 1 FROM admin WHERE username = ?
UNION
SELECT 1 FROM staff WHERE username = ?
。如果没有重叠,则需要一个完整的外连接,这在MySQL中不存在但可以模拟(参见Efficient way to simulate full outer join in MySQL?)。
但是,由于您只是检查可用性,您可以简单地执行:
$statement->bind_param('sss', $username, $username, $username);
$statement->execute();
$result = $statement->get_result();
if ($result->num_rows) {
// Username is taken
} else {
// Username is available
}
然后,稍微调整你的PHP:
sql