[英]OOP PHP integrate mysqli_query
我將編輯問題以使其更清楚,這樣您就可以看到我現在所擁有的內容,並且可以更輕松地理解問題。
<?php
$mysqli = new mysqli("localhost", "user", "password", "test");
class building
{
private $mysqli;
public $buildingid;
public $userid;
public $buildinglevel;
public function __construct($buildingid, $userid, \mysqli $mysqli)
{
$this->buildinglevel;
$this->mysqli = $mysqli;
}
public function getLevel()
{
return $this->mysqli->query("SELECT ".$this->buildingid." FROM worlds WHERE city_userid=".$this->userid."");
}
}
}
?>
然后,我用它來創建和使用函數:
$cityHall = new building("cityHall",$user['id'],$mysqli);
echo $cityHall->getLevel();
結果空白,什么也沒有發生。
您應該將mysqli實例注入到建築類的__construct()中:
$ mysqli =新的mysqli('user','password','localhost','test');
如果($ mysqli-> connect_errno){printf(“連接失敗:%s \\ n”,$ mysqli-> connect_error); }
class building
{
private $mysql;
private $buildingid;
private $userid;
// I need to have a mysqli_query here to get the info for the correct building,
//to be able to set the "buildinglevel" for each object from the MYSQL DB, seems basic
//but none of the things ive tried has worked.
public function __construct($buildingid, $userid, $mysqli)
{
$this->buildinglevel;
$this->mysqli = $mysqli;
$this->userid = (int)$userid;
$this->buildingid= (int)$buildingid;
}
public function getLevel()
{
$query = $this->mysqli->query("SELECT ".$this->buildingid." FROM worlds WHERE city_userid=".$this->userid);
$row = $query->fetch_assoc();
if (!$query) {
return $this->mysqli->error;
}
if ($query->num_rows == 0) {
return 'no database records found';
}
return $row;
}
}
$Bulding = new building("cityHall", $user['id'], $mysqli);
$level = $Bulding->getLevel();
var_dump($level);
對象是封裝行為的單元,這些行為通過方法暴露給其他對象。 從數據庫檢索到的公共屬性的包裝器不是面向對象的編程工具。 實際上, mysqli
可以通過fetch_object
為您完成此fetch_object
:
$result = $mysqli->query($query);
while ($building = $result->fetch_object()) {
// access properties via $building->buildingid, etc.
}
除非building
類實際上通過方法提供功能並實現某種抽象,否則不需要它。 相反,您可以使用包裝數據庫( mysqli
)的DAO(數據訪問對象),並且其檢索的數據由模型使用。
interface Dao {
public function get($id);
}
class BuildingDao implements Dao {
// DB can be a wrapper for mysqli
// but servers as an interface so it
// can be replaced easily
public function __construct(DB $db) {
$this->db = $db;
}
public function get($id) {
return $this->db->prepare(
"SELECT buildinglevel FROM building WHERE buildingid = ?"
)->execute($id)->fetch();
}
}
您的類似乎就是所謂的模型:它代表某種形式的數據,在您的情況下是特定的建築物。
一種方法是將MySQLi對象作為構造函數對象以及要查詢的建築物的ID傳遞,並將結果分配給類屬性。 如下所示:
<?php
class Building
{
private $db;
protected $id;
protected $level;
public function __construct(mysqli $db, $id = null)
{
$this->db = $db;
if (!is_null($id) && intval($id) > 0) {
$stmt = $this->db->prepare("SELECT buildingid, buildinglevel FROM building WHERE `id` = ?");
$stmt->bind_param('i', $id);
$stmt->execute();
$stmt->bind_result($this->id, $this->level);
$stmt->fetch();
}
}
public function getId()
{
return (int)$this->id;
}
public function getLevel()
{
return (int)$this->level;
}
}
然后,您可以按以下方式獲取建築物的屬性:
$building = new Building($mysqli, 1);
printf('Building ID is %d and building level is %d', $building->getId(), $building->getLevel());
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.