2016-05-17 4 views
1

Я конвертирую старые запросы MySQL/PHP на сайт. У меня есть страница с рядом флажков. Это представляется, и запрос построен на основе того, что флажки проверяются (есть, по крайней мере, 6, как следующее):Динамическое построение PHP PDO Запрос MySQL

if (xxxxx) { 
    $furthersort=$furthersort."AND age_birth='yes' "; 
    } 
if (xxxxx) { 
    $furthersort=$furthersort."AND age_three='yes' "; 
    } 

... 

$prequery = "SELECT id from products WHERE product_categories LIKE '%$catid%' ".$furthersort."ORDER BY product_name ASC"; 

Я пытаюсь переместить вторую часть этого к PHP так:

$query = $objDb->prepare("SELECT id from products WHERE product_categories LIKE ? ? ORDER BY product_name ASC"); 
$params3 = array('%$catid%',$furthersort); 
$query->execute($params3); 
while ($row = $query->fetch(PDO::FETCH_ASSOC)); 

Но это не работает. Переменные, созданные if, правильны, поэтому я уверен, что это потому, что мне не хватает понимания того, как часть подготовки интерпретирует эту информацию, но мне нужен толчок в правильном направлении.

+0

Что такое '$ furthersort', или что второе, что вы пытаетесь связать? – chris85

+1

У вас есть две вещи в 'LIKE', когда вы должны иметь ее. Вы можете объединиться в своем массиве, но не знаете, что вы конкатенируете вне своих разделителей 'LIKE'. –

+0

@JayBlanchard *** Быть мастером Конечно, имеет свое место ....; -) *** Ясно, как хрусталь .... *** Однако не все мастера делают лучшее из учителей ... *** * * Для Учителя, как и вы, почерк на стене ясен, но как насчет новорожденного с только 1 SO-репутацией ??? ** – Poiz

ответ

5

У вас есть две проблемы. Во-первых вы можете иметь только один связанный аргумент для условия LIKE, поэтому приходится констатировать, что и последующие условия:

$query = $objDb->prepare("SELECT id from products WHERE product_categories LIKE ? AND age_three = ? ORDER BY product_name ASC"); 

Теперь вы можете отправить два значения в массиве

$furthersort = 'yes'; 
$params3 = array("%$catid%", $furthersort); 

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

+0

Там !!! Прямо там ........ ** БОЛЬШОЙ ВВЕРХ !!! ** – Poiz

0

Как отметил г-н Бланшар, вы, как представляется, случайно добавили 2 места вместо одного в своем предложении LIKE. Его следует читать:

  <?php 
      // RIGHT AFTER THE LIKE YOU HAD 2 PLACE-HOLDERS: ? ? RATHER THAN JUST 1: ? 
      if (xxxxx) { 
       // YOU ARE CONCATENATING "AND" DIRECTLY TO THE $furthersort VARIABLE WITHOUT A SPACE: WRONG... 
       // $furthersort = $furthersort."AND age_birth='yes' "; 
       $furthersort = $furthersort." AND age_birth='yes' "; 
      } 
     if (xxxxx) { 
       // YOU ARE CONCATENATING "AND" DIRECTLY TO THE $furthersort VARIABLE AGAIN WITHOUT A SPACE: WRONG... 
       // $furthersort = $furthersort."AND age_three='yes' "; 
       $furthersort = $furthersort." AND age_three='yes' "; 
      } 

     ... 

     $prequery = "SELECT id from products WHERE product_categories LIKE '%"; 
     $prequery .= $catid . "%' " . $furthersort. " ORDER BY product_name ASC "; // <== WHITE SPACE IS GRATIS IN MYSQL 


     $sql  = "SELECT id from products WHERE product_categories LIKE :CAT_ID ORDER BY product_name ASC"; 
     $query  = $objDb->prepare($sql); 
     // $params3 = array('%$catid%', $furthersort);  <== VARIABLE INSIDE SINGLE QUOTES!!! YOU MAY USE DOUBLE QUOTES... 
     $params3 = array("CAT_ID"=>"%" . $catid . "%" . $furthersort); 
     $query->execute($params3); 
     while ($row = $query->fetch(PDO::FETCH_ASSOC));