У меня есть страница, которая добавляет различные параметры к URL-адресу, который используется для запроса.
Например
http://www.example.com/search.php?category=Schools&country[]=Belgium&country[]=Czech+Republic
Мой код похож на этот
if(isset($_GET['country'])){ $cties = "'" . implode("','", $_GET['country']) . "'"; } else { $cties = "'Albania','Andorra','Austria','Belarus','Belgium','Bosnia & Herzegovina','Bulgaria','Croatia','Czech Republic','Denmark','Estonia','Faroe Islands','Finland','France','Germany','Gibraltar','Great Britain','Greece','Hungary','Iceland','Ireland','Isle of Man','Italy','Latvia','Liechtenstein','Lithuania','Luxembourg','Macedonia','Malta','Moldova','Monaco','Montenegro','Netherlands','Norway','Poland','Portugal','Serbia','Romania','San Marino','Slovakia','Slovenia','Spain','Sweden','Switzerland','Ukraine','United Kingdom'"; } if(isset($_GET['category'])){ $cat = $_GET['category']; } else{ $cat = " "; } try{ // create the Prepared Statement $stmt = $con->prepare("SELECT * FROM MyTable WHERE MyDate >= DATE(NOW()) AND (Category=:cat or '' = :cat) AND Country IN ($cties) ORDER BY MyDate ASC"); $stmt->bindValue(':cat', $cat, PDO::PARAM_STR); $stmt->execute();
Мне было интересно, безопасен ли этот запрос, а если нет, то что я делаю неправильно. Заранее спасибо!
Я, наконец, получил его (благодаря вашему здравому смыслу):
if(isset($_GET['country'])){ $arr = $_GET['country']; } else { $arr = array('Albania','Andorra','Austria','Belarus','Belgium','Bosnia & Herzegovina','Bulgaria','Croatia','Czech Republic','Denmark','Estonia','Faroe Islands','Finland','France','Germany','Gibraltar','Great Britain','Greece','Hungary','Iceland','Ireland','Isle of Man','Italy','Latvia','Liechtenstein','Lithuania','Luxembourg','Macedonia','Malta','Moldova','Monaco','Montenegro','Netherlands','Norway','Poland','Portugal','Serbia','Romania','San Marino','Slovakia','Slovenia','Spain','Sweden','Switzerland','Ukraine','United Kingdom'); } if(isset($_GET['category'])){ $cat = $_GET['category']; } else{ $cat = " "; } // create the Prepared Statement $in = str_repeat('?,', count($arr) - 1) . '?'; $sql = "SELECT * FROM MyTable WHERE MyDate >= DATE(NOW()) AND Country IN ($in) AND (Category=? or '' = ?) ORDER BY MyDate ASC"; $stmt = $con->prepare($sql); $arr[] = $cat; // adding category to array $arr[] = $cat; // we need it twice here // finally - execute $stmt->execute($arr);
Да, теперь я вижу твою проблему. Ну, PDO не слишком удобна для библиотеки для такой задачи. Итак, прежде всего, я покажу вам, как это можно сделать с моей собственной библиотекой:
$sql = "SELECT * FROM MyTable WHERE MyDate >= CURDATE() AND (Category=?s or '' = ?s) AND Country IN (?a) ORDER BY MyDate ASC" $data = $db->getAll($sql, $cat, $cat, $_GET['country']);
Но я вполне понимаю, что вы все так склонны к знакомым методам. Ну, давайте уточним с уродливым PDO
Прежде всего, какова цель? Целью является
Кажется, нам нужны два заполнителя для категории и неизвестное число городов. Хорошо, эта строка создаст строку заполнителей:
$in = str_repeat('?,', count($arr) - 1) . '?';
которые мы собираемся вставить в запрос.
// $arr is array with all the vars to bind. at the moment it contains cities only $arr = $_GET['country']; // creating string of ?s $in = str_repeat('?,', count($arr) - 1) . '?'; // building query $sql = "SELECT * FROM MyTable WHERE MyDate >= DATE(NOW()) AND Country IN ($in) AND (Category=? or '' = ?) ORDER BY MyDate ASC"; $stm = $db->prepare($sql); $arr[] = $_GET['category']; // adding category to array $arr[] = $_GET['category']; // we need it twice here // finally - execute $stm->execute($arr); $data = $stm->fetchAll();
-// $arr is array with all the vars to bind. at the moment it contains cities only $arr = $_GET['country']; // creating string of ?s $in = str_repeat('?,', count($arr) - 1) . '?'; // building query $sql = "SELECT * FROM MyTable WHERE MyDate >= DATE(NOW()) AND Country IN ($in) AND (Category=? or '' = ?) ORDER BY MyDate ASC"; $stm = $db->prepare($sql); $arr[] = $_GET['category']; // adding category to array $arr[] = $_GET['category']; // we need it twice here // finally - execute $stm->execute($arr); $data = $stm->fetchAll();
Нет, код SQL можно было бы ввести в параметр $_GET['country']
. Вы никуда не убегаете.
См. PHP PDO: Можно ли привязать массив к условию IN ()?