php - 使用 PHP PDO 进行动态查询

标签 php pdo

我正在尝试弄清楚如何将我的历史脚本从 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/

相关文章:

php - 远程永久同步

php - PDO 和类给出 fatal error : Call to a member function query()

php - PDO mysql 更新错误

php - PDO DELETE 还创建了一个新的 INSERT

javascript - PHP - 运行1插入查询同时运行两次记录

javascript - android 登录页面无法获取 php 响应

php - 如何清除未使用的 fontawesome 图标?

php - 通过 PHP 向 MySQL 表中插入数据

php比较日期

PHP PDO,插入查询后返回值对象