2014-07-08 155 views
0

我有以下疑問:PHP比較兩個,而結果循環

$state = get['state']; 

$getPossibleIDs = "SELECT * FROM ".$report_group_lookup; 
    $qPossibleID = $conn->prepare($getPossibleIDs); 
      $qPossibleID -> execute(); 
       while($rowPossible = $qPossibleID->fetch()) 
        { 
         $possibleID = $rowPossible['id']; 
         $possibleName = $rowPossible['name']; 
$getSpecificIDs = "SELECT * FROM rbs_report_type_2_specific WHERE rbs_report_type_id =".$state; 
    $qSpecifcID = $conn -> prepare($getSpecificIDs); 
      $qSpecifcID -> execute(); 
       while($rowSpecfics = $qSpecifcID->fetch()) 
        { 
         $specificIDs = $rowSpecfics['rbs_specific_id']; 

         if($possibleID == $specificIDs) 
           { 
            echo $possibleName."-Yes<br/>"; 
           } 
         else 
           { 
            echo $possibleName."-No<br/>"; 
           } 
        } 
} 

我所試圖做的是比較兩個同時看起坐,第一查找,getPossibleIDs的結果,查找所有可能的該語句可以查看的ID。第二個,getSpecificIDs,只能找到之前選擇的那些。

它幾乎工作,但第二個查詢看起來在一個表具有以下信息:

------------------------------------ 
|rbs_report_type_id|rbs_specific_id| 
| 1    | 1    | 
| 1    | 2    | 
| 1    | 3    | 

所以結果我得到的是重複三次,每次一個rbs_spefic_id:

HDD Coordinator-No 
HDD Coordinator-No 
HDD Coordinator-No 
Rig Manager-Yes 
Rig Manager-No 
Rig Manager-No 
Driller-No 
Driller-Yes 
Driller-No 
Tank Hand-No 
Tank Hand-No 
Tank Hand-Yes 

而不是:

HDD Coordinator-No 
Rig Manager-Yes 
Driller-Yes 
Tank Hand-Yes 

有關如何相應地更改輸出的任何建議?

感謝

+0

什麼是'$ state'? –

+0

編輯,但狀態只是一個ID – Owen

+0

你是受SQL注入攻擊。使用參數化查詢完全避免此問題。 – Brad

回答

1

而不是做一個內部循環,使用JOIN查詢做這一切在第一查詢

$getPossibleIDs = " 
    SELECT rgl.id, rgl.name, 
    CASE WHEN rrt2s.rbs_specific_id IS NOT NULL THEN 'Yes' ELSE 'NO' END as `match` 
    FROM ".$report_group_lookup." rgl 
    LEFT JOIN rbs_report_type_2_specific rrt2s 
     ON rrt2s.rbs_specific_id = rgl.id 
     AND rrt2s.rbs_report_type_id = ?"; 
$qPossibleID = $conn->prepare($getPossibleIDs); 
$qPossibleID -> execute(array($state)); 
while($rowPossible = $qPossibleID->fetch()) 
    { 
     echo $rowPossible['name']. " -".$rowPossible['match']."<br />"; 
    } 
0

如果你只是在尋找的第一個值,那麼也許你能避免使用第二while循環乾脆。你可以這樣做:

$getPossibleIDs = "SELECT * FROM ".$report_group_lookup; 
$qPossibleID = $conn->prepare($getPossibleIDs); 
$qPossibleID -> execute(); 
while($rowPossible = $qPossibleID->fetch()) { 
    $possibleID = $rowPossible['id']; 
    $possibleName = $rowPossible['name']; 
    $getSpecificIDs = "SELECT * FROM rbs_report_type_2_specific WHERE rbs_report_type_id =".$state; 
    $qSpecificID = $conn -> prepare($getSpecificIDs); 
    $qSpecificID -> execute(); 
    $rowSpecifics = $qSpecificID->fetch() 
    if ($rowSpecifics) {      //if a value is present then continue execution 
     $specificIDs = $rowSpecifics['rbs_specific_id']; 
     if ($possibleID == $specificIDs) { 
      echo $possibleName."-match<br/>"; 
     } else { 
      echo $possibleName."-No<br/>"; 
     } 
    } 
} 

這將檢查值是否存在於第二次查找。如果是的話,它會執行你的邏輯,但只做一次。

+0

對不起,我不是在尋找什麼,對於司鑽和坦克手來說,這仍然是失敗的。 – Owen