2013-08-12 3 views
1

У меня возникла проблема с получением запроса на работу (а также с вопросом о безопасности запроса).Создание условного sql-запроса

if(isset($_POST)){ 
     $sql = "SELECT * FROM members WHERE"; 

    if($_POST['FirstName_S'] !== ''){ 
     $sql .= " FirstName LIKE '%" . $_POST['FirstName_S'] . "%'"; 
    } 
    if($_POST['LastName_S'] !== ''){ 
     $sql .= " OR LastName LIKE '%" . $_POST['LastName_S'] . "%'"; 
    } 
    if($_POST['Firm_S'] !== ''){ 
     $sql .= " OR Firm LIKE '%" . $_POST['Firm_S'] . "%'"; 
    } 
    if($_POST['Country_S'] !== ''){ 
     $sql .= " OR Country LIKE '%" . $_POST['Country_S'] . "%'"; 
    } 
    if($_POST['City_S'] !== ''){ 
     $sql .= " OR City LIKE '%" . $_POST['City_S'] . "%'"; 
    } 
    if($_POST['State_S'] !== '' AND $_POST['State_S'] !== 'other'){ 
     $sql .= " OR State LIKE '%" . $_POST['State_S'] . "%'"; 
    } 
    } 

Очевидно, что если FirstName_S не определен, изломы запроса слова "ГДЕ ИЛИ". Похоже, у него будет логическое решение, но я слишком долго смотрел на него.

Кроме того, инсталляция sql была поднята в качестве проблемы, а в качестве побочного вопроса было бы достаточно дезинфицировать входные данные? Или это вообще плохая практика?

+0

ли FirstName_S' требуется 'для отправки в' Post'? – EmCo

+0

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

+3

Чтобы защитить от SQL-инъекций, лучше всего подготовить подготовленные операторы: http://stackoverflow.com/questions/60174/how-can-i-prevent-sql-injection-in-php/60496#60496 –

ответ

3
if(isset($_POST)){ 
     $sql = "SELECT * FROM members WHERE"; 

    if($_POST['FirstName_S'] !== ''){ 
     $sql .= "OR FirstName LIKE '%" . $_POST['FirstName_S'] . "%'"; 
    } 
    if($_POST['LastName_S'] !== ''){ 
     $sql .= " OR LastName LIKE '%" . $_POST['LastName_S'] . "%'"; 
    } 
    if($_POST['Firm_S'] !== ''){ 
     $sql .= " OR Firm LIKE '%" . $_POST['Firm_S'] . "%'"; 
    } 
    if($_POST['Country_S'] !== ''){ 
     $sql .= " OR Country LIKE '%" . $_POST['Country_S'] . "%'"; 
    } 
    if($_POST['City_S'] !== ''){ 
     $sql .= " OR City LIKE '%" . $_POST['City_S'] . "%'"; 
    } 
    if($_POST['State_S'] !== '' AND $_POST['State_S'] !== 'other'){ 
     $sql .= " OR State LIKE '%" . $_POST['State_S'] . "%'"; 
    } 

    $sql=str_replace("WHERE OR","WHERE",$sql); // quick dirty fix 

    } 

Ofcourse вам нужно санировать вход, но так как вы не упомянули, которые MySQL API вы используете, я не добавлял никаких функций санитарной обработки еще. Вы можете посмотреть на http://php.net/mysqli_real_escape_string

+0

Если имя не определено - запрос не сработает – alfasin

+0

Нет, это не так, можете ли вы сказать мне, как это сделать? –

+0

Теперь, когда вы добавили свое «быстрое грязное исправление», это не подведет. – alfasin

0

Я думаю, что это может помочь вам:

if(isset($_POST)){ 
    $sql = "SELECT * FROM members"; 

if($_POST['FirstName_S'] !== ''){ 
    $sql .= " WHERE FirstName LIKE '%" . $_POST['FirstName_S'] . "%'"; 
} 
else { 
    $sql .= " WHERE FirstName LIKE '%'"; 
} 
if($_POST['LastName_S'] !== ''){ 
    $sql .= " OR LastName LIKE '%" . $_POST['LastName_S'] . "%'"; 
} 
if($_POST['Firm_S'] !== ''){ 
    $sql .= " OR Firm LIKE '%" . $_POST['Firm_S'] . "%'"; 
} 
if($_POST['Country_S'] !== ''){ 
    $sql .= " OR Country LIKE '%" . $_POST['Country_S'] . "%'"; 
} 
if($_POST['City_S'] !== ''){ 
    $sql .= " OR City LIKE '%" . $_POST['City_S'] . "%'"; 
} 
if($_POST['State_S'] !== '' AND $_POST['State_S'] !== 'other'){ 
    $sql .= " OR State LIKE '%" . $_POST['State_S'] . "%'"; 
} 

}

и для инъекций SQL, вы можете проверить General_Twyckenham комментарий.

2

сделать это можно, как следовать

if(isset($_POST)){ 
     $sql = "SELECT * FROM members WHERE"; 

    if($_POST['FirstName_S'] !== ''){ 
     $sql_arr[]=" FirstName LIKE '%" . $_POST['FirstName_S'] . "%'"; 

    } 
    if($_POST['LastName_S'] !== ''){ 
     $sql_arr[]= " LastName LIKE '%" . $_POST['LastName_S'] . "%'"; 
    } 
    if($_POST['Firm_S'] !== ''){ 
     $sql_arr[]= " Firm LIKE '%" . $_POST['Firm_S'] . "%'"; 
    } 
    if($_POST['Country_S'] !== ''){ 
     $sql_arr[]= " Country LIKE '%" . $_POST['Country_S'] . "%'"; 
    } 
    if($_POST['City_S'] !== ''){ 
     $sql_arr[]= " City LIKE '%" . $_POST['City_S'] . "%'"; 
    } 
    if($_POST['State_S'] !== '' AND $_POST['State_S'] !== 'other'){ 
     $sql_arr[]= " State LIKE '%" . $_POST['State_S'] . "%'"; 
    } 
    if(!empty($sql_arr)){ 
     $sql.=implode(' OR ',$sql_arr); 
} 

    } 
+0

+1 Мне нравится ваше использование impode! – alfasin

1
$stmt = $dbConnection->prepare('SELECT * FROM members WHERE FirstName LIKE ? OR LastName LIKE ? OR FIRM LIKE ? OR Country LIKE ? OR CITY LIKE ? OR STATE LIKE ?'); 


if($_POST['FirstName_S'] !== ''){ 
    $stmt->bind_param('FirstName', '%'.$_POST['FirstName_S'].'%'); 
} else { 
    $stmt->bind_param('FirstName', '%'); 
} 

… // do this for all your parameters 

$stmt->execute(); 
2

Быстрое исправление добавить 1=1 к вашему запросу, так что ваш запрос заканчивается WHERE 1=1. Это позволяет вам добавлять любое количество OR something к вашему запросу, не опасаясь опускать OR на первый.

(Это 1 = 1 предикат не вызывает никаких проблем,., Которые будут оценены во время синтаксического анализа, и не появляется в плане исполнения)

Как для SQL инъекций, да, этот код восприимчивый. Если вы используете интерфейс mysql, то дезинфицируйте почтовые переменные с помощью функции mysql_real_escape_string. Если вы используете mysqli или PDO (и вы должны быть), используйте параметризованные запросы.

0

Вы могли бы составить команду WHERE, основываясь на том, что параметры вводятся ...

if(isset($_POST)){ 
    $sql_where = ''; 
    $sql = "SELECT * FROM members "; 

    if($_POST['FirstName_S'] !== ''){ 
     $sql_where .= (($sql_where != '')?('OR '):(''))." FirstName LIKE '%" . $_POST['FirstName_S'] . "%' "; 
    } 
    if($_POST['LastName_S'] !== ''){ 
     $sql_where .= (($sql_where != '')?('OR '):(''))." LastName LIKE '%" . $_POST['LastName_S'] . "%' "; 
    } 
    if($_POST['Firm_S'] !== ''){ 
     $sql_where .= (($sql_where != '')?('OR '):(''))." Firm LIKE '%" . $_POST['Firm_S'] . "%' "; 
    } 
    if($_POST['Country_S'] !== ''){ 
     $sql_where .= (($sql_where != '')?('OR '):(''))." Country LIKE '%" . $_POST['Country_S'] . "%' "; 
    } 
    if($_POST['City_S'] !== ''){ 
     $sql_where .= (($sql_where != '')?('OR '):(''))." City LIKE '%" . $_POST['City_S'] . "%' "; 
    } 
    if($_POST['State_S'] !== '' AND $_POST['State_S'] !== 'other'){ 
     $sql_where .= (($sql_where != '')?('OR '):(''))." State LIKE '%" . $_POST['State_S'] . "%' "; 
    } 
    $sql .= (($sql_where != '')?('WHERE '.sql_where):('')); 
} 
Смежные вопросы