Как сократить запросы MySQL в PHP?

0

У меня есть страница, на которой нужно сделать шесть почти одинаковых запросов, причем единственной разницей между ними является значение "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), Может ли кто-нибудь помочь мне?

Большое спасибо, спасибо!

  • 0
    Это первичный вариант использования готовых операторов. Что действительно просто, если вы используете ? заполнители и просто передать параметры в виде списка ->execute() .
  • 0
    «Первобытный»? Это не может быть правдой.
Теги:

3 ответа

0
Лучший ответ

Вы можете использовать sprintf для этого:

$query = "SELECT * FROM table_name WHERE category='%s'";
$results= mysql_query(sprintf($query,'CATEGORY1'));
  • 0
    Это то, что я искал! Спасибо всем.
3

Вы не можете использовать одну переменную в 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...

  • 0
    Не забывайте начальные и конечные кавычки ;-)
  • 0
    @Phil Brown: Спасибо, исправлено.
3

Используйте 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
    }
}
  • 0
    Хотя хорошо, что это параметризовано, не выполняется ли оператор по категории?
  • 0
    @OMGPonies Да, но это утверждение готовится / компилируется только один раз. В ФП каждое утверждение будет составлено отдельно.
Показать ещё 2 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню