2014-07-08 74 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