Отредактировано на Фев. 11-е, 2015 -11h38
Я часами искал правильное решение, не достигая своей цели. Я просто хочу, чтобы выбранные значения моего множественного выбора [] и флажков [] читались в моих запросах WHERE IN.
Я часами пробовал разные решения, но я все еще застрял.
Спасибо за вашу помощь
$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>
";
}
Вы предположили, что мое имя и флажки содержат []:
<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>
";
}
Вы не предоставили 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).
Нашел одну полезную функцию в руководство страница следующим образом
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
Эта функция только возвращает
ВЫБРАТЬ * ОТ marinterim_job_offers j ПРИСОЕДИНИТЬСЯ marimmo_villes v ВКЛ v.ville_id = j.job_ville ГДЕ j.job_secteur IN (: job_secteur) ЗАКАЗАТЬ ПО 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-> debugDumpParams ();
[186] SELECT — FROM marinterim_job_offers j ПРИСОЕДИНЯЙТЕСЬ к marimmo_villes v ON v.ville_id = j.job_ville ГДЕ j.job_secteur IN (-job_secteur) ORDER BY j.job_date_insertion DESC LIMIT 0,10 Params- 1 Key-Name_te_ser_te 12 [12] paramno = -1 name = [12] —job_secteur- is_param = 1 param_type = 2Я заметил, что если я выберу только 1 вариант за раз в моем MultiSelect, я получу соответствующие результаты … Пример: значение параметра = ‘5’ -> возвращает результаты, соответствующие job_secteur 5 ..
<select multiple="multiple" name="secteur_searched[]" .../>
Спасибо