我想为我的数据库抽象创建一个db_queryf
函数。它会像SQLite:db_queryf('select * from pages where name=%q', $_GET['name'])
中的sqlite3_mprintf
那样工作,其中%q将产生正确转义的字符串。在PHP中制作类似printf的函数的正确方法是什么?有没有帮助功能,或者我应该自己解析它?如何在PHP中实现类似printf的函数?
0
A
回答
0
2
我很困惑... (s)printf
说白了媒体链接存在,你可能想使用SQLite3Stmt::bindValue
更多对于这一点,除非你想逃脱/ SQL注入地狱结束了..
1
使用PDO prepared statements。更换成线不够好,你应该消毒。
0
好的,因为我有完全相同的问题,所以我给了它一个镜头,它似乎很好地工作。
下面的函数位于一个数据库包装类的内部,并期望被称为如printf,其中%%
被变换为文字%,%e
标记字符串参数转义,和%u
标志着一个字符串参数采取原样是。
LOGDB
是第二个数据库环绕类,它负责捕获和记录各种错误。
public static function query($format)
{
$query = $format . ' ';
$argc = func_num_args();
$argv = func_get_args();
$index_query = 0;
$index_args = 1;
while (($index_query = strpos($query, '%', $index_query)) !== false)
{
switch ($query[$index_query + 1])
{
case '%':
$query = substr_replace($query, '', $index_query, 1);
$index_query++;
break;
case 'e':
if ($index_args >= $argc)
{
LOG::failedQuery($format, "not enough arguments for format");
return false;
}
$query = substr_replace($query, DB::escape($argv[$index_args]), $index_query, 2);
$index_query += strlen($argv[$index_args]);
$index_args++;
break;
case 'u':
if ($index_args >= $argc)
{
LOG::failedQuery($format, "not enough arguments for format");
return false;
}
$query = substr_replace($query, $argv[$index_args], $index_query, 2);
$index_query += strlen($argv[$index_args]);
$index_args++;
break;
default:
LOG::failedQuery($format, "unknown control sequence '%" . $query[$index_query + 1] . "'");
return false;
}
}
if ($index_args != $argc)
{
LOG::failedQuery($format, "too many arguments for format");
return false;
}
$res = mysqli_query(self::$handle, $query);
if (!$res)
LOGDB::failedQuery($query, mysqli_error(self::$handle));
return $res;
}
注意:代码大部分是未经测试的,很可能是,它包含一堆bug。请谨慎使用:)
相关问题
- 1. 如何实现类似数据类型
- 2. 如何在php/mysql中实现类似SO的标记系统?
- 3. 如何在PHP中实现类似YQL的API?
- 4. 如何在PHP中实现类似MySQL的latin1_general_ci排序规则?
- 5. PHP:如何为局部函数变量实现类似__get的方法
- 6. 如何实现一堆类似的类
- 7. 是否可以在PHP中实现类似数组的对象?
- 8. 如何在PHP中创建类似WordPress的函数?
- 9. OCJP - 在java中实现printf
- 10. 如何在类中注入两个类似的实现?
- 11. 如何实现类似gmail的热键
- 12. 如何实现类似gravatar的算法?
- 13. 如何在php中的表中实现爆炸函数?
- 14. PHP函数与此类似JavaScript函数
- 15. Kotlin - 覆盖/实现类似数组的访问器函数
- 16. 如何在android中实现类似于css中的on_hover?
- 17. 如何在PHP/JavaScript中实现等效的Win32函数MessageBox?
- 18. 如何在PHP中实现SQLite的C用户函数
- 19. 在PHP中正确实现虚函数?
- 20. C++:如何在基类的父接口中实现函数?
- 21. 如何在android上实现类似“Printer Discover”的服务发现?
- 22. 如何在Swift中实现ROT13函数?
- 23. 如何在OpenCV中实现signum函数?
- 24. 如何在CoreData中实现函数
- 25. 如何在tensorflow中实现类似keras的子样本?
- 26. 如何在UITableView中实现类似UIImageView的延迟加载
- 27. 如何在JQuery中实现类似于文本框的facebook
- 28. 我该如何在java中实现类似apache的重载?
- 29. 如何在C++中实现一个类似SQL的容器
- 30. 如何使用循环在matlab中实现类似的语句?
您可能希望检查['func_get_args'](http://php.net/func_get_args),['func_get_arg'](http://php.net/func_get_arg )和['func_num_args'](http://php.net/func_num_args),但是你必须解析查找'%like'占位符的查询字符串,它可能会干扰你想要使用'name LIKE'%foo%'查询。 – 2012-06-19 11:19:43
非常可行,被低估的问题......这是一个耻辱的答案是无用的,虽然:(你有没有找到你的问题的解决方案? – 2013-11-25 19:24:09