将PDO转换为mysql


translate from PDO to MySQLI

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

|ORIGINAL PDO MODEL.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());
        }
    }
}

|这是我的模型。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 |类postsModel扩展Model{

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

我无法找到如何使我的模型。php为Mysqli写

事实上,你不可能不痛苦地做这件事。Mysqli既没有bindValue,也不会返回任意结构的数组。

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

    首先是
  • ,由于某种原因,它的第一个参数是$data,所以你总是要写它。
  • 接下来,你将捕获一个异常并将其回显出来,这是一个大禁忌
  • 最后,我希望你只创建一个模型类的实例以及一个数据库类。

所以,让我建议你使用mysql代替,它是建立在mysql之上的,但比PDO更用户友好和安全。

例如,for 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();

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

乌利希期刊指南:优点:+您可以测试自己的PDO实现与规范的PDO兼容+,可以轻松迁移

缺点:-有很多工作要做

可能的hack:部分实现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();