PHP / PDO - 使用变量赋值作为fetch-statement

时间:2017-04-30 04:30:50

标签: php variables pdo

好的 - 所以我有自定义功能

A plugin by the name "Administration\Filter\Ucwords" was not found in the plugin manager Zend\Filter\FilterPluginManager

哪个工作正常。但是,我有一个特定的查询,servicemanager configuration - 方法是Ucwords,如果我在函数调用中将其作为selectQuery($query, $fetch = 'fetch', $rowCount = 1, $onlyRowCount = false, $outputerror = false) - 值传递,并尝试在输出中使用它,它只返回fetch(因为它不起作用 - 如果直接运行或硬编码,查询工作正常)。

那么,我要问的是,有没有办法使用变量的值(至少开始时是一个字符串)来分配一个fetch方法?

我尝试了以下内容:

fetchAll(PDO::FETCH_COLUMN,0)

那么,有没有办法直接使用该变量$fetch作为赋值?将变量转换为某种东西或其他方式?

4 个答案:

答案 0 :(得分:4)

这个功能太可怕了。那个长长的参数单独!而且缺乏准备好的陈述。以及与数据库相关的函数,它决定自己是否输出错误,就好像数据库交互与其他代码不同。

帮自己一个忙,以这种方式实现这个功能

function query($query, $parameters = []) {
    $pdo = // here your way of getting a PDO instance. 
    // DON't TELL ME YOU ARE CREATING A NEW ONE EVERY TIME
    if (!$parameters)
    {
         return $this->query($sql);
    }
    $stmt = $pdo->prepare($sql);
    $stmt->execute($parameters);
    return $stmt;
}

这就是你需要的一切,它比你现在的好多了。

回复陈述是关键。它允许您将任何您喜欢的fetch方法附加到函数调用中 - 从这样的函数中获取不同结果类型的最自然方式。或者,如果查询恰好是UPDATE或INSERT,则不要取任何东西。

想要一个行数吗?

$count = query("DELETE FROM usars")->rowCount();

想要一个抓取?

$user = query("select * from users where id=?", [$id])->fetch();

想要使用PDO :: FETCH_COLUMN进行fetchAll吗?你在这里

$users = query("select name from users")->fetchAll(PDO::FETCH_COLUMN);

简单,实用,灵活,易读且安全

如果你不知道如何使这个功能只连接一次,这里有一个指向我写的简单PDO wrapper的链接。 请注意示例部分。令人兴奋的是,我最好把它放在这里:

# Table creation
DB::query("CREATE temporary TABLE pdowrapper 
           (id int auto_increment primary key, name varchar(255))");

# Prepared statement multiple execution
$stmt = DB::prepare("INSERT INTO pdowrapper VALUES (NULL, ?)");
foreach (['Sam','Bob','Joe'] as $name)
{
    $stmt->execute([$name]);
}
$id = DB::lastInsertId());

# Getting rows in a loop
$stmt = DB::run("SELECT * FROM pdowrapper");
while ($row = $stmt->fetch())
{
    echo $row['name'], PHP_EOL;
}

# Getting one row
$id  = 1;
$row = DB::run("SELECT * FROM pdowrapper WHERE id=?", [$id])->fetch();

# Getting single field value
$name = DB::run("SELECT name FROM pdowrapper WHERE id=?", [$id])->fetchColumn();

# Getting array of rows
$all = DB::run("SELECT name, id FROM pdowrapper")->fetchAll(PDO::FETCH_KEY_PAIR);

# Update
$new = 'Sue';
$count = DB::run("UPDATE pdowrapper SET name=? WHERE id=?", [$new, $id])->rowCount();

答案 1 :(得分:0)

我想你想做一个变量函数调用。但是这里的问题是您将函数名fetchAll及其参数(PDO::FETCH_COLUMN,0)作为一个参数传递给selectQuery函数。

我认为您需要将目标函数名称作为一个参数传递,并将目标函数参数作为另一个参数传递。

selectQuery($query, $fetch = 'fetch', $rowCount = 1, 
              $onlyRowCount = false, $outputerror = false, $params= array())

{...
    call_user_func_array($stmt->$fetch, $params);
...}

https://secure.php.net/manual/en/function.call-user-func-array.php

答案 2 :(得分:0)

@Your Common Sense重新给出答案后,我在我的DB级中找到了这个函数:

    public static function Query($query, $prepared = [], $outputerror = true) {
        /* Lets a user run a query directly via $core->Query()
        /* First variable is the actual query
        /* Second variable is the variables array (for prepared queries) [':var1'=>$var1],[$var1,$var2] and so on
        /* Third variable tells whether or not to output errormessages - default no (false)
        /* Use the function like $row = $core->Query(); Minimum you need to enter $query */
        $dbprefix = Config::read('dbprefix');
        $core = Core::getInstance();
        $stmt = '';
        if (!empty($query)) {
            if (!$prepared) {
                $stmt = $core->dbh->query($query);
                if ($stmt !== false) {
                    return $stmt;   
                } elseif ($outputerror === true) {
                    echo displayErrors($stmt, true, __FILE__);
                }
            } else {
                $stmt = $core->dbh->prepare($query);
                if ($stmt !== false) {
                    $stmt->execute($prepared);
                } elseif ($outputerror === true) {
                    echo displayErrors($stmt, true, __FILE__);
                }
            }
            return $stmt;
        }
    } // end function Query

完美地工作,在我的其他文件中进行了一些重写,但这是预期的

我已经回复了@Your Common Sense

的答案

答案 3 :(得分:-1)

这在我的测试中适用于根据参数运行不同的fetch方法:

function query($sql, $fetch) {
    $pdo = new PDO('mysql:host=127.0.0.1;dbname=test', 'root', 'xxxx');
    $stmt = $pdo->query($sql);
    $result = $stmt->$fetch();
    return $result;
}

(我并不建议为每个查询建立新的连接,而这正是我为测试所做的。)

但是,尝试进行动态调用来控制获取模式和其他参数会更复杂。我建议创建一个可调用的:

function query($sql, $fetch, $setFetchModeArgs = null) {
    $pdo = new PDO('mysql:host=127.0.0.1;dbname=test', 'root', 'masterkey');
    $stmt = $pdo->query($sql);
    if ($setFetchModeArgs != null) {
        call_user_func_array([$stmt, "setFetchMode"], $setFetchModeArgs);
    }
    $result = $stmt->$fetch();
    return $result;
}

query("SELECT ...", "fetchAll", [PDO::FETCH_COLUMN, 0]);

无论如何,那就是如何做出你正在尝试做的事情。但我不认为这是一个很好的设计。