0

我试图创建一个类似于大多数 cms 的数据库类,所以我在一个函数中建立连接并返回连接对象以用于类中其他函数的查询..

<?php


class my_database {

    var $host = 'localhost';
    var $user = 'prince';
    var $pass = 'abcd1234wxyz';
    var $db = 'world';

    function __construct() {

        $this->db_connect();

    }

    function db_connect() {

        $mysqli = mysqli_connect($host,$user,$pass,$db);

        /* check connection */
        if (!$mysqli) {
            printf("Connect failed: %s\n", mysqli_connect_error());
            exit();
        }

        return $mysqli;
    }

    function query($query) {
        $mysqli = $this->db_connect();


        if ($result = mysqli_query($mysqli, $query)) {

            while ($row = mysqli_fetch_row($result)) {
                echo "<pre>";
                print_r($row);
                echo "</pre>";
            }


            mysqli_free_result($result);
        }  else
            echo "fails"; exit;

    }


}
$database  = new my_database;

/*************** Class Ends ****************************/

function get_results() {

    global $database;
    $database->query("select * from city limit 10");

}
get_results();
?>

它总是输出fails,我是 Oops & mysqli 的新手,也许我遗漏了一些明显的东西。请帮忙 !

4

2 回答 2

1

几个问题:

  • 您应该以 $this->varname 的形式访问实例变量。(例如在连接中你应该使用 $this->host...)
  • 您应该将 $mysqli 作为实例变量 $this->mysqli 访问。

(否则有很多免费的 php 数据库层。例如 adodb。)

于 2013-10-13T10:27:19.687 回答
1

你的课在很多方面都是不好的做法。首先,您在这里使用的是旧的 PHP4 语法,它已经不受支持。强烈建议切换到 PHP5 ( http://de2.php.net/manual/en/language.oop5.php )。

其次,我会使用 PDO 而不是 MySQLi。但是,无论您使用其中的哪一个,它们都已经具有面向对象的接口。那么为什么要使用程序呢?-> http://de2.php.net/manual/en/class.mysqli.php (MySQLi)

http://de2.php.net/manual/en/book.pdo.php (PDO)

关于您的实现,也有一些非常糟糕的做法。请仔细查看您的 db_connect() 函数:每当您使用 query() 方法时都会调用它,这意味着每次执行查询时都会重新连接!这是没用的,每个请求只需要一个连接!对此的解决方案是保存打开的数据库连接的对象属性。

最重要的是,在底部的代码中,您在使用“全局”时打破了 OOP 的一些关键概念。继续使用依赖注入,这意味着将 $database 对象注入您的函数( function(my_database $db) {} )。

您在互联网上所做的事情有很多实现,只需使用 google ;)

于 2013-10-13T10:31:47.627 回答