-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];}
}

これを使用して、すべてのサイト設定を呼び出します。このためにプリペアドステートメントを使用したかったのです。

これが、prepareステートメントを追加したときに行ったことです。

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];
    }
}

しかし、現在、この関数は機能していません。なぜ機能しないのですか?

4

1 に答える 1

3

(現在削除されている)重複からの回答の移行。

プレースホルダーを使用してステートメントを実行して: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))
    );
}

何が変わったか

主な変更点は次の 2 つです。

function get_config($name = 'home')

関数がパラメータなしで呼び出された場合、$nameデフォルトは'home'です。

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

fetchAll()、各配列エントリの最初の列のみを含む配列を返します。これを適用するcurrent()と、最初の (そして唯一の) 配列エントリが返されるかfalse、配列が空の場合に返されます。

注意

からデータベース ハンドルを使用する$GLOBALSことはお勧めしません。インスタンスを渡すか、コンストラクターでデータベースハンドルとして受け取るクラスのメソッドにする方がよいget_config()でしょう。get_config()

于 2013-02-24T22:36:11.530 に答える