Php 如何记录特定用户执行的查询
我想保留已执行MySQLI查询的表日志历史记录,并在我的任何(所有)PHP页面上记录执行查询的特定用户以及执行查询的日期和时间 实现这一目标的最佳方式和最简单方式是什么? PHPPhp 如何记录特定用户执行的查询,php,mysql,mysqli,Php,Mysql,Mysqli,我想保留已执行MySQLI查询的表日志历史记录,并在我的任何(所有)PHP页面上记录执行查询的特定用户以及执行查询的日期和时间 实现这一目标的最佳方式和最简单方式是什么? PHP session_start(); if(!isset($_SESSION["username"])){ header("Location: login.php"); exit(); } $connection = mysqli_connect("****", "****", "****", "****");
session_start();
if(!isset($_SESSION["username"])){
header("Location: login.php");
exit(); }
$connection = mysqli_connect("****", "****", "****", "****");
if (!$connection) {
die("Database connection failed: " . mysqli_connect_error());
}
if(isset($_POST['update'])) {
$accountNo = $_GET['ID'];
$firstname = $_POST['firstname'];
$surname = $_POST['surname'];
$dob = $_POST['dob'];
$email = $_POST['email'];
$phone = $_POST['phone'];
$address = $_POST['address'];
$town = $_POST['town'];
$postcode = $_POST['postcode'];
SO用户推荐:
然而,这个建议有很多错误
编写一个包装器库,记录所有要录制的
mysqli
调用,例如
function my_mysqli_query($link, $query, $resultmode = MYSQLI_STORE_RESULT) {
log_action('mysqli_query', $query);
return mysqli_query($link, $query, $resultmode);
}
function my_mysqli_prepare($link, $query) {
log_action('mysqli_prepare', $query);
return mysqli_prepare($link, $query);
}
...
define("LOG_FILE", "/path/to/logfile.txt");
function log_action($action, $data) {
$time = date('Y-m-d h:i:s');
$user = isset($_SESSION['username']) ? $_SESSION['username'] : '';
message = "$time\tuser=$user\taction=$action\tdata=$data\n";
file_put_contents(LOG_FILE, $message, FILE_APPEND);
}
我已将其写入日志文件。您可以改为登录到数据库表,这只是log\u action()
中的更多代码
然后在所有其他脚本中执行全局替换,将mysqli\u query
替换为my\u mysqli\u query
,mysqli\u prepare
替换为my\u mysqli\u prepare
,依此类推。因此,您的代码如下所示:
if(isset($_POST['update'])) {
$accountNo = $_GET['ID'];
$firstname = $_POST['firstname'];
$surname = $_POST['surname'];
$dob = $_POST['dob'];
$email = $_POST['email'];
$phone = $_POST['phone'];
$address = $_POST['address'];
$town = $_POST['town'];
$postcode = $_POST['postcode'];
$query = "UPDATE usertable set firstname = '".$firstname."', surname='".$surname."', dob='".$dob."', email='".$email."', phone='".$phone."', address='".$address."', town='".$town."', postcode='".$postcode."' where accountNo='".$accountNo."'";
$result = my_mysqli_query($connection,$query);
if ($result) {
echo "Update successful";
}
}
您可以围绕mysqli函数编写自己的包装器库,并让它记录所做的一切。@Barmar我还有其他50个PHP页面,这是否需要修改每个PHP页面上的每个mysqli查询?好吧,没有内置的工具可以做到这一点。@blupointmedia MySQL触发器如何知道用户是谁?这大概是一个PHP会话变量。这个东西充满了非常严重的SQL注入错误,所以在有人利用其中一个漏洞并为您“修复”您的站点之前,您必须非常仔细地阅读这些代码并修复这些调用。需要注意的是,大多数PHP ORMs(,或者只是一些示例)都会为您做一些开箱即用的日志记录,比如迁移管理。您不能写入URL,它必须是本地路径名。即使我只做logfile.txt。。。。它不会保存任何东西——因为我所有的文件都在同一个区域(public_html)——如果你看一下我的过程代码,我相信这个例子存在一些问题。我相信它并没有保存任何东西——不是因为路径,而是因为我为会话生存期的保存路径(ini_集)所做的实际功能。此外,还具有
log_操作('mysqli_prepare',$query)代码>产生了错误,所以我不得不将其更改为$log\u action($connection,$query)
和$action&$data…它们存储的变量是什么?这毫无意义。log_操作对数据库没有任何作用,为什么它需要$connection?mysqli_query()需要至少两个参数,一个给定的参数
if(isset($_POST['update'])) {
$accountNo = $_GET['ID'];
$firstname = $_POST['firstname'];
$surname = $_POST['surname'];
$dob = $_POST['dob'];
$email = $_POST['email'];
$phone = $_POST['phone'];
$address = $_POST['address'];
$town = $_POST['town'];
$postcode = $_POST['postcode'];
$query = "UPDATE usertable set firstname = '".$firstname."', surname='".$surname."', dob='".$dob."', email='".$email."', phone='".$phone."', address='".$address."', town='".$town."', postcode='".$postcode."' where accountNo='".$accountNo."'";
$result = my_mysqli_query($connection,$query);
if ($result) {
echo "Update successful";
}
}