使用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" %%?%%"
我尝试使用以下内容多次更改它:
我仍然有错误..
错误:
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 ,因此我使用?进行查询。
答案 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注入攻击。
这个问题的重复
答案 1 :(得分:0)
我目前的解决方案:
concat('%', ?, '%')
@artisticphoenix谢谢你!