【问题标题】:Using MySQLi from another class in PHP在 PHP 中使用另一个类的 MySQLi
【发布时间】:2017-09-22 22:39:47
【问题描述】:

我真的希望有人可以帮助我弄清楚我缺少什么。我已将我的安装从 PHP 5.6 升级到 7.0,这迫使我从 Mysql 更新到 Mysqli,这由于某种原因破坏了我的设置。

我研究并遵循了本指南“在其他课程中使用 MySQLi”:Using MySQLi in other classes

我写的是最后的手段,也看过其他网站,但似乎问题出在其他地方。

首先我有一个数据库类:

    private $serverName = "localhost";
    private $userName = "DBUserName";
    private $pass = "UserPassword";
    private $database = "SelectedDB";

    public $conn;


    public function __construct(){

             $this->conn = new mysqli($this->serverName, $this->userName,$this->pass,$this->database);


            }

然后我有一个 API 类,我想访问这个连接,看起来像

require_once 'Database.php';
class MyAPI{
private $db;
public function __construct($request_uri, $postData, $origin) {



    $this->db = new Database();


}

最后我尝试从一个函数中调用它:

$getUserResult = mysqli_query( $this->db->conn, $getUserQry);

每当我调用 $this->db->conn 时,我都会收到内部服务器错误 500

如果我在 MyAPI 类中创建数据库连接,就不会出现我觉得奇怪的问题。

希望有人能指点我一个方向。

更新: 我更正了脚本中的拼写错误,现在我得到了 200,但查询 mysqli_query 中的值仍然为空。

如果我创建 $dbtest = new database();并使用它来代替它工作正常。有没有办法让它在引用 $db 的构造函数中工作?

【问题讨论】:

  • “500 错误”表示“您的 PHP 出现问题”表示“检查您的 error.log 文件”或您的服务器转储错误的任何地方。
  • private $db; 应该是类定义中
  • 始终在开发和测试代码时,位于脚本顶部error_reporting(E_ALL); ini_set('display_errors', 1);
  • 私有 $db;只是放错地方了,在 PHP 中是正确的。 @tadman 我会立即检查 error.log 给 Michael Berkowski,我已经在脚本中为将来设置好了
  • 我没有在 php.ini 中设置地方 error_log 但我现在创建了一个,然后我会报告!

标签: php mysql mysqli


【解决方案1】:

有几种不良做法导致您出现此错误。

显然,从数据库扩展用户是一个错误的举动。此外,整个 Database 类是相当无用的,因为它没有做任何有用的事情。

所以我建议

  • 摆脱无用的数据库类。
  • 从 vanilla mysqli 创建一个单个 $db 实例。
  • 将其作为构造函数参数传递给每个需要数据库连接的类

数据库.php:

<?php
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$db = new mysqli("localhost", "DBUserName", "UserPassword", "SelectedDB");
$db->set_charset('utf8mb4');

myapi.php

<?php
class MyAPI
{
    protected $db;

    public function __construct($db, $request_uri, $postData, $origin)
    {
        $this->db = $db;
    }

    public function getUser($id)
    {
        $sql = "SELECT * FROM users where id=?";
        $stmt = $this->db->prepate($sql);
        $stmt->bind_param("s", $id);
        $stmt->execute();
        $result = $stmt->get_result();
        return $result->fetch_assoc();
    }
}

app.php

<?php
# require_once 'Database.php';
# require_once 'myapi.php';
require 'vendor/autoload.php'; // autoloading is a must

$api = new MyAPI($db, $request_uri, $postData, $origin);
$user = $api->getUser($_POST['id']);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-15
    • 1970-01-01
    • 1970-01-01
    • 2013-02-09
    相关资源
    最近更新 更多