2016-10-07 2 views
-1

У меня есть этот SQL-запрос:Как игнорировать SQL Select команду для строки, если значение пустое

$sql2 = "SELECT * FROM MyTable WHERE time1='".$_POST['time']."' AND type1='".$_POST['type']."'; 

Результат:

$result1 = $conn->query($sql2); 

if ($result1->num_rows > 0) { 
    // output data of each row 
    while($row = $result1->fetch_assoc()) { 

     echo $row["name1"]; 
  • name1 строка это имя деятельности в базе данных.

Форма HTML имеет эти два списка выберите:

<select id="time" name="time" required="" data-do-validate="true"> 
    <option value="">Select ...</option> // this is the NULL value 
    <option value="time1">Type 1</option> 
    <option value="time2">Type 2</option> 
    <option value="time3">Type 3</option> 
    <option value="time4">Type 4</option> 
         </select> 

<select id="type" name="type" required="" data-do-validate="true"> 
    <option value="">Select ...</option> // this is the NULL value 
    <option value="type1">Type 1</option> 
    <option value="type1">Type 2</option> 
    <option value="type1">Type 3</option> 
    <option value="type1">Type 4</option> 
         </select> 

Так что я пытаюсь сделать, это выбрать из базы данных имени всех деятельности с соответствующими данными, представленных в HTML форме.

BUT, что я дополнительно хочу проигнорировать SQL Select for the Time (например), если пользователь оставил значение пустым (Select ...), результатом в этом случае будут имена всех действий основанный только на Тип. И если он выберет время и тип, результат в этом случае будет уточнен на основе Время и Тип действия.

Что я могу сделать?

Спасибо!

+2

Bom, injection. Надеюсь, никто никогда не попросит типа 'O'Maley' – Xenos

+0

Я просто * так * очень хочу POST значение типа" ** 'foo 'OR 1 = 1 ORDER BY 1 -' ** ". – spencer7593

+0

риск для безопасности в моем случае не является проблемой, и все данные являются общедоступными – sadssdsada

ответ

-1

Вы можете создать свое заявление в зависимости от значений $ _POST (кстати, в продуктивных вы should't использовать $ _POST значения непосредственно в операторе SQL).

$connect = ""; 
$sql2 = "SELECT * FROM MyTable "; 

if($_POST['time']!='' || $_POST['type']!='') { 
    $sql2 .= "WHERE "; 
    if($_POST['time']!='') { 
     $sql2 .= "time1='".$_POST['time']."'"; 
     $connect = " AND "; 
    } 
    if($_POST['type']!='') { 
    $sql2 .= $connect . "type1='".$_POST['type']."'"; 
    } 
} 
+0

чувак вы потрясающий!: D – sadssdsada

+0

этот метод может обрабатывать 1000000000 параметров без проблем :) – sadssdsada

0

Зачем запускать полный динамически построенный запрос?

SELECT * FROM MyTable WHERE (1=? AND time1=?) AND type1=?; 

Имея параметризованные значения: isset($_POST['time']) ? 1 : 0, isset($_POST['time']) ? $_POST['time'] : null и $_POST['type'].

MySQL будет обрабатывать оптимизацию, не выполняя часть (1=0 AND time1=?).

-1
if(isset($_POST["time"])){ // Not Empty 
     $sql2 = "SELECT * FROM MyTable WHERE time1='".$_POST['time']."' AND type1='".$_POST['type']."'; 
    } 
    else{ //Only select the type 
     $sql2 = "SELECT * FROM MyTable WHERE type1='".$_POST['type']."'; 
    } 

    $result1 = $conn->query($sql2); 

if ($result1->num_rows > 0) { 
    // output data of each row 
    while($row = $result1->fetch_assoc()) { 

     echo $row["name1"];