我有两个表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();
}
}?>
有人应该提供正确的语法帮助
答案 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();
}
?>
上面的代码已经有效,但我欢迎更好的方法来实现同样的目标。感谢