Mysqli在一个函数中建立连接,并将其用于其他函数中的sql查询

时间:2013-10-13 10:18:26

标签: php class oop mysqli database-abstraction

我试图创建一个类似于大多数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&amp;的新手。 mysqli也许我错过了一些明显的东西。 请帮忙!

2 个答案:

答案 0 :(得分:1)

一些问题:

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

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

答案 1 :(得分:1)

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

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

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

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

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

你在互联网上做的很多实现,只需使用谷歌;)