2013-07-08 2 views
-2

У меня возникла эта проблема, и я пытаюсь найти лучшее и эффективное решение. У меня есть веб-сайт php с 19 различными входами, все они являются необязательными, и я использую метод get. С этими входами я должен найти информацию, которая соответствует базе данных и вернуть ее. У меня возникла проблема с созданием запроса, который будет работать.Создание sql-запроса с php

$query = "SELECT * FROM TEST.table"; 
if(($_GET['Transmission_Line_Designation'] ==="") && ($_GET['Switch_Number'] === "") && ($_GET['Telecom_Circuit_Number'] === "") 
    && ($_GET['Transmitter_Frequency'] === "") && ($_GET['Receiver_Frequency'] === "") && ($_GET['power_level'] === "") 
    && ($_GET['Phase'] === "") && ($_GET['Modulate'] === "") && ($_GET['trap_type'] === "") && ($_GET['line_tuner_type'] === "")) 
    //checks if there were no input, if there werent any, display all columns and rows from the data base 
{ 

} 
    else 
{ 

Это где я имею проблему, если пользователи вводят первый вход, он будет работать, однако, если пользователь покидает первый вход пустым, то запрос, который выходит это «и где» что-то, я думал об использовании множества циклов if для проверки условий и добавления флага, но я уверен, что есть более простой способ сделать это.

 $query.= " where "; 
     if 
     $query .= ($_GET['Transmission_Line_Designation'] === "") ? '' : 'Line_Designation = "'.$_GET['Transmission_Line_Designation'].'"'; 
     $query .= ($_GET['Switch_Number'] === "") ? '' : ' and Switch_Number = "'.$_GET['Switch_Number'].'"'; 
     $query .= ($_GET['Telecom_Circuit_Number'] === "") ? '' : ' and Telecom_Circuit_Number = "'.$_GET['Telecom_Circuit_Number'].'"'; 
     $query .= ($_GET['Transmitter_Frequency'] === "") ? '' : ' and Transmitter_Frequency = "'.$_GET['Transmitter_Frequency'].'"'; 
     $query .= ($_GET['Receiver_Frequency'] === "") ? '' : ' and Receiver_Frequency = "'.$_GET['Receiver_Frequency'].'"'; 
     $query .= ($_GET['power_level'] === "") ? '' : ' and power = "'.$_GET['power_level'].'"'; 
     $query .= ($_GET['Voltage'] === "") ? '' : ' and voltage = "'.$_GET['Voltage'].'"'; 
     $query .= ($_GET['Phase'] === "") ? '' : ' and Phase= "'.$_GET['Phase'].'"'; 
     $query .= ($_GET['Modulate'] === "") ? '' : ' and Modulate = "'.$_GET['Modulate'].'"'; 
     $query .= ($_GET['trap_type'] === "") ? '' : ' and trap = "'.$_GET['trap_type'].'"'; 
     $query .= ($_GET['line_tuner_type'] === "") ? '' : 'and ltunner = "'.$_GET['line_tuner_type'].'"'; 
     echo $query; 
} 

Благодарим вас, за вашу помощь заранее, я ценю это.

+0

В будущем вам может потребоваться использовать подготовленные операторы для вашего SQL. Быть жертвой внедрения SQL никогда не бывает забавным. – CountMurphy

ответ

2

Сначала введите фиктивное булево выражение, чтобы все ваши другие критерии могли начинаться с «И». Например:

 $query.= " where 1=1 "; 
     if 
     $query .= ($_GET['Transmission_Line_Designation'] === "") ? '' : 'AND Line_Designation = "'.$_GET['Transmission_Line_Designation'].'"'; 
     $query .= ($_GET['Switch_Number'] === "") ? '' : ' and Switch_Number = "'.$_GET['Switch_Number'].'"'; 
     $query .= ($_GET['Telecom_Circuit_Number'] === "") ? '' : ' and Telecom_Circuit_Number = "'.$_GET['Telecom_Circuit_Number'].'"'; 
     $query .= ($_GET['Transmitter_Frequency'] === "") ? '' : ' and Transmitter_Frequency = "'.$_GET['Transmitter_Frequency'].'"'; 
     $query .= ($_GET['Receiver_Frequency'] === "") ? '' : ' and Receiver_Frequency = "'.$_GET['Receiver_Frequency'].'"'; 
     $query .= ($_GET['power_level'] === "") ? '' : ' and power = "'.$_GET['power_level'].'"'; 
     $query .= ($_GET['Voltage'] === "") ? '' : ' and voltage = "'.$_GET['Voltage'].'"'; 
     $query .= ($_GET['Phase'] === "") ? '' : ' and Phase= "'.$_GET['Phase'].'"'; 
     $query .= ($_GET['Modulate'] === "") ? '' : ' and Modulate = "'.$_GET['Modulate'].'"'; 
     $query .= ($_GET['trap_type'] === "") ? '' : ' and trap = "'.$_GET['trap_type'].'"'; 
     $query .= ($_GET['line_tuner_type'] === "") ? '' : 'and ltunner = "'.$_GET['line_tuner_type'].'"'; 
     echo $query; 
} 
+0

Большое вам спасибо, я застрял в этой проблеме уже более дня, и я не думаю, что я бы придумал это, у меня все еще есть чему поучиться. Еще раз спасибо. – user2562224

1

В чем проблема, если? И петля? 100% уверен, что это будет лучше, чем maintaince этот код ....

попробовать:

foreach($_GET as $key=>$value){ 
    if($value !== '') 
     switch($key){ 
     case "Modulate": 
      dosomething(); 
      break; 
     } 
    } 

Это будет гораздо лучше maintaince.

0

Попробуйте нижеследующее, добавьте некоторые проверки тоже.

<?php 

$sql = "SELECT * FROM table WHERE "; 
$count = count($_GET); 

if ($count) { // check if $_GET has any values at all 
    foreach ($_GET as $key => $value) { 
     if ($value) { // check if $value not empty 
      $sql .= $key . " = " . "'" . $value . "', "; 
     } 
    } 

    $sql = rtrim($sql, ", "); 
} 

echo $sql; 

?> 
Смежные вопросы