从PDO转换为MySQLI

时间:2013-04-29 12:01:31

标签: php pdo mysqli

经过大量时间的故障排除后,我发现我的主机(hosting2go.nl)不支持PDO :: mysql,他们只是不安装驱动程序,所以我的MVC框架中的Model.php被搞砸了。我用数据库连接解决了问题。问题是我对mysqli和justr完全不熟悉,无法找到如何使我的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());
        }
    }
}

|这就是我对我的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 | class postsModel扩展了Model {

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

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

2 个答案:

答案 0 :(得分: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();

答案 1 :(得分:-1)

如果您有意在未来更改托管,我建议您自己实施PDO界面。在您的主机添加PDO或您更改主机后,您可以切换到本机PDO无痛。

<强> UPD: 优点: +您可以测试自己的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();