pdo WHERE IN复选框+多选

时间:2015-02-10 11:50:45

标签: php pdo where-in

编辑于2月。 2015年11月11日-11h38

我花了几个小时寻找合适的解决方案而没有实现我的目标。我只想在我的WHERE IN请求中读取我的multiselect []和checkboxes []的选定值。 我已经尝试了几个小时不同的解决方案,但我仍然完全陷入困境。

感谢您的帮助

$secteur_searched="";
if (!empty($_REQUEST['secteur_searched']) AND is_array($_REQUEST['secteur_searched']))
   { foreach ($_REQUEST["secteur_searched"] as $selectedOption)        
     $secteur_searched.=$selectedOption.",";  
   }

if ($secteur_searched)
   { $secteur_searched = rtrim($secteur_searched, ',');
     $where[] = "j.job_secteur IN (:job_secteur) " ;
     $param[':job_secteur']= $secteur_searched;  
     var_dump($secteur_searched); // returns (1,2,3)
   }

if (!empty($where)) 
   { $query.= ' WHERE ' . implode(' AND ', $where);
   }

 $query.= " ORDER BY j.job_date_insertion DESC"; 
 $sth =$marInterim ->prepare($query);
 $sth->execute($param);

 $compte = $sth->fetchAll();
 $nb_resultats = count($compte); 
 $errors['nb_resultats_recherche'] = $nb_resultats; // ok (for ajax)

/********************/
 if ( !empty($_REQUEST['afficher_x_resultats']))
    { $per_page=$_REQUEST['afficher_x_resultats']; 
    }
 else {$per_page=10; }

/* Results per page */
$nb_pages = ceil($nb_resultats/$per_page);  
$current_page = isset($_REQUEST['page']) && ($_REQUEST['page'] > 0) && ($_REQUEST['page'] <= $nb_pages) ? $_REQUEST['page'] : 1;
$start = ($current_page-1)*$per_page;    

$query2= $query." LIMIT $start,$per_page "; 
$sth2 =$marInterim ->prepare($query2); 
$sth2-> execute($param); 
//print_r($sth2->errorInfo());

 while($datos= $sth2->fetch(PDO::FETCH_ASSOC))
  { $en_date_insertion=$datos['job_date_insertion'];      
 $explode_insertion= explode("-", $en_date_insertion);
 $date_insertion_fr = $explode_insertion[2]."-".$explode_insertion[1]."-".$explode_insertion[0];         
 $job_id= $datos['job_id'];
 $job_intitule= strtoupper($datos['job_intitule']);
 $job_ville = $datos['ville_nom'];
 $job_cp = $datos['cp'];
    echo 'hello';        
echo "
                                   <div class='offers btns'>
                                   <a class='link_vers_offre' href='job_offer_detail.php?job_id=$job_id'>
                                   <table id='table_liste_des_offres'>
                                   <tr>
                                   <td class='liste_intitule'> " .$job_intitule." </td>
                                   <td class='liste_ref'>Offre n°" .$job_id."   du   ".$date_insertion_fr ." </td>
                                   <td class='liste_ville'> ".$job_cp. " ".$job_ville." </td>
                                   </tr>
                                   </table>
                                   </a>
                                   </div>
                                 ";
  }

3 个答案:

答案 0 :(得分:0)

您没有提供您正在使用的HTML。因此,假设您必须遵循由多个选择,复选框列表和按钮组成的表单。

<form id="frm" name="frm" method="POST">
    <select name="secteur_searched[]" id="secteur_searched" multiple="multiple">
        <option value="secteur_searched_1" selected>secteur_searched_1</option>
        <option value="secteur_searched_2">secteur_searched_2</option>
        <option value="secteur_searched_3" selected>secteur_searched_3</option>
        <option value="secteur_searched_4">secteur_searched_4</option>
    </select>
    <br/>
    <input type="checkbox" name="type_de_contrat[]" value="type_de_contrat_1" checked="checked" />type_de_contrat_1
    <input type="checkbox" name="type_de_contrat[]" value="type_de_contrat_2" checked="checked" />type_de_contrat_2
    <input type="checkbox" name="type_de_contrat[]" value="type_de_contrat_3" />type_de_contrat_3
    <input type="submit" value="POST VALUES" id="cmd" name="cmd"/>
</form>

如果您希望访问所有复选框/多重选择值posted,则需要在对象的[]属性中指定的值的末尾添加name。如

<select name="secteur_searched[]"></select>

<input type="checkbox" name="type_de_contrat[]" />

以下是访问服务器端发布值的方法。

<强>复选

foreach ($_POST["secteur_searched"] as $selectedOption)
  echo $selectedOption."<br/>";

<强>复选框

foreach ($_POST["type_de_contrat"] as $selectedCheckbox)
  echo $selectedCheckbox."<br/>";

在发布表单时打印出值的完整代码

if (isset($_POST["cmd"]))
{
  if (isset($_POST["secteur_searched"]))
  {
    foreach ($_POST["secteur_searched"] as $selectedOption)
      echo $selectedOption."<br/>";
  }

  if (isset($_POST["type_de_contrat"]))
  {
    foreach ($_POST["type_de_contrat"] as $selectedCheckbox)
      echo $selectedCheckbox."<br/>";
  }
}

下一步是构造pdo对象使用的参数。这是一个示例代码。

if (isset($_POST["cmd"]))
{
    $secteur_searched=""; //$param[':job_secteur']
    $type_de_contrat_searched=""; //$param[':type_de_contrat']
    if (isset($_POST["secteur_searched"]))
    {
      foreach ($_POST["secteur_searched"] as $selectedOption)
        $secteur_searched.=$selectedOption.",";
    }

    if (isset($_POST["type_de_contrat"]))
    {
        foreach ($_POST["type_de_contrat"] as $selectedCheckbox)
            $type_de_contrat_searched.=$selectedCheckbox.",";
    }

    if ($secteur_searched)
      $secteur_searched = rtrim($secteur_searched, ','); //get rid of the "," at the end 

    if ($type_de_contrat_searched)
      $type_de_contrat_searched= rtrim($type_de_contrat_searched, ','); //get rid of the "," at the end

   echo "type_de_contrat_searched:".$type_de_contrat_searched."<br/>secteur_searched:".$secteur_searched;
}

编辑1

我认为您遇到的问题是访问过帐的值。如果情况不是这样,请告诉我。

编辑2

我不确定你是否试过这个,所以无论如何我都会把它放下来。使用

检查参数绑定是否正确
$sth2->debugDumpParams();

执行后

$sth2->execute($param); 

编辑3

显然debugDumpParams没有打印出参数的值。

  

尽管有文档,但此功能不会打印参数值   说它确实如此。见https://bugs.php.net/bug.php?id=52384(提交回来   2010)。

manual页面中找到一个有用的功能,如下所示

function parms($string,$data) {
    $indexed=$data==array_values($data);
    foreach($data as $k=>$v) {
        if(is_string($v)) $v="'$v'";
        if($indexed) $string=preg_replace('/\?/',$v,$string,1);
        else $string=str_replace(":$k",$v,$string);
    }
    return $string;
}

(也许你已经知道了)用它来显示像这样的准备好的SQL

print parms($query2,$param); //query,your parameter array

答案 1 :(得分:0)

你认为我的选择和复选框名称包含[]:

 <select multiple="multiple" name="secteur_searched[]" size="8">
  <option value="12">Informatique - Technologie de l'Information</option>
  <option value="14">Logistique - Manutention - Transport</option>
// and so on ...
</select>

 <input type="checkbox" name="type_de_contrat[]" value="CDI" >
 <input type="checkbox" name="type_de_contrat[]" value="CDD" >

依旧......

当我尝试你的方法(谢谢你!),这似乎是正确的,我没有从数据库中得到任何回报。 (我填写的唯一输入是多选)。

   $secteur_searched="";

   if (!empty($_REQUEST['secteur_searched']) AND is_array($_REQUEST['secteur_searched']))
      { foreach ($_REQUEST["secteur_searched"] as $selectedOption)        
        $secteur_searched.=$selectedOption.",";  
      }

  if ($secteur_searched)
     { $secteur_searched = rtrim($secteur_searched, ',');
       $where[] = "j.job_secteur IN (:job_secteur) " ;
       $param[':job_secteur']= $secteur_searched;  
       var_dump($secteur_searched); // returns (1,2,3)
     }

 if (!empty($where)) 
    { $query.= ' WHERE ' . implode(' AND ', $where);
    }

 $query.= " ORDER BY j.job_date_insertion DESC"; 

 $sth =$marInterim ->prepare($query);
 $sth->execute($param);

 while($datos= $sth->fetch(PDO::FETCH_ASSOC))
  { $en_date_insertion=$datos['job_date_insertion'];      
     $explode_insertion= explode("-", $en_date_insertion);
     $date_insertion_fr = $explode_insertion[2]."-".$explode_insertion[1]."-".$explode_insertion[0];         
     $job_id= $datos['job_id'];
     $job_intitule= strtoupper($datos['job_intitule']);
     $job_ville = $datos['ville_nom'];
     $job_cp = $datos['cp'];
echo "
                                       <div class='offers btns'>
                                       <a class='link_vers_offre' href='job_offer_detail.php?job_id=$job_id'>
                                       <table id='table_liste_des_offres'>
                                       <tr>
                                       <td class='liste_intitule'> " .$job_intitule." </td>
                                       <td class='liste_ref'>Offre n°" .$job_id."   du   ".$date_insertion_fr ." </td>
                                       <td class='liste_ville'> ".$job_cp. " ".$job_ville." </td>
                                       </tr>
                                       </table>
                                       </a>
                                       </div>
                                     ";

  }

答案 2 :(得分:0)

此功能仅返回

SELECT * FROM marinterim_job_offers j JOIN marimmo_villes v ON v.ville_id = j.job_ville WHERE j.job_secteur IN(:job_secteur)ORDER BY j.job_date_insertion DESC LIMIT 0,10

function parms($query2,$param) {
$indexed=$param==array_values($param);
foreach($param as $k=>$v) {
    if(is_string($v)) $v="'$v'";
    if($indexed) $query2=preg_replace('/\?/',$v,$query2,1);
    else $query2=str_replace(":$k",$v,$query2);
}
return $query2;
} print parms($query2,$param); 

然后,$ sth2-&gt; debugDumpParams();

[186] SELECT - FROM marinterim_job_offers j JOIN marimmo_villes v ON v.ville_id = j.job_ville WHERE j.job_secteur IN(-job_secteur)ORDER BY j.job_date_insertion DESC LIMIT 0,10 Params- 1 Key- Name- [12 ] -job_secteur paramno = -1 name = [12] --job_secteur- is_param = 1 param_type = 2


我注意到如果我在MultiSelect中只选择了一个选项,我会得到相应的结果......例如:选项值='5' - &gt;返回与job_secteur 5 ..

对应的结果
<select multiple="multiple" name="secteur_searched[]" .../>

谢谢