2012-02-10 3 views
0

Я хочу, чтобы сделать запрос, подобный следующему:Запрос MySQL с пунктом при помощи PHP

SELECT f_name, l_name, title from 
-> employee_data where title 
-> IN ('Web Designer', 'System Administrator'); 

поиска термины, полученные в массиве $data = ['Web Designer', 'System Administrator'] и теперь я могу превратить этот массив в Web Designer,System Administrator с помощью:

$data = implode(',', $data) 

есть хороший способ, чтобы превратить этот массив в 'Web Designer', 'System Administrator', так что я могу вставить эту фразу в запросе MySQL напрямую, как показано в начале поста?

+2

Я предполагаю, что вы также хотите защитить себя от SQL-инъекций, но просто забыл упомянуть i t, правильно? –

+0

Как защитить себя от SQL-инъекций? Извините, что я новичок в этом – Nyxynyx

+0

@Nyxynyx: прочитайте с использованием [PDO] (http://php.net/manual/en/book.pdo.php) и [подготовленных запросов] (http: //www.php .net/manual/en/pdo.prepare.php) в частности. – Leigh

ответ

4

Вы, вероятно, следует использовать:

$data = implode(', ', array_map($data, array($object, 'escape'))); 
$query .= 'title IN (' . $data . ')'; // Append to condition 

Где $object->escape() бы по функции, как:

public function $escape($string){ 
    return "'" . mysql_real_escape_string($string, $this->connection) . "'"; 
} 

Вот array_map() документация и mysql_real_escape_string(). Это должно быть SQL injection доказательство решения.

0

Конечно, вы можете

$data = "'" 
     .implode("','", $data). 
     "'"; 

это немного нечитаемым, но это работает. Также убедитесь, что $data не является пользовательскими данными, или если да, убедитесь, что он дезинфицирован.

0

изменить запрос так:

$query = 'SELECT f_name, l_name, title from 
     -> employee_data where title 
     -> IN (\'' . implode('\', \'', $data) . '\')'; 
1

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

$data = array('Web Designer', 'System Administrator'); 
$query_include = "'".implode("','",$data)."'"; 
$query ="SELECT f_name, l_name, title from 
      employee_data where title 
      IN ($query_include);"; 

, как Vyktor отметил, что SQL инъекция может произойти, и я полностью согласен с тем, не изменяя код выше я своего рода препендом этот код до выше

function clean(&$item) { 
    $item = mysql_real_escape_string($item); 
} 
array_walk($data,"clean"); 
+0

Как появилась инъекция sql, сделайте что-нибудь об этом :) – Vyktor

+0

oh yes thats right forget чтобы справиться с этим. Спасибо Vyktor. Редактирование моего ответа сейчас. У меня есть статья, посвященная этой проблеме. почти в строке http://jaspreetchahal.org/php-add-wrap-single-quote-around-all-array-values-separated-by-comma-in-php/ –

+0

Да, это лучше ... Это очень аналогично моему подходу.) – Vyktor

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