sprintf错误LIKE %%?%%

时间:2014-07-07 01:04:23

标签: 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. WHERE provider_name LIKE" %%%?%%%"
  2. WHERE provider_name LIKE"%?%"
  3. WHERE provider_name LIKE %%?%%
  4. WHERE provider_name LIKE %%%?%%%
  5. 我仍然有错误..

    错误:

    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 ,因此我使用进行查询。

2 个答案:

答案 0 :(得分:2)

你只需要?在查询中。

$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将表名注入查询字符串中,我认为TABLE_NAME1是常量,但不要先用户输入而不先清理它,否则你会打开自己的SQL注入攻击。

这个问题的重复

PHP Binding a Wildcard

答案 1 :(得分:0)

我目前的解决方案:

concat('%', ?, '%') 

@artisticphoenix谢谢你!