0

经过很多小时的故障排除后,我发现我的主机(hosting2go.nl)不支持 PDO::mysql 他们只是没有安装驱动程序,所以我的 MVC 框架中的 Model.php 被搞砸了。我解决了我的数据库连接问题。问题是我对 mysqli 完全陌生,只是不知道如何使我的 model.php(为 PDO::mysql 编写)为 Mysqli 编写(而不是 PDO)我希望你们能帮助我......我的代码:

|原始 PDO 模型.PHP|

class Model
{
    function __construct()
    {
        $this->db = new Database;
        $this->data = $_POST;
    }

public function query( $data = array(), $query){
    try{
            $result = $this -> db -> prepare($query);
            $result->execute($data);
            $result = $result->fetchAll(PDO::FETCH_ASSOC);
            return $result;
    }catch(PDOException $e){
        echo $e;
    }
}

|我的数据库连接|

class Database extends mysqli {
    public function __construct() {
        parent::__construct("localhost","root","","bartsite");

        if (mysqli_connect_error()) {
            die('Connect Error (' . mysqli_connect_errno() . ') '
                    . mysqli_connect_error());
        }
    }
}

|这就是我用我的model.php FOR MYSQLI 做的|

class Model
{
    function __construct()
    {
        $this->db = new Database;
        $this->data = $_POST;
    }
    public function query( $data = array(), $query){
        try{
                echo $query;
                $result = $this -> db -> prepare($query);
                $result = $this -> db -> query($data);
                $result->fetch_all();
//$result->execute($data);
//$result = $result->fetchAll(PDO::FETCH_ASSOC);
        }catch(PDOException $e){
            echo $e;
        }
    }
}

|控制器的有用部分|

public function index(){
    $data = $this->posts->getAllPosts();
    var_dump($data);
    $this->view->render("posts/index",$data);
    return true;
}

|posts.models.php| 类帖子模型扩展模型{

function __construct()
{
    parent::__construct();
}

public function getAllPosts(){
    $result = $this->query(
        array(),
        "SELECT * FROM posts ORDER BY  id DESC"
    );
    return $result;
}
4

2 回答 2

2

我不知道如何让我的 model.php 为 Mysqli 编写

事实上,如果没有很多痛苦,你就无法做到这一点。Mysqli 既没有 bindValue,也不能返回一个任意结构的数组。

然而,您的 Model 类是错误的。

  • 首先,由于某种原因,它有 $data 作为第一个参数,让你总是写它。
  • 接下来,您将捕获一个异常以将其回显,这是一个很大的禁忌
  • 最后,我希望您只创建 Model 类的一个实例以及任何 Database 类之一。

所以,我建议你改为使用safeMysql,它基于 mysqli,但比 PDO 更加用户友好和安全。

说,对于postsModel

class postsModel {

    function __construct(safeMysql $db)
    {
        $this->db = $db;
    }

    public function getAllPosts(){
        return $this->db->getAll("SELECT * FROM posts ORDER BY id DESC")
    }
}

$db = new safeMysql();
$model = new postsModel($db);
$posts = $model->getAllPosts();
于 2013-04-29T12:43:04.610 回答
-1

如果您打算将来更改托管,我建议您自己实现 PDO 接口。在您的主机添加 PDO 或更改主机后,您可以轻松切换到本机 PDO。

UPD: 优点:+您可以测试自己的 PDO 实现以与规范 PDO 兼容 +,因此您可以轻松迁移

缺点: - 有很多工作要做

可能的破解:部分实现 PDO 接口,只实现你真正使用的那些东西

UPD-2 如果不与 mysqli_* 和其他混淆对您来说更具成本效益,您可以只获得新的托管并忘记这个。这也取决于您的代码库:更改几个方法左右没有问题,但不是巨大的 cms 或类似的东西。所以选择取决于你。

UPD-3

Model用此代码替换 try-catch 块

echo $query;
$stmnt = $this -> db -> prepare($query);
// bind params to statement from $data here
if (false === $stmnt->execute()) {
    // error
    echo $e;
    return;
}
$result = $stmt->get_result();
于 2013-04-29T12:24:08.610 回答