2015-02-27 3 views
0

Итак, у меня есть некоторые данные, поступающие через POST из формы с большим количеством флажков, и я пытаюсь найти записи в базе данных, которые соответствуют проверенным параметрам. Существует четыре набора флажков, каждый из которых отправляется как массив. Каждый набор флажков представляет собой один столбец в базе данных, а значения из отмеченных ящиков хранятся в виде строки с разделителями-запятыми. Значения, которые я ищу, не обязательно будут последовательно, а не одно значение LIKE%% Я думаю, что мне нужно разбить его на ряд операторов LIKE, связанных с AND. Вот что я получил:Как я могу динамически построить параметризованный запрос для RedBeanPHP 4?

$query = ""; 
     $i = 1; 
     $vals = []; 
     foreach($_POST["category"] as $val){ 
      $query .= "category LIKE :cat".$i." AND "; 
      $vals[":cat".$i] = "%".$val."%"; 
      $i++; 
     } 
     $i = 1; 
     foreach($_POST["player"] as $val){ 
      $query .= "player LIKE :plyr".$i." AND "; 
      $vals[":plyr".$i] = "%".$val."%"; 
      $i++; 
     } 
     $i = 1; 
     foreach($_POST["instrument"] as $val){ 
      $query .= "instrument LIKE :inst".$i." AND "; 
      $vals[":inst".$i] = "%".$val."%"; 
      $i++; 
     } 
     $i = 1; 
     foreach($_POST["material"] as $val){ 
      $query .= "material LIKE :mat".$i." AND "; 
      $vals[":mat".$i] = "%".$val."%"; 
      $i++; 
     } 
     $query = rtrim($query, " AND "); 

     $tubas = R::convertToBeans("tuba", R::getAll("SELECT * FROM tuba WHERE ".$query, $vals)); 

Это, кажется, работает в моем предварительном тестировании, но это лучший способ сделать это? Будет ли безопасно использовать SQL-инъекцию? Спасибо!

ответ

1

Пока вы используете параметризованные запросы (как и вы), вы должны быть в безопасности от SQL-инъекции. Есть крайние случаи, хотя использование UTF-7 PDO уязвимо (я думаю, что redbean основан на PDO)

Я бы сменил код на что-то вроде этого, сводя к минимуму беспорядок foreach.

$query = 'SELECT * FROM tuba'; 
$where = []; 
$params = []; 

$checkboxes = [ 
    'category', 
    'player', 
    'instrument', 
    'material' 
]; 

foreach ($checkboxes as $checkbox) { 
    if (!isset($_POST[$checkbox])) { 
     // no checkboxes of this type submitted, move on 
     continue; 
    } 
    foreach ($_POST[$checkbox] as $val) { 
     $where[] = $checkbox . ' LIKE ?'; 
     $params[] = '%' . $val . '%'; 
    } 
} 

$query .= ' WHERE ' . implode($where, ' AND '); 

$tubas = R::convertToBeans('tuba', R::getAll($query, $params)); 
+0

RedBean действительно использует PDO. Я рассмотрю PDO UTF-7. Спасибо, что бросил мне кое-какие знания! Это намного чище. –

+1

@Dave np, рад помочь. Протестировано redbean некоторое время назад, это интересно :) – JimL

+0

Я копаю. Отлично подходит для быстрого развития. –

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