2017-03-31 113 views
1

我有兩個表pre_application和申請人,我想查詢pre_application表,密碼和申請表,申請銷,如果成功的申請人應先登錄下面是我的代碼:PHP PDO查詢兩個表的差異

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

'foreach($ stm as $ row);'停在那裏。 RTM http://php.net/manual/en/control-structures.foreach.php –

+0

''location:approfile.php?applicant = $ appass''變量不會被單引號解析,並且POST數組未知。 –

+0

我的問題是在查詢語法 – apollos

回答

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(); 
         } 
         ?> 

上面的代碼已經工作,但我會歡迎更好的方式來實現相同的事情。謝謝

0

UNION不是你的情況下正確的解決方案幫助。正如其名稱所暗示的那樣,UNION將把所有子查詢的數據集(您也可以稱之爲行或記錄)組合在一起。

對於你的問題,我假設pre_application和申請表必須通過FOREIGN KEY(最簡單的情況相關聯,否則他們可以通過關聯的橋接表,但我不能告訴究竟有因爲我看不到你的表格結構),否則,沒有確切的方法來鏈接引腳密碼對,並確保每個密碼引腳對都是唯一的。

的假設是有列名pre_application表是在申請表中的IDFOREIGN KEY APP_ID,你可以改變你的查詢中使用JOIN而不是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_ap匹配行將申請表中的相關申請表與申請人表中的相關申請表進行比較,檢查這些JOINING行是否與密碼和引腳條件匹配,並返回匹配的行。

你可以在這裏做一些更多的研究,關於加入會員,UNION: https://dev.mysql.com/doc/refman/5.7/en/join.html

+0

我很感謝你的解決方案,但這裏的事實是,pre_application和申請人是兩個表。 pre_application表中包含以下字段invioce_no,程序,名稱,密碼,而申請人具有invoice_no,app_no,名稱作爲列,因此您可能希望重新組織查詢,請輸入 – apollos

+0

您可以更改JOIN子句並將id替換爲invoice_no。 –