繁体   English   中英

OOP PHP集成mysqli_query

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM