-1

我知道这与 SO 有点离题,因为我没有代码而且我的问题很抽象。

我想在 PHP 语言中添加一个功能:
现有功能:

$var=123;
$string = "This is a {$var} variable";

需要 SQL 变量的新功能:

$var="asd' union ()";
$string = "This is a {(QUOTE)$var} quoted variable";

或者:

$var="asd' union ()";
$string = "This is a {QUOTE($var)} quoted variable";

这个想法是扩展字符串 curly 语法以支持函数或一些硬编码函数来引用变量。

我的问题是:
有没有办法编写一个提供这种功能的 php 模块/扩展?
如果是这样,我必须从哪里快速开始?

解决方案

function _quote($v) { return strtoupper($v); }
$_Q = '_quote';
$string = "This is an {$_Q($var)} integer";
echo $string;

我想这是我想要的最接近的,而不必破解 php 本身

4

2 回答 2

0

请使用准备好的 SQL 语句。另外,请阅读:https ://blog.codinghorror.com/give-me-parameterized-sql-or-give-me-death/

不喜欢准备好的语句并不是不使用它们的理由,而是可以找到一个可以更好地处理它们的可信库,以不同的方式处理它们,或者甚至可以切换到 ORM。

为了更多地关注您的问题,通过使用诸如 Mustache 之类的东西、将其分叉并在您的自定义中分层,可能会更容易完成您想要的事情。https://github.com/bobthecow/mustache.php

我非常怀疑您是否能够构建一个模块来提供这种功能。大多数模块都提供了非常具体/独立的附加功能。我想不出一个模块可以修改本地语言结构的行为方式。为此,您需要修改 PHP Core 本身,这意味着编写一些 C,然后部署与其他任何东西都不兼容的 PHP 版本。

于 2020-01-31T23:33:09.857 回答
0

一般来说,您提出的用例是最没用的,因为无论如何您都应该使用参数化查询。你可能是在解决错误的问题之后。但是,要扩展语言本身,就必须修改解析器。这需要了解YACCC以及一些 PHP 内部知识。在您的情况下,这绝不是一件微不足道的事情,特别是因为您不仅要修改 PHP 解析字符串的方式,还要修改它编译需要函数执行的操作码的方式。

如果您好奇,可以在Nikita 的博客中阅读有关如何实现您的想法的详细博客文章。尽管我认为有一个比尝试修改整个 PHP 语言更容易解决您在 SQL 中转义字符串的直接问题的方法。


在此答案中对 PHP 解析器的工作原理进行更详细的解释将是详尽无遗的。这就是为什么我要链接到我所知道的问题的技术上最正确的解释。


重要的旁注

需要明确的是,这不能是扩展。您没有扩展 PHP。你实际上是在改变它。因为 PHP 解析器必须从自身编译(是的,我们编译编译器),所以您不能简单地提供一个共享对象来执行此操作。您必须从头开始构建整个 php-src 树,包括解析器本身(通常与 php 一起预打包)。

这样做的结果是,您现在已经分叉了自己的 PHP 语言实现,它不再与事实上的 PHP 兼容。

换句话说......你拥有它的生活

于 2020-01-31T23:25:47.537 回答