传递数据库对象的正确方法?

时间:2016-10-09 05:44:11

标签: php mysqli fatal-error prepare

我有两节课: 1.数据库类

class Database extends Config{

private $connection;

function __construct()
{
    $this->openConn();
}

public function openConn(){
    $this->connection = new mysqli($this->dbHost . ":" . $this->dbPort,
                                       $this->dbUser,
                                       $this->dbPass,
                                       $this->dbName);
    if (mysqli_connect_errno()) {
        echo 'Database connection failed ' . mysqli_errno() . mysqli_connect_error();
    }
}

2。登录类

class Login{

private $connection;

function __construct(){

    global $database;
    $this->connection = $database;

    $query = $this->connection->prep("
        SELECT * FROM `Users`
        WHERE `Email` = ?
        AND `Password` = ?
        LIMIT 1
        ");
}

绑定params并尝试运行Login.php后,我收到以下错误:

Fatal error: Call to undefined method Database::prepare()

在线搜索后我发现了许多想法,但没有实际的例子,据我所知,mysqli对象没有被正确传递,我应该使用另一种方法来传递它应该(如果可以防止扩展Database类 - 这是首选,因为我打算使用“扩展”选项进行其他用途。)

谢谢。

2 个答案:

答案 0 :(得分:1)

你的 Openconn()没有返回任何内容。

确保它返回数据库光标

您可以将代码更新为:

    mWebView.setWebViewClient(new WebViewClient() {
          @Override
          public void onPageFinished(WebView webView, String url) {
                super.onPageFinished(webView, url);
                mSurroundingLayout.requestLayout();
          }
      }
   );

答案 1 :(得分:0)

很多事情我从哪里开始,我想我会先发布更正后的代码(未经测试)

class Database extends Config{

    private $connection;

    function __construct(){
        $this->openConn();
    }

    protected function openConn(){
            $this->connection = new mysqli($this->dbHost . ":" . $this->dbPort,
                    $this->dbUser,
                    $this->dbPass,
                    $this->dbName);
            if (mysqli_connect_errno()) {
                echo 'Database connection failed ' . mysqli_errno() . mysqli_connect_error();
            }
    }

    public function getConnection(){
        return $this->connection;
    }
}

class Login{
    private $Database;

    function __construct(\Database $Database){
        $this->Database = $Database;
        $connection = $this->Database->getConnection();

        $query = $connection->prep("
    SELECT * FROM `Users`
    WHERE `Email` = ?
    AND `Password` = ?
    LIMIT 1
    ");
    }
}

你应该避免使用全局变量而是使用依赖注入。所以这个

 global $database

替换为

$Database = new Database();
$Login = new Login( $Database  );

我不确定那个全局是什么,如果它是一个数据库实例或实际连接,但是数据库类中的$connetion是私有的,所以为了将它放到外面它应该有一个get方法。我还将openConn()方法更改为受保护,因为它从类外部进行无意义的调用。

我会改变很多其他事情,或者采取不同的做法,但这在很大程度上超出了问题的范围。

您的问题很可能是:

  • 您没有设置全局
  • 您将全局设置为$ Database而不是连接。

根据您报告的错误,它很可能是第二个,因为您在Database类上调用prepare而不是它存储的连接。