PHP内连接,用于验证多个用户(如果已存在使用PDO)

时间:2017-09-09 02:08:15

标签: php mysql join pdo inner-join

我正在尝试验证来自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子句中有什么问题吗? 感谢有人可以提供帮助。 提前谢谢。

1 个答案:

答案 0 :(得分:2)

因为您正在使用内部联接,所以如果所有三个表中都存在username,则SQL查询将仅返回一些内容。如果username中始终存在users,而其他两个表中可能有也可能不存在LEFT JOIN,那么您应admin staffSELECT 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