与PDO和Singleton类的数据库连接

I'm trying to establish a database connection with PDO and a Singleton class but I'm having trouble fetching data from the database.

I've been reading up on this but I'm still not sure how to call the Singelton class in my database file from another file and get the results printed out. The error I'm getting right now is Fatal error: Call to undefined function query() in my db.php file, which is the last function in my database file. However I believe the function is defined.

Any help is appreciated!

Here is my database (db.php) connection file:

<?php
class Database 
{
    private $_db;
    static $_instance;

    private function __construct() {
        $this->_db = new PDO('mysql:host=localhost;dbname=mvcuser', 'root', '');
        $this->_db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
    }

    private function __clone(){}

    public static function getInstance() {
        if (!(self::$_instance instanceof self)) {
            self::$_instance = new self();
        }
        return self::$_instance;
    }

    public function query($sql) {
        return query($this->_db,$sql);
    }

}

And here is the code in my index.php file:

<?php
    require_once 'model/db.php';

    $db = Database::getInstance();

    $db->query('SELECT * FROM users');
    if ($result = $db->query($query)) {
    while ($row = $result->fetch(PDO::FETCH_ASSOC)) {
        echo $row;
    }
    }
dppcyt6157
dppcyt6157 好的,我理解:)我以为我做了一个变量,能够用一个字打印出一行...感谢您的帮助!@YourCommonSense
接近 7 年之前 回复
doumiebiao6827
doumiebiao6827 因为它是数组。你可以穿整体衣柜吗,不是吗?不,你一次只能穿一件衣服。与回显数组相同
接近 7 年之前 回复
dpygo62420
dpygo62420 谢谢!!!它终于解决了并且定义了$query:)我似乎有时会使它复杂化!我需要写:echo$row['username'];它的工作原理。但是我不太明白为什么我不能只是回应那个漏洞$row?这是当我得到数组到字符串转换错误...@YourCommonSense
接近 7 年之前 回复
dtye7921
dtye7921 在哪一行你得到这个错误?
接近 7 年之前 回复
doumi9618
doumi9618 没有人说要摆脱if然后我被告知不要摆脱它:/我试图摆脱if但它也没有工作...我得到错误未定义变量查询,但它没有这样定义:$db->query('SELECT*FROMusers');???如果我写这个:$query=“SELECT*FROMusers”;我得到错误:数组到字符串转换...@YourCommonSense
接近 7 年之前 回复
dpjjmo3079
dpjjmo3079 并将前一行写为$result=$db->query('SELECT*FROMusers');
接近 7 年之前 回复
dsdzz04802
dsdzz04802 你已经被告知过两次了。摆脱if(){线和相应的右括号
接近 7 年之前 回复
dsuhx86802
dsuhx86802 这是一个任务,我们假设有一个Singleton类和PDO与数据库连接,用于学习目的:)如果您有任何想法我做错了请告诉我。我不太明白如何从索引文件中调用查询...@YourCommonSense
接近 7 年之前 回复
dongyanghan0556
dongyanghan0556 你为什么要单身?为什么不使用原始PDO实例?有什么问题吗?
接近 7 年之前 回复
dongshubang7816
dongshubang7816 所以我应该写:if($result=$db){}而不是?
接近 7 年之前 回复
duanquan4451
duanquan4451 什么没有意义的是调用查询两次,这就是我的意思...
接近 7 年之前 回复
dsdukbc60905239
dsdukbc60905239 是的,如果确实有意义!
接近 7 年之前 回复
dqe9657
dqe9657 好!但我仍然得到同样的错误:(
接近 7 年之前 回复
dqk94069
dqk94069 删除if,它没有意义......执行:$result=$db->query(...)...
接近 7 年之前 回复

3个回答

The definition of your Database::query method doesn't make sense. It looks like you're calling some PHP function query (which doesn't exist) and thus you get the error.
I think you might want to change the method's definition to:

public function query($sql) {
    return $this->_db->query($sql);
}

Update: and in your index.php

$db = Database::getInstance();
$statement = 'SELECT * FROM users';

if ($result = $db->query($statement)) {
    while ($row = $result->fetch(PDO::FETCH_ASSOC)) {
        echo $row;
    }
}
doujing6053
doujing6053 谢谢! 我已经解决了一些你的帮助! 这是正确的解决方案! 再次感谢:)@ Havelock
接近 7 年之前 回复
dotcraq3249
dotcraq3249 不,变量$ query没有在任何地方定义。 看到我的更新答案 - 在那里我用$ statement替换$ query。
接近 7 年之前 回复
dongwai4434
dongwai4434 但它不是在我的数据库文件中的函数中定义的吗? 否则我不知道该怎么定义它? 我的问题是我不知道如何连接数据库文件和我的索引文件并收集数据:(我真的很感谢帮助!@ilpaijin
接近 7 年之前 回复
dongxuan8227
dongxuan8227 你正在做if($ result = $ db-> query($ query)){但我看不到变量$ query在某处定义
接近 7 年之前 回复
dqeznd1697
dqeznd1697 我是从索引文件中正确调用它还是需要更改它?
接近 7 年之前 回复
douweihui0178
douweihui0178 我只是尝试了但是它给了我注意:未定义的变量:索引文件中的查询。 还有致命错误:带有消息'SQLSTATE [42000]的未捕获异常'PDOException':语法错误或访问冲突:1065查询为空'。
接近 7 年之前 回复

I know this questing is a little old, but for anyone who found it from Google if you don’t want to create a wrapper method for every single PDO method, you can use this inside your singleton class.

public function __call ( $method, $args ) {
    if ( is_callable(array($this->_db, $method)) ) {
        return call_user_func_array(array($this->_db, $method), $args);
    }
    else {
        throw new BadMethodCallException('Undefined method Database::' . $method);
    }
}

Now you can use $db->query($statement) or any other PDO method without having to define it inside your singleton class.

Just thought about this question. I make different way to connect database. Also it's included form. it's like this.

PHP

class try_connect
{
    function connect($s_name,$db_name,$user,$pass)
    {
        $this->s_name = $s_name;
        $this->db_name = $db_name;
        $this->user = $user;
        $this->pass = $pass;
        try {
            $db = new PDO("mysql:host=$s_name;dbname=$db_name","$user","$pass");
            if ($db) {
                echo $db->query("select database()")->fetch(PDO::FETCH_COLUMN);
            }else {
                echo "fail";
            }
        } catch (Exception $e) {
            print $e->getMessage();
        }
    }
}
if (isset($_POST["submit"])) {
    $get_server_name = $_POST["server_name"];
    $get_db_name = $_POST["database_name"];
    $get_user = $_POST["user"];
    $get_pass = $_POST["password"];
    $connect = new try_connect();
    $connect->connect($get_server_name,$get_db_name,$get_user,$get_pass);
}

HTML

<form action="<?php echo $_SERVER["PHP_SELF"]; ?>" method="post">
    <p><input type="text" name="server_name"></p>
    <p><input type="text" name="database_name"></p>
    <p><input type="text" name="user"></p>
    <p><input type="text" name="password"></p>
    <p><input type="submit" name="submit"></p>
</form>

Coding really nice. I love it. :)

立即提问
相关内容推荐