好的 - 所以我有自定义功能
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
作为赋值?将变量转换为某种东西或其他方式?
答案 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]);
无论如何,那就是如何做出你正在尝试做的事情。但我不认为这是一个很好的设计。