【问题标题】:Having Issue on Fetching Rows Using MySQLi Prepared Statement使用 MySQLi Prepared Statement 获取行时遇到问题
【发布时间】:2015-07-21 14:40:52
【问题描述】:

我正在尝试使用以下准备好的语句从 MySQL 数据库中获取一些数据。但我在这里有两个问题:

1- 代码仅返回最后一行的值,但如您所见,我正在使用带有 $stmt->fetch() 的 while 迭代器

while($stmt->fetch());{
    echo  '<option value="'.$uid.'">'.$name.'</option>';
}

2 - 另一件事是当我尝试在代码 sn-p 2 处使用 if($stmt-&gt;num_rows &gt; 0){} 时,我收到 Cant' Find Data 消息!

 <?php
     $conn = new mysqli('localhost', 'root', '', 'dbmodel');
     if ($conn->connect_error) {
         die("Connection Failed: " . $conn->connect_error);
     }
     $sql = 'SELECT uid, name  FROM `single-animals-tbl`';
     $stmt = $conn->prepare($sql);
     $stmt->execute();
     $stmt->bind_result($uid,$name);
 ?> 
 <select>
     <option value="0">Select From The List</option>  
     <?php 
         while($stmt->fetch());{
             echo  '<option value="'.$uid.'">'.$name.'</option>';
         }
         $stmt->close();
         $conn->close();
     ?> 
 </select> 

sn-p 2 与if($stmt-&gt;num_rows &gt; 0){}

<?php
    $conn = new mysqli('localhost', 'root', '', 'dbmodel');
    if ($conn->connect_error) {
        die("Connection Failed: " . $conn->connect_error);
    }
    $sql = 'SELECT uid, name  FROM `single-animals-tbl`';
    $stmt = $conn->prepare($sql);
    $stmt->execute();
    $stmt->bind_result($uid,$name);
    if($stmt->num_rows > 0){
    ?> 
        <select>
            <option value="0">Select From The List</option>  
            <?php 
                while($stmt->fetch());{
                    echo  '<option value="'.$uid.'">'.$name.'</option>';
                 }
                }else {
                     echo "Cant' Find Data";
                 }
                $stmt->close();
                $conn->close();
            ?> 
        </select> 

【问题讨论】:

  • 如果 numrows 表示没有行,那么您的查询没有返回任何行...您是否尝试过直接在 mysql shell 中运行该查询?那个或查询以某种方式失败了,因为你没有检查错误,你只是盲目地假设它成功了。
  • @Marc B,感谢您的评论,表格中有绝对的行,而且正如我使用 if 语句所说的那样,我得到了最后一行
  • while 循环之前有一个;,在else 之前还有一个额外的、不必要的右大括号}
  • @scott,感谢第一部分,但我在其他部分没有得到不必要的支架!
  • 右大括号是必要的,它在if 语句之后关闭块。

标签: php mysqli prepared-statement


【解决方案1】:

至于你的第一个问题: 您的 while 循环后有一个虚假的分号。所以相当于

while($stmt->fetch())
{
    ;
}
{
    echo  '<option value="'.$uid.'">'.$name.'</option>';
}

删除它,它应该可以工作

【讨论】:

  • Thnaks Mathias Becher,多么愚蠢的错误!第二部分怎么样?
  • 第一部分是的,但第二部分没有,但是我通过在使用 if($stmt-&gt;num_rows &gt; 0){} 之前添加 $stmt-&gt;store_result(); 找到了解决方案,但我无法弄清楚这有什么关系!
【解决方案2】:

尝试使用get_result 代替bind_result 并继续使用mysqli_fetch_assoc 代替

附:这将需要安装 mysqlnd

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多