Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/227.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 如何通过函数路由每个mysql查询?_Php_Mysql_Sql - Fatal编程技术网

Php 如何通过函数路由每个mysql查询?

Php 如何通过函数路由每个mysql查询?,php,mysql,sql,Php,Mysql,Sql,我开发了一个项目,在该项目下使用了几个sql查询。现在我想监视一些查询以提高安全性。所以我希望每个查询首先通过一个函数传递。因为有太多的查询,所以我无法返回并编辑每个文件和查询。是否有一种方法可以在查询发送到mysql服务器之前捕获它们?如果您想使用SQL profiler监视传入查询,那么这是一种很好的方法,可以收集有关SQL内部发生的情况的信息,而无需通过单个函数或过程进行传递。如果您想使用SQL监视传入查询探查器是一种收集SQL内部信息的极好方法,无需通过单个函数或过程进行传递。根据您使用

我开发了一个项目,在该项目下使用了几个sql查询。现在我想监视一些查询以提高安全性。所以我希望每个查询首先通过一个函数传递。因为有太多的查询,所以我无法返回并编辑每个文件和查询。是否有一种方法可以在查询发送到mysql服务器之前捕获它们?

如果您想使用SQL profiler监视传入查询,那么这是一种很好的方法,可以收集有关SQL内部发生的情况的信息,而无需通过单个函数或过程进行传递。

如果您想使用SQL监视传入查询探查器是一种收集SQL内部信息的极好方法,无需通过单个函数或过程进行传递。

根据您使用的内容,有四种方法可以实现这一点,最后一种更可靠

常规查询日志 MySQL提供了一种机制,通过通用查询日志记录
mysqld
进程正在做的一切。正如您在问题中所述,您可能没有持久连接,因此您需要:

  • mysqld
    进程启动时,使用
    • 使用
      Set global general\u log='ON'
      设置全局/会话变量
有关常规查询日志的更多信息,请参阅

使用
sed
(或手动!)
此技术包括创建一个新函数,并重命名所有
mysqli.*
函数调用以调用另一个函数

假定新创建的函数名为
proxy\u query()
,则可以使用
sed
遍历所有文件并自动更改它们:

sed i '.bck' 's/mysqli_query/proxy_query/'
-i
参数指定文件应就地编辑,并且应制作原始文件的副本并附加
.bck
扩展名

运行工具包的
runkit
extension
我必须承认,我在这里太天真了,而且我以前没有使用过这个特定的扩展,但是可以使用这个PECL扩展重命名函数。 这个扩展的需求可以在这里找到,注意它没有与PHP捆绑在一起

如上所述,您可以创建一个代理函数,所有调用都将通过该函数。让我们假设它也被称为
proxy\u query
。用法如下所示:

// rename the function (a very bad idea, really!)
runkit_function_renam('mysqli_connect', 'proxy_super');

function mysqli_query($query, $resultmode = MYSQLI_STORE_RESULT)
{
    // do something with the SQL in $query
    // .. and call mysqli_query, now proxy_super
    return proxy_super($query, $resultmode);
}
我必须在此指出,这种方法非常不受欢迎。您不需要设置默认的PHP函数

使用Pdo/OO mysqli 这是最简单的技术,也可能是最可靠的。如果您已经在使用Pdo,只需扩展
\Pdo
类即可。类似的方法可用于MySQL改进(
mysqli
):

这里还要注意,只有当您使用Pdo,并且能够更改
Pdo
对象的实例化,将其覆盖到您自己的类:
MyPdo
时,这才有效。
有关
\Pdo
类及其子类的更多信息,请参阅。

根据您使用的内容,有四种方法可以实现此目的,最后一种方法更可靠

常规查询日志 MySQL提供了一种机制,通过通用查询日志记录
mysqld
进程正在做的一切。正如您在问题中所述,您可能没有持久连接,因此您需要:

  • mysqld
    进程启动时,使用
    • 使用
      Set global general\u log='ON'
      设置全局/会话变量
有关常规查询日志的更多信息,请参阅

使用
sed
(或手动!)
此技术包括创建一个新函数,并重命名所有
mysqli.*
函数调用以调用另一个函数

假定新创建的函数名为
proxy\u query()
,则可以使用
sed
遍历所有文件并自动更改它们:

sed i '.bck' 's/mysqli_query/proxy_query/'
-i
参数指定文件应就地编辑,并且应制作原始文件的副本并附加
.bck
扩展名

运行工具包的
runkit
extension
我必须承认,我在这里太天真了,而且我以前没有使用过这个特定的扩展,但是可以使用这个PECL扩展重命名函数。 这个扩展的需求可以在这里找到,注意它没有与PHP捆绑在一起

如上所述,您可以创建一个代理函数,所有调用都将通过该函数。让我们假设它也被称为
proxy\u query
。用法如下所示:

// rename the function (a very bad idea, really!)
runkit_function_renam('mysqli_connect', 'proxy_super');

function mysqli_query($query, $resultmode = MYSQLI_STORE_RESULT)
{
    // do something with the SQL in $query
    // .. and call mysqli_query, now proxy_super
    return proxy_super($query, $resultmode);
}
我必须在此指出,这种方法非常不受欢迎。您不需要设置默认的PHP函数

使用Pdo/OO mysqli 这是最简单的技术,也可能是最可靠的。如果您已经在使用Pdo,只需扩展
\Pdo
类即可。类似的方法可用于MySQL改进(
mysqli
):

这里还要注意,只有当您使用Pdo,并且能够更改
Pdo
对象的实例化,将其覆盖到您自己的类:
MyPdo
时,这才有效。
有关
\Pdo
类及其子类的更多信息,请参阅。

哪些是这些查询,请选择查询或更新在Oracle中,这将是行级安全性或细粒度访问控制。我会首先调查权限。哪些是查询,选择查询或更新在Oracle中,这将是行级安全或细粒度访问控制。