我真的希望有人能帮我弄清楚我错过了什么。我已将安装从 PHP 5.6 升级到 7.0,这迫使我从 Mysql 更新到 Mysqli,这由于某种原因破坏了我的设置。
我研究并遵循了本指南“在其他类(class)中使用 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 吗?
最佳答案
有几种不良做法会导致您出现此错误。
显然,从数据库扩展用户是一个错误的举动。另外,整个 Database 类毫无用处,因为它没有做任何有用的事情。
因此我建议
- 摆脱无用的Database类。
- 从普通 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']);
关于php - 在 PHP 中使用另一个类中的 MySQLi,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43618741/