我有一个PHP应用程序,它为多个用户使用单个数据库。用户登录,他们的ID存储在会话中,他们使用该应用程序来检索或更新数据库中的数据。
出于安全/存档的目的,我想基于每个用户记录每个SQL事务。请注意,“user”不是MySQL用户,因为他们只使用一个用户。我该怎么做?
我目前正在运行Centos 5.8,PHP 5.3.18和MySQL 5.5。
由于
答案 0 :(得分:0)
$sql = "UPDATE table SET col = ?"
$db->prepare($sql);
//some params etc...
$filename = '/dir/logs/log-' . $_SESSION['username'] . '';
$handle = fopen($filename, "wr");
$db->execute();
fwrite($handle, $sql);
这是一个简单的例子,您如何使用查询执行和写入文件,以用户命名。好吧,使用这种方式也许你会在执行之前获得$ sql的内容,但我认为你明白了。
P.S。:编辑的Thx:)
答案 1 :(得分:0)
您可以配置MySQL以生成 General query log (GQL)。此日志记录从所有客户端收到的已建立的客户端连接和语句。它是一个常规文本日志文件,按照收到的顺序记录每个命令。它包含时间戳,Id,命令和参数。
由于数据库请求通过服务器在本地运行,因此不存在IP地址和会话。时间戳允许从Web服务器与客户端的IP条目进行相当精确的匹配,即Apache httpd或Tomcat Access log file (ALF)。
我们使用GQL来增强GWT Web应用程序生成的稀疏ALF信息。
此示例常规查询日志应该为您提供以下想法:
110602 12:55:20 3 Connect root@localhost on w2p
3 Query /* mysql-connector-java-5.1.15 ( Revision: ${bzr.revision-id} ) */SHOW VARIABLES WHERE Variable_name ='language' OR Variable_name = 'net_write_timeout' OR Variable_name = 'interactive_timeout' OR Variable_name = 'wait_timeout' OR Variable_name = 'character_set_client' OR Variable_name = 'character_set_connection' OR Variable_name = 'character_set' OR Variable_name = 'character_set_server' OR Variable_name = 'tx_isolation' OR Variable_name = 'transaction_isolation' OR Variable_name = 'character_set_results' OR Variable_name = 'timezone' OR Variable_name = 'time_zone' OR Variable_name = 'system_time_zone' OR Variable_name = 'lower_case_table_names' OR Variable_name = 'max_allowed_packet' OR Variable_name = 'net_buffer_length' OR Variable_name = 'sql_mode' OR Variable_name = 'query_cache_type' OR Variable_name = 'query_cache_size' OR Variable_name = 'init_connect'
110602 12:55:21 3 Query /* mysql-connector-java-5.1.15 ( Revision: ${bzr.revision-id} ) */SELECT @@session.auto_increment_increment
3 Query SHOW COLLATION
3 Query SET NAMES utf8mb4
3 Query SET character_set_results = NULL
3 Query SET autocommit=1
3 Query select * from user where username = 'asdasd' and password = 'aa'
1 Query show global status
110602 12:55:25 1 Query show global status
110602 12:55:30 3 Query select * from user where username = 'costis' and password = 'snafu'
答案 2 :(得分:0)
您可以开启并阅读MySQL general query log。它包含所有这样的查询:
...
130404 19:02:50 476 Connect test@localhost on test
476 Query SET NAMES utf8
476 Query SELECT * FROM `table1`
130404 19:02:52 476 Quit
130404 19:03:33 477 Connect test@localhost on test
477 Query SET NAMES utf8
...
476,477等是 MySQL线程ID 。每个新连接都拥有它的ID。 您只需知道您用户的主题ID 即可。对于PHP mysqli扩展,您可以使用mysqli_thread_id()
echo $_SESSION['username'].' '.
date('Y-m-d H:i:s').' '.
mysqli_thread_id($link);
将此值存储到某个地方以便在日志中匹配。