Преобразование коннектора MySQL в PDO - PullRequest
0 голосов
/ 23 июня 2011

После получения от кого-то совета в предыдущей теме я пытаюсь преобразовать MySQL в PDO, но у меня возникают некоторые проблемы.

Вот мой исходный класс подключения MySQL:

class DbConnector {

    public static function getInstance() {
        static $instance = null;
        if ($instance === null) {
            $instance = new DbConnector();
        }

        return $instance;
    }

    protected $theQuery;
    private $link;

    function DbConnector() {

        $host = 'localhost';
        $db = '';
        $user = '';
        $pass = '';

        // connect to the db
        $this->link = mysql_connect($host, $user, $pass);
        mysql_select_db($db);
        register_shutdown_function(array(&$this, 'close'));
    }

    public function find($query) {
        $ret = mysql_query($query, $this->link);
        if (mysql_num_rows($ret) == 0)
            return array();
        $retArray = array();

        while ($row = mysql_fetch_array($ret))
            $retArray[] = $row;

        return $retArray;
    }

    public function insert($query) {
        $ret = mysql_query($query, $this->link);

        if (mysql_affected_rows() < 1)
            return false;
        return true;
    }

    public function query($query) {
        $this->theQuery = $query;
        return mysql_query($query, $this->link);
    }

    public function fetchArray($result) {
        return mysql_fetch_array($result);
    }

    public function close() {
        mysql_close($this->link);
    }

    public function exists($query) {
        $ret = mysql_query($query, $this->link);
        if (mysql_num_rows($ret) == 0)
            return false;
    }

    public function last_id($query) {
        return mysql_insert_id($query);
    }

}

Вот функция, которую я пишу:

function getRandomSubmission() {
    global $db;

    if(!empty($_GET['id'])){
        $submission_id = $_GET['id'];

        $query = $db->find("
            SELECT
                *
            FROM
                `submissions`
            WHERE id = '{$submission_id}'
            LIMIT 1
        ");

    }
    else {
        $query = $db->find("
            SELECT
                *
            FROM
                `submissions`
            ORDER BY RAND()
            LIMIT 1
        ");
    }


    if($query) {
        return $query[0];
    }
    else {
        $query = $db->find("
            SELECT
                *
            FROM
                `submissions`
            ORDER BY RAND()
            LIMIT 1
        ");
    }
}

Вот разъем PDO:

$host = 'localhost';
$username = '';
$pass = '';
$db = '';

try {
    $dbh = new PDO("mysql:host=$host;dbname=$db", $username, $pass);
} catch (PDOException $e) {
    echo $e->getMessage();
}

Вот то, что я пытался преобразоватьэто, но это просто неправильно.Я думаю, что мне нужно возвращать ассоциативный массив PDO во втором операторе if, но я не уверен.

function getRandomSubmission() {
    global $dbh;

    if(!empty($_GET['id'])){
        $submission_id = $_GET['id'];

    $stmt = $dbh->prepare('
            SELECT
                *
            FROM
                `submissions`
            WHERE
                `id` = ?
            LIMIT 1
            ');

    $stmt->bindParam(1, $submission_id, PDO::PARAM_INT);
    $stmt->execute();
    }
    else {
    $stmt = $dbh->prepare('
            SELECT
                *
            FROM
                `submissions`
            ORDER BY RAND()
            LIMIT 1
        ');

    $stmt->execute();
    }


    if($stmt) {
        return $stmt[0];
    }
    else {
    $stmt = $dbh->prepare('
            SELECT
                *
            FROM
                `submissions`
            ORDER BY RAND()
            LIMIT 1
        ');

    $stmt->execute();
    }
}

Оригинальный работает, как и предполагалось (однако я понимаю, что оставил детали подключения пустыми).

1 Ответ

1 голос
/ 23 июня 2011

Вам необходимо вызвать метод выборки объекта PDOStatement:

return $stmt->fetch()

Читайте о стиле выборки, вам действительно не нужно FETCH_BOTH; -)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...