【问题标题】:PHP Inner join to validate multiple users if already exist using PDO使用 PDO 验证多个用户是否已存在的 PHP 内连接
【发布时间】:2018-02-17 23:21:41
【问题描述】:

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

【问题讨论】:

    标签: php mysql join pdo inner-join


    【解决方案1】:

    因为您使用的是内部联接,所以只有在所有三个表中都存在username 时,SQL 查询才会返回一些内容。如果username 始终出现在users 中,并且可能出现在其他两个表中,也可能不出现在其他两个表中,那么您将使用LEFT JOIN adminstaff。如果没有重叠,您将需要一个完整的外连接,这在 MySQL 中不存在但可以模拟(参见Efficient way to simulate full outer join in MySQL?)。

    但是,由于您只检查可用性,您可以简单地做:

    SELECT 1 FROM users WHERE username = ?
    UNION
    SELECT 1 FROM admin WHERE username = ?
    UNION
    SELECT 1 FROM staff WHERE username = ?
    

    然后,稍微调整一下你的 PHP:

    $statement->bind_param('sss', $username, $username, $username);
    $statement->execute();
    $result = $statement->get_result();
    if ($result->num_rows) {
        // Username is taken
    } else {
        // Username is available
    }
    

    【讨论】:

    • 您能详细说明一下吗?
    • 我用您在上面给出的答案中的代码替换了 sql。它总是告诉我该用户可用,即使它存在于管理员用户和员工的表中。
    • 您需要将您的 PHP 调整为新的 SQL,请参阅编辑。
    • 非常感谢!有用!我从你身上学到了很多。欣赏!
    猜你喜欢
    • 2019-08-12
    • 1970-01-01
    • 1970-01-01
    • 2021-10-29
    • 1970-01-01
    • 1970-01-01
    • 2020-08-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多