2013-02-24 2 views
-3

У меня есть следующие функции:удается получить мое подготовленное заявление на работу

function get_config($name = '') 
{ 
    $config = array(); 
    $row = array(); 
    $sql = "SELECT * FROM ".$GLOBALS['prefix']."config "; 
    if ('' != $name) {$sql .= " WHERE name = '". $name ."'";} 
    $result = $GLOBALS['conn']->query($sql); 
    while ($row = $result->fetch()) {$config[$row['name']] = $row['value'];} 
    if ('' != $name){return $config[$name];} 
} 

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

Вот что я сделал, когда я добавил заявление подготовить:

function get_config($name = '') 
{ 
    $config = array(); 
    $row = array(); 
    $sql = "SELECT * FROM config"; 
    if ('' != $name) { 
    $sql .= " WHERE name = 'home'"; 
    } 
    $result = $GLOBALS['conn']->prepare($sql, array(PDO::ATTR_CURSOR => PDO::CURSOR_FWDONLY)); 
    $result->execute(array(':name' => $name)); 
    while ($row = $result->fetch()) { 
    $config[$row['name']] = $row['value']; 
    } 
    if ('' != $name) { 
    return $config[$name]; 
    } 
} 

Но теперь эта функция не работает. почему не работает?

+0

Возможный дубликат [подготовленных инструкций PHP PDO] (http://stackoverflow.com/questions/1457131/php-pdo-prepared-statements) – mario

+0

Если вы используете это для хранилища конфигурации с плоскими ключами: значение может иметь смысл извлекать все записи одновременно и сохранять их в массиве. – mario

+0

@mario, что еще я могу сделать, кроме этого? потому что это то, что я действительно пытаюсь сделать, если есть лучший способ, расскажите мне об этом. – shnisaka

ответ

3

Миграция моего ответа с (теперь снята) duplicate.

Вы выполнения оператора с :name заполнителем, но это не есть в самом запросе:

function get_config($name = 'home') 
{ 
    $config = array(); 
    $row = array(); 
    $sql = "SELECT value FROM config WHERE name = :name"; 

    $result = $GLOBALS['conn']->prepare($sql, array(PDO::ATTR_CURSOR => PDO::CURSOR_FWDONLY)); 
    $result->execute(array(
     ':name' => $name 
    )); 

    return array(
     $name => current($result->fetchALL(PDO::FETCH_COLUMN, 0)) 
    ); 
} 

Что изменилось

Два основных изменения:

function get_config($name = 'home') 

Когда функция вызывается без параметров, $name по умолчанию 'home'.

return current($result->fetchAll(PDO::FETCH_COLUMN, 0)); 

fetchAll() возвращает массив только с первым столбцом в каждой записи массива. Применяя current(), он возвращает либо первую (и только) запись массива, либо false, если массив пуст.

Внимание

Использование базы данных ручки из $GLOBALS не рекомендуется; было бы лучше либо передать экземпляр в get_config(), либо позволить get_config() быть методом в классе, который получает в качестве дескриптора базы данных в своем конструкторе.

+0

было бы здорово, если бы вы могли объяснить эти две строки: '': name '=> $ name?:' Home 'и 'current ($ result-> fetchALL (PDO :: FETCH_COLUMN, 0));' – shnisaka

+1

@ shnisaka Конечно, обновлено. –

+0

по какой-то причине, я получаю первую букву результата .. что это может быть проблемой? – shnisaka

Смежные вопросы