2015-02-10 2 views
0

Привет у меня есть форма с 6 полями:PDO запрос в зависимости от того, что входы будут завершены

Age1 
    Age2 
    Client type 
    Destination 
    Score1 
    Score2 

Я хочу, чтобы создать запрос на основе того, какие поля будут завершены, и я не знаю, как создать один только путем создания для каждой возможности запроса. Эти поля формы представляют собой столбцы в моей базе данных из 2 таблиц.

$age1=$_POST['age1']; 
$age2=$_POST['age2']; 
$score1=$_POST['score1']; 
$score2=$_POST['score2']; 
$destination=$_POST['destionation']; 
$client_type=$_POST['client_type']; 

if ($age1!='' and $age2!='') 
{ 
    $age_sql=" where TIMESTAMPDIFF(year, Bday,CURDATE())>=$age1 and TIMESTAMPDIFF(year, Bday,CURDATE())<=$age2"; 
} 
if ($destination!='') 
{ 
$dest_sql='Inner Join Leg_Client_Destinatie 
       where Leg_Client_Destinatie.Destinatie="'.$destinatie.'" 
       and Leg_Client_Destinatie.ID=Persoane.ID'; 
} 
$stmt = $dbh->prepare("SELECT * from Persoane $dest_sql $varsta_sql");  
        $stmt->execute(); 
       while ($row = $stmt->fetch()) 
       { 
       } 

но это нехорошее решение для каждой возможности, потому что может быть много комбинаций. У любого из вас есть другая идея?

+0

Это все, что вы можете сделать: динамически строить свою строку запроса на основе того, что выбрано пользователем. иначе вы застряли в написании невероятно уродливых/огромных запросов, содержащих логику для обработки ВСЕ возможных комбинаций опций. –

+0

ok, но проверьте мой пример, скажем, у меня есть место назначения и возраст, но в возрасте sql мне нужно 'и' вместо 'where', потому что я использую' where' on '$ dest_sql' – user3463807

+0

yes. если вы строите запрос динамически, то вам нужно убедиться, что вы создаете синтаксически VALID-запрос. –

ответ

0

Мне удалось заставить его работать. Бьюсь об заклад, есть более элегантные способы сделать это, например, с массивами, но atm это хорошо. Если у кого-то есть другая идея, не стесняйтесь публиковать его. Thnx

$age1=$_POST['age1']; 
$age2=$_POST['age2']; 
$score1=$_POST['score1']; 
$score2=$_POST['score2']; 
$destination=$_POST['destionation']; 
$client_type=$_POST['client_type']; 

$sql=("SELECT * From Persoane $join WHERE Persoane.ID IS NOT NULL $join2"); 
if ($destination!='') 
{ 
$join='Inner Join Leg_Client_Destination 
       ON Leg_Client_Destination.Destination="'.$destination.'" 
       '; 
$join2='and Leg_Client_Destination.ID=Persoane.ID'; 
} 
if ($age1!='' and $age2!='') 
{ 
    $sql .= " AND TIMESTAMPDIFF(year, Bday,CURDATE())>=$age1 and TIMESTAMPDIFF(year, Bday,CURDATE())<=$age2"; 
} 
if ($score1!='' and $score2!='') 
{ 
    $sql .= " AND score_T>=$score1 and score_T<=$score2"; 
} 
if ($client_type!='') 
{ 
    $sql .= " AND Client_Type=$client_type"; 
}  
        $stmt=$dbh->prepare($sql); 
        $stmt->execute(); 
       while ($row = $stmt->fetch()) 
       { 
+0

Ну, вы также открыли себе SQL-инъекцию, потому что вы не готовите свои параметры. – prodigitalson

+0

Я знаю, что я поставил код перед связыванием params, и этот код находится под логином в любом случае: p '$ stmt-> bindParam (': age1', $ age1);' – user3463807