使用PDO从MySQL获取并循环数据

时间:2014-02-15 16:36:52

标签: php mysql pdo

我想循环遍历数据库中的所有行并将它们显示给用户,但我只是在输出中获得第一行。

这是我的代码::

查询功能:

public function query($sql, $params = array()) {
    $this->_error = false;
    if($this->_query = $this->_pdo ->prepare($sql)) {
        $x = 1;
        if(count($params)) {
            foreach ($params as $param) {
                $this->_query->bindValue($x,$param);
                $x++;
            }
        }

        if($this->_query->execute()) {
            $this->_results = $this->_query->fetchAll(PDO::FETCH_OBJ);
            $this->_count =$this->_query->rowCount();
            } else {
                $this->_error = true;
            }

        }
        return $this;
    }


public function results() {
    return $this->_results;
}

我的查询:

$search = DB::getInstance()->query("SELECT * FROM staff_info WHERE staff_id = ?",array(
Input::get('staff_id')));

if($search->count()){
if($search) {
    $search_result = $search->results();
    foreach ($search_result as $val) {
        $fname = $val->fname;
        $surname = $val->surname;
        $street = $val->street;

        echo '<div class="table-responsive table-bordered">
        <table class="table">
        <tr>
        <td><a href="index.php?ad=profile">'.$fname.'</a></td>
        <td><a href="index.php?ad=profile">'.$surname.'</td>
        <td><a href="index.php?ad=profile">'.$street.'</td>
        </tr>
        </table>
        </div>';
    }
}

问题是 - 即使数据库中还有更多其他行,我也只获得第一行。任何想法为什么会发生这种情况?

2 个答案:

答案 0 :(得分:0)

你错过了下划线。

在查询功能中,您将输出存储在$this->_results中。您需要在循环之前更正变量名称。 $search->_results

答案 1 :(得分:0)

使用PDO方法prepare(),执行()&amp; fetchAll()或fetch()。请注意,我已调用我的方法findAll(),以免将其与PDO fetchAll()混淆。以下代码基于我的用法。

在课堂上

对于所有结果

public function findAll($sql,$param) {
    $query = $this->dbh->prepare($sql);
    if(is_array($param)){
        $query->execute($param);//1 parameter
    }else { 
        $query->execute(array($param));// >1 parameters
    }
    $rows = $query->fetchAll();
        if($rows){
          return $rows;
        }
    }
  }

一个结果

public function findOne($sql,$param) {
        $query = $this->dbh->prepare($sql);
        if(is_array($param)){
            $query->execute($param);//1 parameter
        }else { 
            $query->execute(array($param));// >1 parameters
        }
        $row = $query->fetch();
            if($row){
              return $row;
            }
        }
      }

用法

$params=array(100,"AK");
 $sql1 = "SELECT * FROM users WHERE id < ? AND state = ?";
 $rows = $dao->findAll($sql,$params);
 foreach($rows as $row){//Remove for 1 result
    echo $row['firstname'];
    etc.....

如果您只想查找一条记录,则可以在新方法中将fetchAll()替换为fetch(),而只使用foreach()

进行回显