php - sprintf 错误如 %%?%%

标签 php mysql sql codeigniter

我在理解使用 sprintf 时的错误时遇到一些困难。

当前查询是:

$sql = sprintf('SELECT *
                FROM %s
                INNER JOIN %s a ON (a.user_id = created_by)
                LEFT JOIN %s b ON (b.user_id = modified_by)
                WHERE provider_name LIKE "%%?%%"
                LIMIT ?,?', TABLE_NAME1, TABLE_NAME2, TABLE_NAME3);
$q = $this->db->query($sql, array($q, $page['si'], (int)$offset));

此行发生错误:WHERE provider_name LIKE "%%?%%"

我已经尝试使用以下方法多次更改它:

  1. 哪里的provider_name LIKE“%%%?%%%”
  2. 哪里的provider_name LIKE“%?%”
  3. 哪里的provider_name LIKE %%?%%
  4. 哪里的provider_name LIKE %%%?%%%

我仍然收到错误..

错误:

A PHP Error was encountered

Severity: Warning

Message: sprintf(): Too few arguments

=====================================

A PHP Error was encountered

Severity: 4096

Message: Object of class CI_DB_mysql_result could not be converted to string

Filename: database/DB_driver.php

Line Number: 604

我应该如何使用 sprintf 正确执行此操作?

注意:我使用的是 codeigniter,因此我使用 ? 进行查询。

最佳答案

您只需要 ?在查询中。

$sql = sprintf('SELECT *
                FROM %s
                INNER JOIN %s a ON (a.user_id = created_by)
                LEFT JOIN %s b ON (b.user_id = modified_by)
                WHERE provider_name LIKE ?
                LIMIT ?,?', TABLE_NAME1, TABLE_NAME2, TABLE_NAME3);

然后将换行符“%”添加到输入字符串中。

$q = $this->db->query($sql, array('%'.$q.'%', $page['si'], (int)$offset));

这与仅使用 PDO 或 mysqli 相同,我使用 CI(修改太多我不知道我是否仍将其称为 CI)但不进行数据库植入。

使用 sprintf 将表名注入(inject)查询字符串时要小心,我认为 TABLE_NAME1 是常量,但是在没有先清理用户输入的情况下不要对它执行此操作,否则您将面临 SQL 注入(inject)攻击。

此问题重复

PHP Binding a Wildcard

关于php - sprintf 错误如 %%?%%,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24601808/

相关文章:

php - 寻找多语言代码片段 html 格式化程序(语法高亮器)

php - "Lost connection to MySQL server"由于各种原因

MySQL事务

PHP/MYSQL GROUP BY 基于分组的数组

php - 如何在 Lumen 5.5 中使用 .env 来使用多个数据库连接?

php - 尽管进行了配置,NginX 仍会在 60 秒后发出 HTTP 499 错误。 (PHP 和 AWS)

mysql - 使用 Junction Table 加入 MANY to MANY

sql - 检索配置值 SQL 错误日志

mysql - 如何在 MySQL 中返回数据透视表输出?

sql - 在排除 SQL 中的某些字段的同时对字段求和