我想将所有旧样式查询修改为准备好的语句,并摆脱对 mysqli 转义等的关心。 经过分析,我决定坚持使用 mysqli 准备好的语句。
我正在考虑两种策略:
使用我每次进行查询时都会使用的 PHP 自定义 try_query() 函数,并使其分析每个查询,即时转换为准备好的语句。看起来很复杂并且减慢了一切。
批量转换源代码
由于我更喜欢解决方案 2,所以我现在的问题是:
哪种语言/网站/软件最适合查找查询文本、分析它们并通过在同一源文件中传输参数来编写新请求?
我尝试过手工工作,错误很多,而且过程很慢。
我怀疑是否存在这样的工具。不久前Rector尝试过类似的事情,结果证明这几乎是不可能完成的任务。
您需要手动完成这一切。您需要将非参数化查询的每个实例视为错误,因为在某种程度上它就是错误。您需要检查整个代码并找到不应在 SQL 查询中直接插入变量的位置并修复它。这也可能会发现其他错误。您的代码可能包含动态构建的查询,其中插入查询的常量/白名单部分是唯一的方法,例如列入白名单的表/列名称。编写软件来自动、可靠地为您完成此操作将需要一个具有大量规则的成熟 SQL 解析器。
这种手动工作本来应该在从 PHP 4 迁移到 PHP 5 时完成。当时引入了 mysqli 作为这些旧项目的临时解决方案。简单的查询将被替换为参数化语句,而不太容易的地方可以用
mysql_espace_string
替换 mysqli_escape_string
并继续工作,直到可以完成更大的代码重构。
您可以做的就是对现有项目遵循相同的策略。继续一一替换每个查询,直到修复所有问题。现在 mysqli 准备好的语句比过去更容易使用。您可以使用
mysqli_execute_query()
以最小的麻烦来参数化您的查询。如果您计划将来切换到 PDO,您可以继续使用 try_query()
函数,以便它可以提供底层 DB API 的一些抽象。