2017-03-31 2 views
1

を持つ2つのテーブル私は2つのテーブルの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(最も簡単な場合、それ以外の場合は、ブリッジングテーブルを経由して関連付けることができますが、私はまさにそこに何を言うことができないを通じて関連付けられている必要がありますことを前提としていあなたのテーブル構造が見えないので)、そうでなければ、ピンとパスワードのペアをリンクし、すべてのパスワードとピンペアが一意であることを確認する正確な方法はありません。列名が志願テーブルののid列のFOREIGN KEYあるpre_application表にを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'"); 

がpre_apからマッチ行を登録しようこれらのJOINING行がパスワードとピン条件と一致するかどうかを確認し、一致するものを返します。

あなたはここで、組合に加入についてのいくつかのより多くの研究を行うことができます。 https://dev.mysql.com/doc/refman/5.7/en/join.html

+0

私はあなたのソリューションに感謝しますが、ここではpre_applicationとapplicantsは2つのテーブルです。 pre_applicationテーブルにinvioce_no、program、name、passwordの各フィールドがあります。申請者はinvoice_no、app_no、カラム名を持ちますので、クエリを再構成したい場合があります。pls – apollos

+0

JOIN句を変更してidをinvoice_noに置き換えることができます。 –