2015-10-07 58 views
-2

我有这样的代码,该代码工作:PHP的foreach只有在if语句

$productID = $_POST['productID']; 

$sql_product="SELECT * FROM cc_menu_customizations WHERE cust_asoc='$productID'"; 
$stmt_product = $conn->prepare($sql_product); 
$stmt_product->execute();   
$result_product = $stmt_product->setFetchMode(PDO::FETCH_ASSOC); 

if($result_product > 0) { 
     while($row = $stmt_product->fetch()) { 
      $menuArr[$row['cust_title']][] = '<li class="item-inmodal-extra-wrap-options"><p>'. $row['cust_desc'] .'<p></li>'; 
     } 
     foreach($menuArr as $menuTitle => $productArr) { 
      echo '<div class="item-inmodal-extra"><h3>'. $menuTitle .'</h3><ul class="item-inmodal-extra-wrap">'; 
      foreach($productArr as $key =>$productname) { 
       echo $productname; 
      } 
     echo '</ul></div>'; 
    } 
} 

有时候查询会发现$productID,有时结果没有。但我不知道是什么原因,如果查询没有找到结果阿帕奇仍然给我的错误有关foreach不存在变量$menuArr ...

不应该这个变量只能是积极的,如果if声明真正?

编辑

最终结果......好?

$productID = $_POST['productID']; 

$sql_product = "SELECT * FROM cc_menu_customizations WHERE cust_asoc= ?"; 
$stmt_product = $conn->prepare($sql_product);  

$sql_count="SELECT count(*) FROM cc_menu_customizations WHERE cust_asoc='$productID'"; 
$countResult = $conn->query($sql_count); 

if($countResult->fetchColumn() > 0) { 

    $stmt_product->bindParam(':cust_asoc', $productID); 
    $stmt_product->execute(array($productID)); 
    $stmt_product->setFetchMode(PDO::FETCH_ASSOC); 

    while($row = $stmt_product->fetch()) { 
     $menuArr[$row['cust_title']][] = '<li class="item-inmodal-extra-wrap-options"><p>'. $row['cust_desc'] .'<p></li>'; 
    } 
    foreach($menuArr as $menuTitle => $productArr) { 
     echo '<div class="item-inmodal-extra"><h3>'. $menuTitle .'</h3><ul class="item-inmodal-extra-wrap">'; 
     foreach($productArr as $key =>$productname) { 
      echo $productname; 
     } 
     echo '</ul></div>'; 
    } 
} 

echo '<div class="item-inmodal-extra"> 
      <h3>Special Instructions</h3> 
      <textarea class="item-inmodal-extra s-intructions" placeholder="Please explicitly state any allergies you have. Requests incurring additional cost are fulfilled at merchant&#39;s discretion"></textarea> 
     </div>'; 
+0

注意前两行的SQL注入,并学习如何使用预准备语句。 – Raptor

+3

检查行数而不是'$ result_product> 0' –

+0

yeaaahhh它的工作原理! rowCount()感谢队友 –

回答

1

除了安全问题,下面的问题的答案。你的评论者是正确的,你应该使用绑定参数,并做所有适当的消毒,但这是另一个问题一起。

应该是:

<?php 
$productID = $_POST['productID']; 

$sql_product="SELECT * FROM cc_menu_customizations WHERE cust_asoc='$productID'"; 

$sql_count="SELECT count(*) FROM cc_menu_customizations WHERE cust_asoc='$productID'"; 
$countResult = $conn->query($sql_count) 

if($countResult->fetchColumn() > 0) { 
    $stmt_product = $conn->prepare($sql_product); 
    $stmt_product->execute();   
    $result_product = $stmt_product->setFetchMode(PDO::FETCH_ASSOC); 

    while($row = $stmt_product->fetch()) { 
     $menuArr[$row['cust_title']][] = '<li class="item-inmodal-extra-wrap-options"><p>'. $row['cust_desc'] .'<p></li>'; 
    } 

    foreach($menuArr as $menuTitle => $productArr) { 
     echo '<div class="item-inmodal-extra"><h3>'. $menuTitle .'</h3><ul class="item-inmodal-extra-wrap">'; 
     foreach($productArr as $key =>$productname) { 
      echo $productname; 
     } 

     echo '</ul></div>'; 
    } 
} 

PDOStatement::rowCount

对于大多数数据库,PDOStatement对象:: rowCount时()不返回受SELECT语句的行数。相反,使用PDO :: query()发出一个SELECT COUNT(*)语句,其谓词与您想要的SELECT语句相同,然后使用PDOStatement :: fetchColumn()来检索将返回的行数。然后您的应用程序可以执行正确的操作。

+0

好的工作,请检查我的编辑,看看现在是否更安全 –