Создание запросов с помощью PDO? - PullRequest
2 голосов
/ 30 сентября 2011

У меня есть какой-то древний код, который я хочу преобразовать в PDO:

<?php
    function build_query() {
        // db connection here

        $the_query = "";

        if ( empty( $_GET['c'] ) ) {
            $the_query = "select * from table1";

            if ( ( isset( $_GET['y'] ) ) && ( isset( $_GET['m'] ) ) ) {
                $the_query .= " where y = " . $_GET['y'] . " and m = " .  $_GET['m'];
            }
        } elseif ( ( $_GET['c'] == "1" ) || ( $_GET['c'] == "2" ) ) {
            $the_query = "select * from table1 where GGG = " . $_GET['c'];

            if ( ( isset( $_GET['y'] ) ) && ( isset( $_GET['m'] ) ) ) {
                $the_query .= " and y = " . $_GET['y'] . " and m = " .  $_GET['m'];
            }
        } else {
            $the_query = "select * from table1";

            if ( ( isset( $_GET['y'] ) ) && ( isset( $_GET['m'] ) ) ) {
                $the_query .= " where y = " . $_GET['y'] . " and m = " .  $_GET['m'];
            }

            $the_query .= " and c = " . $_GET['c'];
        }

        return // use the query to return results $the_data;
    }
?>

Я не могу понять, как перекодировать это с помощью PDO.Я сделал старт ниже, но, похоже, не могу дальше:

<?php
    function build_query() {
        $the_data = "";

        $DBH = new PDO( "mysql:host=server;dbname=database", "user", "pass" );
        $DBH -> setAttribute( PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION );

        $STH = $DBH -> prepare( "build query here" );

        $STH -> bindParam( ':c', $_GET['c'], PDO::PARAM_INT );
        $STH -> bindParam( ':y', $_GET['y'], PDO::PARAM_INT );
        $STH -> bindParam( ':m', $_GET['m'], PDO::PARAM_INT );

        $STH -> execute();

        $ROWS = $STH -> fetchAll();

            foreach($ROWS as $ROW) {
            $output .= $ROW["a"] . " - " . $ROW["b"] . " - " . $ROW["c"] . " - " . $ROW["d"] . "<br />";
            }

        $DBH = null;

        return $output; 
    }       
?>

Ответы [ 2 ]

2 голосов
/ 30 сентября 2011

Ну, это довольно сложно с подготовленными утверждениями
(поэтому я предпочитаю мои домашние заполнители вместо подготовленных утверждений)

Прежде всего вы должны сделать этот древний код разумным, без всего этого текущегобеспорядок.Проверяйте каждый параметр только один раз.

вот код, который дает вам идею

$w = array();
if ( !empty($_GET['c']) AND ($_GET['c'] == "1" ) || ( $_GET['c'] == "2") )
{
    $w[] = $db->parse("GGG = ?i", $_GET['c']);
}
if ( isset($_GET['y']) && isset($_GET['m']) )
{
    $w[] = $db->parse("where y = ?i and m = ?i",$_GET['y'],$_GET['m']);
}
$where = '';
if ($w) $where = implode(' AND ',$w);
$query = "select * from table1 $where";

, чтобы использовать подготовленные операторы, вы должны добавить свои значения в массив, а затем использовать его с execute ()

0 голосов
/ 30 сентября 2011

Вы меняете свою функцию, чтобы сделать намного больше, чем раньше. Если вы хотите придерживаться оригинального дизайна (который соответствует названию вашей функции ...), вам нужно изменить свою функцию так, чтобы она все еще возвращала запрос, но не выполняла его, поскольку старая версия не подключалась к базы данных или запросить базу данных либо.

Чтобы решить вашу проблему, вы можете заставить функцию возвращать массив с 2 элементами, запрос с именованными параметрами и другой массив с парами имя - значение.

Если вы хотите вернуть результаты запроса, вы можете использовать глобальную переменную для подключения к базе данных или передать ее в качестве переменной в функцию.

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