当前位置: 首页 > 知识库问答 >
问题:

在PHP中使用另一个类中的MySQLi

伍心水
2023-03-14

我真的希望有人能帮我弄清楚我到底错过了什么。我已经将我的安装从PHP5.6升级到7.0,这迫使我从Mysql更新到Mysqli。由于某种原因,我的安装被破坏了。

我研究并遵循了“在其他类使用MySQLi”指南:在其他类使用MySQLi

我写作为最后的手段,也看了其他网站,但似乎问题来自其他地方。

首先,我有一个数据库类:

    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的值仍然为null。

如果创建$dbtest=new database();用它来代替,它工作得很好。有什么方法可以让它在引用$db的构造函数内部工作吗?

共有1个答案

彭兴朝
2023-03-14

有几个坏的做法导致您出现这个错误。

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

因此我建议

  • 删除无用的数据库类。
  • 从vanilla Mysqli创建单个$db实例。
  • 将其作为构造函数参数传递到需要数据库连接的每个类

database.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']);
 类似资料:
  • 我刚开始使用Java,到处搜索,但无论出于何种原因都无法找到解决方案。我的问题对我来说似乎很简单:我在同一个文件夹中有两个类,该文件夹是我的包,为了说明: 我需要在第2类中创建第1类的实例,但它就是不起作用。这是一个示例: 文件路径: 文件路径: 我得到这个错误 根据要求,完整的源代码:注:class1=ClientIndividual,class2=涉众 第一个文件 第二个文件 第三个文件(接口

  • 我正在构建一个定制的Java库。我把我的大部分“重复”代码都保存在那里,比如文件处理、字符串处理等。每次我想使用它们时,我都必须将该类复制并粘贴到我正在进行的其他项目中。有没有办法让这个自定义库类成为“依赖项”?我在用我的智能手机。

  • 因此,为了遵守职责分离原则,我尝试让我的修改方法(listNearestAirports)将列表返回给演示者(在不同的包中)。但我注意到,这在改型时很难做到,从必须在我的方法范围之外声明列表,到我只能在onResponse方法内迭代列表(当我试图返回列表时,我得到一个空指针异常)。请参阅下面的代码: 我想要向main()返回一个列表,因此可以执行以下操作: 什么是最简单的方法来返回来自改装的响应?

  • 我不明白为什么下面的代码会打印两次。我以为应该是个人和学生。当通过“a”对象调用printPerson()内部的getInfo()时,为什么要调用Person类内部的一个,为什么不调用Student类中的一个?提前谢谢。

  • 我有一个类,它调用两个单例类FirstClass和SecondClass,如下所示。有没有一种方法可以在第二类中访问第一类中计算的数据。在这种情况下,我不想在第二类中进行外部服务调用,因为第一类已经调用了它。相反,只需在第二个数据函数中使用数据(存储在第一类函数中)。在Spring框架中有哪些方法可以做到?

  • 问题内容: 我有两个IntelliJ IDEA Java项目。ProjectA和ProjectB。我想从ProjectB中的ProjectA导入和使用代码。我该怎么做呢? 在Eclipse中,我只需转到ProjectB的“构建路径”设置并添加ProjectA。 问题答案: 您可以在这些项目之间创建依赖关系(使项目B依赖于项目A)本质上是编译项目A,然后将其已编译jar作为项目B的依赖项进行编译或运