【问题标题】:Mysqli Make connection in one function and use it for sql queries in other functionMysqli 在一个函数中建立连接并将其用于其他函数中的 sql 查询
【发布时间】:2013-10-21 01:31:54
【问题描述】:

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

【问题讨论】:

  • 您应该阅读有关 OOP PHP 的教程,因为您正在犯一些基本的错误,这些错误已被每个 tut 所涵盖。
  • 还有什么错误?
  • 属性与变量不同,不能简单地通过名称来调用,您必须使用对象运算符。因此,如果您想访问属于您当前所在对象的成员的属性,您可以使用$this-&gt;property_name。此外,您正在使用过时的可见性属性(var 是 PHP4,虽然它仍然支持向后兼容,但您应该使用 publicprotectedprivate 关键字)。全局变量也很调皮,你应该阅读依赖注入。
  • 您不应该在每次要进行查询时都连接。就像 Lajos Veres 所说,你应该把 mysql 资源作为一个属性,这样你就不需要每次都重新连接
  • 我能得到如何正确操作的代码吗?

标签: php class oop mysqli database-abstraction


【解决方案1】:

几个问题:

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

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

【讨论】:

  • 我可以更正我的代码吗?这样我就知道我的错误是什么以及如何以正确的方式做到这一点?
  • phplib包中的db_mysql.inc文件真的很像。 sourceforge.net/projects/phplib/files/latest/download我可以是一个很好的起点。
  • 非常感谢..不知道这样的退出
【解决方案2】:

你的课在很多方面都是一种不好的做法。 首先,您在这里使用的是旧的 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 ;)

【讨论】:

  • 所以我们不应该自己尝试,因为谷歌已经有数万亿的结果了?
  • 抱歉,没有# 不是这样的,只是想看看“好的”实现向他们学习 :)
  • 您也可以更正我的代码,以便我知道如何以正确的方式进行操作吗?谢谢
  • 查看其他答案,了解您的代码为何无法正常工作。 (顺便说一句,我还建议先学习一些基本的 OOP 教程!)这是我在 github 上快速搜索的结果:github.com/ajillion/PHP-MySQLi-Database-Class/blob/master/… 它还包括一个基本的查询构建器(这通常不是很好,因为数据库句柄和查询构建器有不同的关注点,所以它们应该是两个类)
猜你喜欢
  • 2013-08-13
  • 1970-01-01
  • 2011-06-08
  • 1970-01-01
  • 2020-10-18
  • 2018-05-27
  • 2021-04-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多