У меня есть страница, на которой нужно сделать шесть почти одинаковых запросов, причем единственной разницей между ними является значение "category":
$query = "SELECT * FROM table_name WHERE category="CATEGORY1";
Вместо того, чтобы выписывать шесть разных переменных $query ($ query1, $query2 и т.д.) для каждой другой категории, я бы хотел сокращать, поэтому я могу передавать категорию как переменную каждый раз, когда я создаю $query, например так:
$query = "SELECT * FROM table_name WHERE category='$cat'";
$results= mysql_query($query,'CATEGORY1');
Должен быть какой-то способ сделать это, но я просто не могу найти синтаксис в любом месте для передачи переменной в запрос MySQL таким образом (я проверил php.net, этот сайт, различные другие ресурсы php в Google), Может ли кто-нибудь помочь мне?
Большое спасибо, спасибо!
Вы можете использовать sprintf
для этого:
$query = "SELECT * FROM table_name WHERE category='%s'";
$results= mysql_query(sprintf($query,'CATEGORY1'));
Вы не можете использовать одну переменную в SQL для представления списка, разделенного запятыми, как я бы использовал для таких ситуаций, как значения для предложения IN. Вам нужно использовать динамический SQL, что означает создание запроса в виде строки перед отправкой в базу данных.
$array = array('category1', 'category2', 'category3');
$comma_separated = implode("','", $array);
$query = "SELECT *
FROM table_name
WHERE category IN ('$comma_separated')";
$results = mysql_query($query);
Альтернативой может быть использование синтаксиса Microsoft Prepared Statement, который является синтаксисом динамического SQL MySQL...
Используйте PDO и подготовленные заявления
$categories = array(
'CATEGORY1',
'CATEGORY2',
'CATEGORY3',
'CATEGORY4',
'CATEGORY5',
'CATEGORY6'
);
$db = new PDO(...);
$stmt = $db->prepare('SELECT * FROM table_name WHERE category = :category');
$stmt->bindParam('category', $category);
foreach ($categories as $category) {
$stmt->execute();
while ($row = $stmt->fetch(PDO::FETCH_ASSOC)) {
// do stuff with $row
}
}
?
заполнители и просто передать параметры в виде списка->execute()
.