我是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
,现在效果很好。添加这个以防万一有人像我一样迷失。
答案 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
循环是更好的方法。