2016-05-17 118 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

像Blanchard先生指出的那样,您似乎无意中在您的LIKE子句中添加了2个占位符,而不是1个占位符。它应该是:

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