使用PDO的类和方法,以及检索数据

时间:2017-04-10 08:32:28

标签: php oop pdo

我是OOP编程的新手,我真的迷失了这个标题所说的内容。当我尝试将查询放在一个类和另一个文件中时,我在一个名为Main.php的文件中出错,甚至不知道如何解决它们:

  

注意:未定义的变量:第10行的Select.php中的......

     

致命错误:无法访问第10行的Select.php中的空属性

如果我把select放在Connection.php中,它会很好地返回行,但是对于类,我会得到那些。

这是我的代码:

Connection.php:

<?php
$hostname = 'localhost';
$username = 'user';
$password = 'pass';

function connectDB ($hostname, $username, $password){
    $dbh = new PDO("mysql:host=$hostname;dbname=database", $username, $password);
    return $dbh;
}

$dbh = connectDB ($hostname, $username, $password);
echo 'Connected to database <br/>';

Select.php:

<?php require_once 'Connection.php';
class Select {

    public function select() {
        $sql= "select * from table limit 10; <br/>";
        echo $sql;
        $select = $dbh->query($sql)->fetchall(PDO::FETCH_ASSOC);

        foreach($this->$sth as $row){
            echo $row['column']."<br/>";
        }
    }
}

问题是,我如何打印查询结果(例如来自main.php,它有一个自动加载器),为什么我会得到这些错误,当在一个文件上时,它们工作得很好?< / p>

编辑:

<?php
    $test = new Select($dbh);
    echo $test->select();
?>

除了回复中的修复,我将Connection.php包含在main.php中,将Select.php中的echo更改为return,现在效果很好。添加这个以防万一有人像我一样迷失。

1 个答案:

答案 0 :(得分:0)

您不希望迭代查询,而是查询结果。所以这可能就是你要找的东西:

<?php
class Select {
    public function select() {
        $sql= 'select * from table limit 10';
        $select = $dbh->query($sql)->fetchall(PDO::FETCH_ASSOC);

        foreach($select as $row){
            echo $row['column']."<br/>";
        }
    }
}

您还需要注意$dbh对象实际存在于该方法中。将其注入对象或将其指定为方法参数。所以你的全班可能看起来像这样:

<?php
class Select {
    private $dbh;
    public function __construct($dbh) {
        $this->dbh = $dbh;
    }
    public function select() {
        $sql= 'select * from table limit 10';
        $select = $this->dbh->query($sql)->fetchall(PDO::FETCH_ASSOC);

        foreach($select as $row){
            echo $row['column']."<br/>";
        }
    }
}

你实例化那样的对象:

$selectObj = new Select($dbh);

一些常见的警告:使用PDO的fetchall()方法很方便,但是存在巨大的风险:这意味着必须将完整的结果集复制到php脚本中的数组中。对于可能导致内存使用问题的更大结果(脚本因安全原因而被终止)。通常,在每次迭代中从结果集中提取的单行上使用while循环是更好的方法。