Изменить формат возврата на PHP PDO Select - PullRequest
1 голос
/ 27 июня 2010

Я пишу свою собственную оболочку PDO, чтобы сделать мою жизнь проще и безопаснее.

Стандартный запрос выглядит так:

$user = $db->select('users')
           ->eq('twitter_id', $twitter_id)
           ->limit(1)
           ->prepare()
        ->exec();

Создает этот запрос:

SELECT * FROM users WHERE twitter_id = :twitter_id LIMIT 1

Это прекрасно работает, как я сейчас хочу.Я сталкиваюсь с проблемой, когда у меня есть запрос на возврат нескольких строк.

Мои приложения хранят некоторые динамические настройки, которые я хочу получить и использовать за один проход, и я могу сделать это, выполнив запрос, например:

$share_datas = $db->select('settings', 'setting, value')
                  ->prepare()
               ->exec();

, который генерирует:

SELECT setting, value FROM settings

, который возвращает:

Array
(
    [0] => Array
        (
            [setting] => since_id
            [value] => 17124357332
        )

    [1] => Array
        (
            [setting] => last_dm
            [value] => 1271237111
        )
)

Функция prepare() собирает части длязапрос и функция exec() связывают параметры и возвращают массив.

<code>    function exec()
    {
//      echo 'vars: <pre>'.print_r($this->sql_vars, true).'
';$ stmt = $ this-> dbh-> prepare ($ this-> sql_last_query);foreach ($ this-> sql_vars as $ key => $ val) {if ('date_time' === $ key) continue;$ bind = $ stmt-> bindValue ($ key, $ val);} $ stmt-> execute ();$ this-> sql_vars = array ();return $ stmt-> fetchAll (PDO :: FETCH_ASSOC);}

Теперь к вопросу: есть ли способ, которым я могу изменить exec() или сам запрос так, чтобы он мог возвращать массив, который возвращается, как показано ниже, и избегать любых дополнительных циклов?

Array
(
     [since_id] => 17124357332
     [last_dm]  => 1271237111
)

Ответы [ 2 ]

1 голос
/ 27 июня 2010

Ответ, вероятно, будет либо:

  1. Создание нескольких версий вашего exec метода с различным поведением возврата, либо
  2. Наличие exec просто для выполнения выполненияи сохраните дескриптор оператора, а затем извлеките данные в отдельный метод.

В дополнение к вашему текущему массиву хэшей я нашел следующие удобные методы:

  • Запрос «один»: первый столбец в первой строке в виде скаляра (для таких вещей, как SELECT COUNT (*))
  • Запрос «список»: первый столбец всех строк в виде индексированного массива (для таких вещей, как SELECT id FROM ...))
  • Запрос "пар": первые два столбца всех строк в виде хэша (для вашей текущей задачи)
  • Запрос "insert id":Последний сгенерированный идентификатор строки в виде скаляра (автоинкремент в MySQL, последовательность в Postgres и т. Д.)

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

1 голос
/ 27 июня 2010

Нет проблем с некоторыми простыми функциями массива.

$in = $db->exec();
$out = array();
foreach( $in as $row )
    $out[ $row['setting'] ] = $row['value'];

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

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