2014-01-09 2 views
1

Я создаю массив из флажков, которые «проверяются» через JS.PHP, передающий массив в SQL-запрос

Простые Флажки:

 <div class="checkbox"> 
      <label> 
      <input type="checkbox" name="checkSearch[]" value="One" checked /> One 
      </label> 
     </div> 
     <div class="checkbox"> 
      <label> 
      <input type="checkbox" name="checkSearch[]" value="Two" checked /> Two 
      </label> 
     </div> 
     <div class="checkbox"> 
      <label> 
      <input type="checkbox" name="checkSearch[]" value="Three" checked /> Three 
      </label> 
     </div> 

JS:

 var selectedItems = []; 
     $('input[type="checkbox"]:checked').each(function() { 
       selectedItems .push($(this).val()); 
     }); 

     //passing array in a function 
     searchLocations(pass1, pass2, selectedItems); 

На данный момент, что выводимый (предполагается, что все три Флажки "проверено"):

["Один", "Tw o "," Three "];

Вот где я не совсем уверен, что должно произойти дальше?

Могу ли я включить массив в виде строки URL и использовать функцию PHP .implode позже в моей инструкции SQL?

Вот что я пробовал:

function searchLocations(pass1, pass2, selectedItems) { 
var searchUrl = 'searchLocations.php?pass1=' + pass1 + '&pass2=' + pass2 + '&selectedItems=' + selectedItems; 
... 
} 

searchLocations.php

$pass1 = $_GET['pass1']; 
$pass2 = $_GET['pass2']; 
$selectedItems = $_GET['selectedItems']; 
$selectedItems = " '".implode("', '", $selectedItems)."' "; 

$query = sprintf("SELECT * FROM dbtable WHERE pass1 = $pass1 AND pass2 = $pass2 AND selectedItems IN ($selectedItems)"); 

$ SelectedItems нужно читать, как это в запросе SQL: IN ('One', «Два ',' Three ').

+1

Я уверен, что 'sprintf()' дезактивирует параметры '$ _GET' –

+1

Ваш' $ _GET ['selectedItems'] 'is * not * массив. Это строка. Посмотрите на 'var_dump ($ _ GET ['selectedItems']);'. Возможно, вам сначала понадобится 'explode()' it. Вы также можете использовать jQuery для создания строки запроса для вас: 'var searchUrl = 'searchLocations.php?' + $ Param ({pass1: pass1, pass2: pass2, selectedItems: selectedItems});' Если вы сделаете это, тогда $ _GET ['selectedItems'] 'будет массивом, и ваш код должен работать. –

+2

Почему вы используете 'sprintf', без каких-либо'% s'? Это очень опасный *** код. Вы должны использовать подготовленные заявления или, по крайней мере, на самом деле * экранирование * входов. –

ответ

1

Определите функцию, которая разрывает и позволяет обернуть элементы:

function implode_wrapped($before, $after, $glue, $array) 
{ 
    $out = ''; 
    foreach ($array as $item){ 
     $out .= $before.$item.$after.$glue; 
    } 

    return substr($out, 0, -strlen($glue)); 
} 

Вы можете делать такие вещи, как ....

Implode значения массива и добавить в строку запроса:

implode_wrapped('selectedItems[]=', '', '&amp;', $items); 

Обратите внимание, что я использую 'SelectedItems []'. Ваша функция-функция searchLocations() - в ее текущей форме: не отправка выбранных элементов в виде массива.

взрывать и использовать с SQL:

implode_wrapped("'", "'", ',', $items); 

Обратите внимание, что вам необходимо дезинфицировать любые значения, которые будут посланы на SQL или будет быть взломан.

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