【问题标题】:Cant get results out database oophp, mysqli无法从数据库 php、mysqli 中获取结果
【发布时间】:2011-11-15 14:39:04
【问题描述】:

我试图稍微了解 oophp,但现在我陷入了从我的数据库中获取信息的困境。我究竟做错了什么?在 PDO 提示后,我尝试了以下但也没有结果......

index.php

<?php
include('classes/database.class.php');

$db = new Database();
$db->connect();
$res = $db->select();  
print_r($res); 
?>

数据库.class.php

<?php
    class Database  {

        private $db_host = 'localhost';     // Database Host
        private $db_user = 'root';          // Gebruikersnaam
        private $db_pass = 'root';          // Passwoord
        private $db_name = 'quickscans';    // Database naam

        public function connect()
        {
            try
            {
                $db = new PDO('mysql:host='.$this->db_host.';dbname='.$this->db_name,$this->db_user,$this->db_pass);
            }
            catch(PDOException $e)
            {
                echo $e->getMessage();
            }
        }


        public function disconnect()    
        {
            $db = null;
        }  


        public function select()    
        {
            $sql = 'SELECT id FROM bedrijf';
            $results = $db->query($sql);

            foreach($results as $row)
            {
                echo $row['id'].'<br>';
            }
        }
    }  
?>

也许这段代码更干净了..但仍然没有结果:(。

【问题讨论】:

  • getResult() 返回$this-&gt;result,实际上是private $result = array(); 这么想。自己学习面向对象。
  • 您编写自己的课程而不是使用(例如)PDO 的原因是什么?
  • 是的,它是一样的,但是使用函数 select 我改变了结果......(虽然这就是想法)......
  • @KingCrunch 他说他正在学习哦。
  • 你能发布你得到的输出,如果有的话?只是想确保连接正常。

标签: php oop pdo


【解决方案1】:

您没有在此类中分配任何实例变量。

查询方法无法访问您创建的连接,因为对象没有状态。

您的类的构造函数应该创建连接,然后可以对该属性调用查询。

class Database  {

private $db_host = 'localhost';     // Database Host
private $db_user = 'root';          // Gebruikersnaam
private $db_pass = 'root';          // Passwoord
private $db_name = 'quickscans';    // Database naam

public function __construct(){
  $this->connect();
}

public function connect()
{
    try
    {
        $this->connection = new PDO('mysql:host='.$this->db_host.';dbname='.$this->db_name,$this->db_user,$this->db_pass);
    }
    catch(PDOException $e)
    {
        echo $e->getMessage();
    }
}


public function disconnect()    
{
    $this->connection = null;
}  


public function select()    
{
    $sql = 'SELECT id FROM bedrijf';
    $results = $this->connection->query($sql);

    foreach($results as $row)
    {
        echo $row['id'].'<br>';
    }
}
}  

$this 关键字设置类的实例变量,因此connection 属性成为其他方法可以操作的 PDO 实例。没有这个,在方法中创建的变量,在这种情况下 $db 只是在本地函数范围内是孤立的,不能在更大的类中访问。

使用这种方法消除了在调用上下文中运行connect() 的需要。如果您不想这样做,则不需要使用构造函数来执行此操作,您只需始终首先连接以创建连接属性并将其提供给类的其余部分。另请注意,您可以随意命名该属性,我只使用了connection,因为它在 API 中最有意义。

另外,正如评论的那样,为了使其更有用,您应该让 select 方法返回查询结果数组,而不是直接输出。

public function select()    
    {
        $sql = 'SELECT id FROM bedrijf';
        $results = $this->connection->query($sql);
        if(!empty($results)){
          return $results
        }else{
          return false;
        }
    }

【讨论】:

  • 这似乎是解决方案的一部分,我现在唯一得到的是:PDOStatement 对象([queryString] => SELECT id FROM bedrijf),那么我该如何回显/打印结果?
  • @Augus - PDOStatement 对象是可迭代的,就像数组一样。您可以使用 foreach 循环将其打印出来,就像您在原始调用上下文中所做的那样。 php.net/manual/en/pdo.query.phpphp.net/manual/en/class.pdostatement.php
猜你喜欢
  • 2013-10-14
  • 2016-04-11
  • 2023-01-02
  • 1970-01-01
  • 1970-01-01
  • 2019-02-17
  • 2023-03-21
  • 1970-01-01
相关资源
最近更新 更多