2015-01-13 4 views
1

Я уже смог построить запрос mySQL с помощью блоков выбора. Начиная с ajax для PHP, например.Построить mySQL-запрос из динамических полей выбора

HTML/JS (соответствующие части)

var call = true; 
    switch(parseInt($(this).val())) { 
    case 1: 
    cat_code ="ager"; 
     sortv = "database_percent"; 
     sorto = "asc"; 
    break; 
    case 2: 
    cat_code ="ager"; 
     sortv = "database_percent"; 
     sorto = "desc"; 
    break; 
    default: 
    cat_code ="ager"; 
     sortv = "value"; 
     sorto = "asc"; 

    break; 
} 
if(call) { 
$.ajax({ 
     url: 'all_get_2.php', 
     type: 'GET', 
     dataType: 'JSON', 
     data: {cat_code: cat_code, sortvalue: sortv ,sortorder:sorto}, 
     success: function(data) { 
//stuff 
} 
}) 

PHP (соответствующие части ... просто пример)

$whereCategory = isset($_GET['cat_code'])? "{$_GET['cat_code']}" : ''; 
$sortvalue = isset($_GET['sortvalue'])? "{$_GET['sortvalue']}" : ''; 
$sortorder = isset($_GET['sortorder'])? "{$_GET['sortorder']}" : ''; 
$sql = "select count(guid) from full_db2 where '{$whereCategory}' = '{$sortvalue}'' and example = '{$sortorder};"; 

$result = $dbh->query($sql)->fetchAll(PDO::FETCH_ASSOC); 
header('Content-type: application/json'); 
echo json_encode($result); 

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

Что делать, если бы я хотел, чтобы пользователи могли выбрать набор дополнительных атрибутов для добавления в запрос. Так, например, вместо того, чтобы найти счетчик для количества записей в базе данных (пользователей), возраст которых превышает 40, они могли бы добавить к этому больше, например, пользователи с возрастом старше 40 лет и состоящие в браке и имеющие детей.

Я рассмотрел в основном добавление опции для добавления другого набора полей выбора (например, нажмите «+» и появится новый набор), но я быстро понял, что не смог бы выяснить, сколько из них выбрано там и логичный способ создания запроса.

Каков наилучший способ разрешить пользователям выбирать (теоретически) неограниченное количество атрибутов для построения в одном запросе mySQL?

+0

Примечание стороны. Вы слышали о ['SQL Injenction'] (http://php.net/manual/en/security.database.sql-injection.php)? –

+0

@ PM77-1 К сожалению, да, и просто читал о них. Я совершенно новый с PHP, поэтому я до сих пор не совсем понял, как обновить (например) приведенный выше код, чтобы предотвратить это. Мы ценим любые предложения. – jonmrich

+2

Вы не знаете, сколько элементов ... первое, что приходит в голову, это 'array'. Вы можете указать каждый флажок с тем же именем, используя флажок «name =» [] «. Таким образом вы отправляете список со значениями на сервер, а затем используете php для получения необходимых значений. В php вы можете использовать '$ data = $ _GET ['field_name'];' для получения массива со значениями. –

ответ

0

Я бы использовал теги HTML <select> & <option>, чтобы представить различные условные операторы SQL (AND, OR, >, <, =, !=) вместе с вашими именами полей/таблиц, а затем объединить их вместе, чтобы построить ваш запрос.

Как упоминалось в комментариях, вы можете использовать возможности массива, такие как name="checkbox[]", и отправить его как HTML-форму (POST или GET), чтобы упростить конкатенацию.

Вы хотите избежать и дезинформировать все, что отправлено в базу данных, чтобы избежать SQL-инъекций, поскольку HTML-страницы могут редактироваться на стороне клиента. Без санитизации вся ваша база данных будет доступна для опытного пользователя. Это может быть так же просто, как проверка того, что содержимое массива совпадает с фактическими именами таблиц или одним из условных операторов, а затем отбрасывается, если оно не совпадает. Исключение с использованием mysqli::escape_string (http://php.net/manual/en/mysqli.real-escape-string.php) также является хорошей идеей.

0

Мне пришлось переделать этот вопрос после того, как я смог выяснить несколько вещей. Вот как я прогрессировал и проверить принятый ответ, чтобы увидеть, как все это делается вместе:

Create array for PDO from variables passed from jquery

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