使用 PHP 比较两个 MySQL 表 PDO根据行是否存在从任一表返回列数据

Compare Two MySQL tables using PHP PDO return Column data from either table based on if row exists

提问人:ChrisKsag 提问时间:11/7/2023 最后编辑:ChrisKsag 更新时间:11/7/2023 访问量:53

问:

我正在尝试运行一些 PHP 以根据 ID 搜索表 2,如果 ID 存在,则从行返回数据。

我的结构是这样的

user_login - ID ||用户名 ||电子邮件 ||通行证 ||创建日期
user_details - ID(同上ID)||用户名字 ||姓氏 ||地址。。。。

对于管理面板,如果用户尚未完成完整注册,我将尝试显示表 1 中的“用户名”。因此,如果表 2 中不存在 ID,则显示表 1 中的用户名。

我还在学习,我知道我的代码不是正确的方法。它确实有效,但我觉得它很草率,我很难找到比较两个表的最佳方式的资源。

在表 user_details 中搜索 ID 的数据库,如果没有,则返回用户名。

$userID = $_SESSION['$userID'];
                              
// PDO Prepaired prepair and execute 
$navBarsql = 'SELECT * FROM user_details WHERE user_login_ID = :user_login_ID;';
                              
$stmt = $pdo->prepare($navBarsql);
$stmt->execute([
    'user_login_ID' => $userID,
                              
]);
                              
$row = $stmt->fetch(PDO::FETCH_ASSOC);
                              
if($row){                      
    echo $row['userFname'] . " " . $row['userLName'];                     
}else{
    // PDO Prepaired prepair and execute 
    $navBarsql = 'SELECT * FROM user_login WHERE id = :id;';
                                      
    $stmt = $pdo->prepare($navBarsql);
    $stmt->execute([
        'id' => $userID,                             
    ]);
                                      
    $row = $stmt->fetch(PDO::FETCH_ASSOC);
    // search user db for username

    echo ucfirst($row['username']);                          
}

我见过一些疯狂的长SQL语句,似乎您可以在查询中执行此操作,但我的尝试都没有让我到达任何地方。

非常感谢所有的帮助!

php mysql 数据库 pdo

评论

1赞 Barmar 11/7/2023
代码中的哪个表是表 1 和表 2?为什么不直接使用问题中的真实姓名呢?
0赞 user3783243 11/7/2023
根据 id 将表 1 与表 2 左联接
0赞 ChrisKsag 11/7/2023
@barmar你是对的,我刚刚更新了它。

答:

1赞 Barmar 11/7/2023 #1

使用 a 将它们合并到单个查询中。如果这些列中没有行,则为 .LEFT JOINuser_detailsNULL

$userID = $_SESSION['$userID'];
                              
// PDO Prepaired prepair and execute 
$navBarsql = 'SELECT ul.username, ud.userFname, ud.userLname
              FROM user_login AS ul
              LEFT JOIN user_details AS ud ON ul.id = ud.user_login_ID
              WHERE ul.id = :user_login_ID;';
                              
$stmt = $pdo->prepare($navBarsql);
$stmt->execute([
    'user_login_ID' => $userID,
]);
                              
$row = $stmt->fetch(PDO::FETCH_ASSOC);
                              
if($row){
    if ($row['userFname'] !== null) {
        echo $row['userFname'] . " " . $row['userLName'];
    } else {
        echo ucfirst($row['username']);
    }
} else {
    echo "UserID $userID not found.";
}

评论

0赞 ChrisKsag 11/7/2023
我仍然遇到一个疯狂的错误。它告诉我未捕获的 PDOException:SQLSTATE[42S22]:未找到列:1054 “on 子句”中的未知列“ul.user_login_ID”
0赞 ChrisKsag 11/7/2023
我验证了所有拼写都是正确的。
0赞 ChrisKsag 11/7/2023
我想通了。它应该是 SELECT ul.username, ud.userFname, ud.userLName FROM user_login AS ul LEFT JOIN user_details AS ud ON ul.id = ul.id WHERE ul.id = :user_login_ID;
0赞 ChrisKsag 11/7/2023
如果您想更新您的答案,您 LEFT JOIN 的最后一行应该已 ul.id,因为user_login_ID是 ud 的一部分。非常感谢您的回答!大帮大忙!
1赞 user3783243 11/7/2023
如果有回报,也可以这样做。select case when ud.id is not null then concat(ud.userFname, ' ', ud.userLname) else ul.username end as name ....echo ucwords($row['name']);