我正在尝试弄清楚如何将我的历史脚本从 mysql_query() 转换为 PDO。我有一个包含 4 个输入字段的表单,您可以随机选择这些字段。这意味着可以根据您要获取的信息选择 0、1、2、3、4 个字段。
我试过像这样查询数据库:
$q = $db->prepare('SELECT date,
name,
action
FROM history
WHERE name = :name
AND action = :action');
$q->bindParam(':name', $Name, PDO::PARAM_STR, 20);
$q->bindParam(':action', $Action, $PDO::PARAM_STR, 20);
$q->execute();
但如果我没有选择任何字段并希望显示整个历史记录,这将不起作用。
使用 mysql_query() 我会这样做:
mysql_query('SELECT date,
name,
action
FROM history
$Name
$Action');
这意味着如果没有 $Name 或 $Action,它们就不会包含在查询中。
我是否应该将旧查询复制/粘贴到 $q = $db-query('') 中?但这违背了使用 PDO 的目的。
最佳答案
您始终可以为符合列名的参数分配默认值。
这样您的查询在默认情况下将以 where column = column
结束。当存在值时,它将是 where column = value
.
编辑:
当然,我的逻辑有点问题,因为bindParam
那样不行。相反,您应该根据参数集逐步构建您的语句。
/* Start with the most general case for the sql query.
* The where part always evaluates to true and will thus
* always return all rows and exists only to make appending
* further conditions easier.
*/
$q = 'SELECT date, name, action FROM history WHERE 1';
/* Prepare a params array in any way you wish. A loop might be more
* efficient if it is possible, but since in this example you have
* only 2 variables, it didn't seem necessary
*/
$params = array();
if (! empty($Name)) {
$params['name'] = $Name;
}
if (! empty($Action)) {
$params['action'] = $Action;
}
/* When the params array is populated, complete the sql statement by
* appending the param names joined with ANDs
*/
foreach ($params as $key => $value) {
$q .= sprintf(' AND `%s` = :%s', $key, $key);
}
/* When the query is complete, we can prepare it */
$stmt = $db->prepare($q);
/* Then bind the values to the prepared statement
*/
foreach ($params as $key => $value) {
// Using bindValue because bindParam binds a reference, which is
// only evaluated at the point of execute
$stmt->bindValue(':'.$key, $value);
}
/* Now we're ready to execute */
$stmt->execute();
在此示例中,empty
check 可以在我们完成 sql 语句的循环中完成,但这会给你一个不太一般的例子。
此示例还省略了 bindValue
的类型参数,但这很容易实现,例如通过将数组值更改为具有该类型作为成员的对象或数组,或者通过在分配循环中进行鸭式输入。
只要您向它提供初始(一般情况)查询以及 params 数组,就可以将这种形式的查询构建轻松放入一个函数中,该函数可以满足您所有的数据库查询需求。
关于php - 使用 PHP PDO 进行动态查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4538960/