-3

I am trying to learn the basics of OOP PHP however I am stuck at this part:

<?php

class Database {
    private $dbuser;
    private $dbpass;
    private $dbhost;
    private $database;

    private $link;
    private $connection;

    function __construct($dbhost, $dbuser, $dbpass, $database) {
        $this->dbhost = $dbhost;
        $this->dbuser = $dbuser;
        $this->dbpass = $dbpass;
        $this->database = $database;

        $this->link = mysql_connect($this->dbhost, $this->dbuser, $this->dbpass);

        $this->link = mysql_select_db($this->database);

        return true;
    }

    function NewQuery($query) {
        $execute = mysql_query($query);
        if (!$execute) die('Invalid query: ' . mysql_error());

        return $execute;
    }

    function __destruct() {
        mysql_close($this->link);
    }
}

At my index page I get this error on mysql_close. Is there anything I could do to fix it on __destruct() class?

Warning: mysql_close() expects parameter 1 to be resource, boolean given in C:\xampp\htdocs\projects\oop\classes\database.php on line 33
4

2 回答 2

2

如果您查看文档,mysql_select_db()您首先会看到一个红色的大框,上面写着您不应该再使用mysql_函数了。

顺便说一句,该页面还说该函数true在成功和false错误时返回。这意味着您正在用布尔值覆盖保存连接 ( $this->link) 的变量,这会在您稍后尝试关闭它时导致错误。

简单的解决方案是不在任何地方存储数据库选择的返回值,或者为其使用单独的变量。

于 2013-08-11T11:48:32.183 回答
0

让我们继续PDO吧!

<?php

class Database {

    private $con;

    public function __construct($dbname, $dbhost, $dbuser, $dbpass) {
        $this->con = new PDO(
            sprintf('mysql:dbname=%s;host=%s;charset=utf8',
                $dbname,
                $dbhost
            ),
            $dbuser,
            $dbpass,
            array(
                PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_OBJ,
                PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
            )
        );
    }

    function execute($sql, $params = array()) {
        $stmt = $this->con->prepare($sql);
        foreach ($params as $key => $v) {
            list($value, $type) = is_array($v) ?
                $v :
                array($v, PDO::PARAM_STR)
            ;
            $stmt->bindValue($key, $value, $type);
        }
        $stmt->execute();
        return $stmt;
    }

}

示例用法:

$_POST['age'] = '15'; // user input


try {

    if (!isset($_POST['age']) || !is_string($age = $_POST['age'])) {
        throw new Exception('parameter $_POST["age"] required');
    }

    $db = new Database('testdb', 'localhost', 'root', '');    
    $params = array(
        ':age' => array(
            $age,
            PDO::PARAM_INT,
        )
    );

    $sql = 'SELECT COUNT(*) FROM people WHERE age = :age';
    printf("The number of %d years old people is %d\n",
        $age,
        $db->execute($sql, $params)->fetchColumn()
    );

    $sql = 'SELECT * FROM people WHERE age = :age';
    foreach ($db->execute($sql, $params) as $user) {
        echo "\n";
        printf("Name : %s\n", $user->name);
        printf("Age : %d\n", $user->age);
    }

} catch (Exception $e) {

    echo 'Error: ' . $e->getMessage();

}
于 2013-08-11T12:03:43.463 回答