php PDO查询两个表有差异

时间:2017-03-31 21:48:58

标签: php mysql pdo

我有两个表pre_application和申请人,我想查询pre_application表的密码和申请人表的申请表,如果成功,申请人应该登录。以下是我的代码:

if(isset($_POST['submit']) || $_SERVER['REQUEST_METHOD']=='POST'){

    try{
        $pin=$_POST['pin'];
        $pass=$_POST['password'];
        $stm=$dbh->query("SELECT password FROM pre_application WHERE password='$pass' UNION SELECT app_no FROM applicants WHERE app_no='$pin'");
        foreach($stm as $row);
        $appass=$row['password'];
        $appin=$row['app_no'];
        $name=$row['name'];
        if($stm) {
            header('location:approfile.php?applicant=$appass');
        } else {
            echo "<script> alert('Invalid Application Number or Password')</script>";
            exist();
        }
    } catch(Exception $e){
        echo $e->getMessage();
    }                            
}?>

有人应该提供正确的语法帮助

2 个答案:

答案 0 :(得分:0)

UNION 不是您案例的正确解决方案。顾名思义, UNION 将组合所有相关的子查询的数据集(您也可以称之为行或记录)。

对于您的问题,我认为pre_application和applicants表必须通过 FOREIGN KEY 关联(最简单的情况,否则它们可以通过关联表,但我无法确定究竟是什么,因为我看不到你的表结构),否则,没有精确的方法来链接pin-password对并确保每个密码 - 引脚对都是唯一的。

假设 pre_application 表中的列名 app_id id <的 FOREIGN KEY 申请人表格中的/ strong>列,您可以更改查询以使用加入而不是 UNION

 $stm=$dbh->query("SELECT password, pin 
                   FROM pre_application pre
                   JOIN applicants app ON app.id = pre.app_id 
                   WHERE password='$pass' AND app_no='$pin'");

JOIN 将pre_applications表中的行与申请人表中的相关行匹配,检查这些JOINING行是否与密码和引脚条件匹配,并返回匹配的行。

你可以在这里做更多关于JOIN,UNION的研究: https://dev.mysql.com/doc/refman/5.7/en/join.html

答案 1 :(得分:0)

谢谢大家的贡献。毕竟这就是我解决问题的方法。

<?php
try{
                            $pin=$_POST['pin'];
                            $pass=$_POST['password'];
                            $stm=$dbh->prepare("SELECT pre_application.invoice_no,pre_application.password,applicants.invoice_no,applicants.app_no FROM pre_application INNER JOIN applicants ON pre_application.invoice_no=applicants.invoice_no WHERE pre_application.password=? AND applicants.app_no=?");
                            $stm->bindParam(1, $pass);
                            $stm->bindParam(2, $pin);
                            $stm->execute();
                            $row_count=$stm->rowCount();
                            if($row_count==1){
                                header('location:approfile.php');
                            }else{
                                echo "<script> alert('Invalid Application Number or Password')</script>";

                            }
                        }
                        catch(Exception $e){
                            echo $e->getMessage();
                        }
                        ?>

上面的代码已经有效,但我欢迎更好的方法来实现同样的目标。感谢