Mysqli准备查询不起作用

问题描述:

我正在从数据库中提取图像。我写了下面给出的PHP脚本,只有while循环工作中的“echo”语句,但变量不显示来自数据库的值。换句话说,只有html正在工作。Mysqli准备查询不起作用

这里没有任何错误。 我不知道这是什么问题。

帮帮我。 谢谢!

$db_username = 'xxxxx'; 
$db_password = 'xxxx'; 
$db_name = 'xxxx'; 
$db_host = 'localhost'; 
$item_per_page = 9; 

$mysqli = new mysqli($db_host, $db_username, $db_password, $db_name); 
if ($mysqli->connect_error) { 
    die('Error : ('. $mysqli->connect_errno .') '. $mysqli->connect_error); 
} 

$page_number = filter_var($_POST["page"], FILTER_SANITIZE_NUMBER_INT, FILTER_FLAG_STRIP_HIGH); 

if(!is_numeric($page_number)){ 
    header('HTTP/1.1 500 Invalid page number!'); 
    exit(); 
} 

$position = (($page_number-1) * $item_per_page); 

$results = $mysqli->prepare("select * FROM inserting_discount_product ORDER BY id DESC LIMIT ?, ?"); 

$results->bind_param("dd", $position, $item_per_page); 

$results->execute(); //Execute prepared Query 

$results->bind_result($pro_id, $pro_title, 
$pro_cat,$pro_desc,$pro_price,$pro_img,$pro_discount_price,$pro_discount_percent 
age,$product_code); 


while($results->fetch()){ 
       echo " 
       <div id='$pro_id' class='col-md-3 col-sm-4 col-xs-12'> 

       <h3 style='color:black'; align='center'>$pro_title</h3> 
       <div> 

       <img src='../admin_area/product_images/product_pics/$pro_img' width='180' height='180' /> <br> 
       </div> 


       <p style='color:black;margin-right:12px'><b>Price: $ $pro_discount_price </b> 

       <span style='color:black;text-decoration:line-through;margin-left:15px'> 
       <b style='color:red'>Price: $ $pro_price</b> 
       </span> 

       </p> 

       <a href='details.php?pro_id=$pro_id' style='margin-right:10px' class='detail_hover'><b>Details</b></a> 
       <span style='font-weight:bolder'>$pro_discount_percentage %</span> 
       <a href='index.php?add_cart=$pro_id&product_code=$product_code' style='color:orange;margin-left:10px' class='basket-logo'> 
       <span class='fa fa-shopping-cart fa-2x'></span></a> 


        </div> 

       "; 

} 

将您的prepare语句放入IF中是一种很好的做法,因为如果失败,prepare可以返回一个布尔值。

if($results = $mysqli->prepare("select * FROM inserting_discount_product ORDER BY id DESC LIMIT ?, ?")) 
     { 
      $results->bind_param("dd", $position, $item_per_page); 

      $results->execute(); //Execute prepared Query 

      $results->bind_result($pro_id, $pro_title, 
      $pro_cat,$pro_desc,$pro_price,$pro_img,$pro_discount_price,$pro_discount_percentage,$product_code); 

      while($results->fetch()) 
      { 
       // ... stuff 
      } 
      $results->close(); 
     } 
     else { echo $mysqli->error; } 

您应该也可能显式声明在SELECT中的返回列而不是使用*。在这一行中,您可能会在表中添加一列,并且如果您正在执行SELECT *,则所有代码都会中断,因为查询将返回的列数多于bind_result中的变量数。

+0

与您建议的一个relacing语法后加入的,而不是列名“*”我得到这个错误 “用尽67108864个字节允许内存大小(试图分配4294967296个字节)” –

+0

好吧,我已经看到了在此之前的错误。原因是你的表的定义,你试图选择的一个列是一个非常大的类型。我在使用LONGTEXT类型代替TEXT时得到了它。 –

在这里看到:

What is the difference between single-quoted and double-quoted strings in PHP?

这与你的echo语句您的报价问题。你有一个双引号和单引号的组合。在PHP单引号将显示的东西,因此你的变量不会被显示。因此,您的回声声明需要分解为多个串接,以便正确显示您想要的内容。请注意,PHP使用点运算符来连接。

例如:

echo "<div id='".$pro_id."' class='col-md-3 col-sm-4 col-xs-12'> 

的原因有没有任何错误,因为它假定所有的变量,你是呼应了应呼应纯文本所以它字面上写“$ pro_id”来html作为元素的id而不是变量是什么。

或者,您的标记是很多html。您可以将您的整个while循环为HTML和使用PHP的简码,让您的变量,在环如下:

while($results->fetch()){ 
    //End php here, go into HTML markup. 
    ?> 

    <div id='<?=$pro_id?>' class='col-md-3 col-sm-4 col-xs-12'> 

    ... 

    <?php 
//Don't forget to add the closing brace to the while loop back in <?php 
} 

此方法使用PHP的速记符号在这里看到:在HTML标记这回声PHP变量的页面,而。这减少了你必须处理的引号和字符串的数量,并且更容易处理,因为这是直接的HTML。如果大多数内容将使用HTML(它是),并且您只需添加一些PHP变量,那么我肯定会推荐关闭您的PHP?>并使用简写。

+0

只是为了记录:没有编辑可以挽救这个答案,这与问题*和*本身是错误的无关 –