pdo WHERE IN чекбоксы + мультиселект

Отредактировано на Фев. 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>
";
}

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>
";

}
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).

Нашел одну полезную функцию в руководство страница следующим образом

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
0

Эта функция только возвращает

ВЫБРАТЬ * ОТ 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[]" .../>

Спасибо

0
По вопросам рекламы [email protected]