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| class postsModel extends Model {

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 クラスのインスタンスを 1 つだけ作成し、Database クラスのインスタンスを 1 つだけ作成していることを願っています。

代わりに、 mysqliに基づいて構築されていますが、PDO よりもユーザーフレンドリーで安全な safeMysql をお勧めします。

たとえば、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

try-catch ブロックModelを次のコードに置き換えます

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 に答える