Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/300.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/69.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 如何记录特定用户执行的查询_Php_Mysql_Mysqli - Fatal编程技术网

Php 如何记录特定用户执行的查询

Php 如何记录特定用户执行的查询,php,mysql,mysqli,Php,Mysql,Mysqli,我想保留已执行MySQLI查询的表日志历史记录,并在我的任何(所有)PHP页面上记录执行查询的特定用户以及执行查询的日期和时间 实现这一目标的最佳方式和最简单方式是什么? PHP session_start(); if(!isset($_SESSION["username"])){ header("Location: login.php"); exit(); } $connection = mysqli_connect("****", "****", "****", "****");

我想保留已执行MySQLI查询的表日志历史记录,并在我的任何(所有)PHP页面上记录执行查询的特定用户以及执行查询的日期和时间

实现这一目标的最佳方式和最简单方式是什么?

PHP

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";
    }
}