Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/71.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_Parsing - Fatal编程技术网

PHP:解析MySQL查询语句中的列名值?

PHP:解析MySQL查询语句中的列名值?,php,mysql,sql,parsing,Php,Mysql,Sql,Parsing,我正在尝试为一个网站建立审计日志记录。我想做的是,如果可能的话,允许现有的MySQL查询进入一个PHP函数,该函数解析数据并将其存储在审计日志表中 例如,如果我有查询 UPDATE members SET name='Bob', age='40' WHERE memberId=123 然后我希望能够提取表名成员、rowid123和两个列/数据,就像键/值对name:Bob和age:40一样 如果可能的话,我想要一个解决方案,该解决方案还允许其他查询格式: UPDATE members (nam

我正在尝试为一个网站建立审计日志记录。我想做的是,如果可能的话,允许现有的MySQL查询进入一个PHP函数,该函数解析数据并将其存储在审计日志表中

例如,如果我有查询

UPDATE members SET name='Bob', age='40' WHERE memberId=123
然后我希望能够提取表名成员、rowid123和两个列/数据,就像键/值对name:Bob和age:40一样

如果可能的话,我想要一个解决方案,该解决方案还允许其他查询格式:

UPDATE members (name,age) VALUES ('Bob','40') WHERE memberId=123
然后这些将进入审计日志表,该表如下所示:

+--------+---------+--------+-----+-----------+-----------+
| user   | table   | column | row | old_value | new_value |
+--------+---------+--------+-----+-----------+-----------+
| admin  | members | name   | 123 | Joe       | Bob       |
+--------+---------+--------+-----+-----------+-----------+
| admin  | members | age    | 123 | 32        | 40        |
+--------+---------+--------+-----+-----------+-----------+
显然,要填充这个表,您可以看到为什么我需要提取这些值。理想情况下,我希望从现有的MySQL查询字符串中执行此操作,并将其传递到PHP函数中以处理现有代码,但如果需要实现新的PHP函数,我愿意听取建议


Regex看起来既复杂又痛苦,因为我必须为每个表的每个列名格式化它。有没有解决这个问题的解析方法?

您是否使用任何框架?解析SQL是一种糟糕的做法。例如,在Zend Framework中,您可以覆盖update或insert,只需获取SQL模式即可。您需要两件事:一个审计表和一个触发器!审计表将包含每个字段的新值和旧值。我会为每个表创建一个审计表,我认为这比为所有表创建一个审计表要好。触发器将完成繁重的工作。不,目前plage中没有框架。我不希望每个表都有一个单独的表,因为这样一来,单从表/列的数量上来说,数据库的大小就增加了一倍。您可以为每个表创建一个触发器,并且每个触发器调用只需一个过程。我不认为每个表都有触发器是一个问题。我在许多系统中使用过大型数据库,每个表3k、5k表有一个触发器。你可以动态地做,这里有一个例子:@JorgeCampos:你每天都学到一些东西,我不认为要动态地创建,你是绝对正确的!