2010-11-16 2 views
0

У меня есть страница, которая должна сделать шесть почти одинаковые запросы, с той лишь разницей между ними является значением «категории»:Как аббревиатура MySQL запросов в PHP?

$query = "SELECT * FROM table_name WHERE category="CATEGORY1"; 

Вместо того, чтобы писать шесть различных переменных $ запроса ($ Query1, $ Query2 и т.д.) для каждой отдельной категории, я хотел бы сокращайте так что я могу перейти в категорию в качестве переменной каждый раз, когда я создаю экземпляр $ запрос, например:

$query = "SELECT * FROM table_name WHERE category='$cat'"; 
$results= mysql_query($query,'CATEGORY1'); 

Там должен быть какой-то способ сделать это, но я просто не могу найти синтаксис в любом месте для передачи переменной в запрос MySQL таким образом (я проверил php.net, этот сайт, vario другие ресурсы php в Google). Может кто-нибудь мне помочь?

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

+0

Это первобытный Прецедент для подготовленных заявлений. Это очень просто, если вы используете '?' Placeholders и просто передаете параметры как список в '-> execute()'. – mario

+0

"Первобытный"? Это не так. – staticsan

ответ

0

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

$query = "SELECT * FROM table_name WHERE category='%s'"; 
$results= mysql_query(sprintf($query,'CATEGORY1')); 
+0

Это то, что я искал! Спасибо всем. – Chris

3

Использование PDO и prepared statements

$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 Да, но это утверждение только готовится/компилируется один раз. В OP каждый оператор будет составляться отдельно. – Phil

+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); 

В качестве альтернативы можно использовать MySQL's Prepared Statement syntax, который динамический синтаксис SQL в MySQL ...

+0

Не забудьте стартовые и конечные цитаты ;-) – Phil

+0

@Phil Brown: Спасибо, исправлено. –

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