首页 > 解决方案 > 创建日志表以注册记录 MySql PHP

问题描述

我正在尝试log为我的数据库创建一个表来记录发生的所有操作,并且我正在考虑为每个表创建一个日志表,以便能够轻松读取信息。
但我不知道该怎么做,因为我希望将log表格输入到一个变量,我将在该变量中格式化文本并将其他变量用于注册输入。
例如:$log = '[' . $data_log . '] ' . ' The item '. $ativo .' with the S/N '. $numero_serie .' was delivered to the employee '. $id_colaborador);

对于我拥有的数据库,我知道这是错误的,但我不知道为什么..

if ($valid) {
    $pdo = Database::connect();
    $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

    $acao_log2 = '[' . $data_log . '] ' . ' O ativo '. $ativo .' com o S/N '. $numero_serie .' foi entregue ao colaborador '. $id_colaborador . ' [' . $user . ']' ; 



    $sql = "INSERT INTO ativos (ativo,comentario,data_aquisicao,localizacao,fabricante,modelo,imei,
            numero_serie,ativo_sap,evento,data_evento,id_colaborador) 
            SELECT ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, id_colaborador 
            FROM colaboradores 
            WHERE nome = ?";



    $log = "INSERT INTO log_ativos (acao_log, data_log, id_ativo)
            VALUES (". $acao_log2 . "," . $data_log . ", id_ativo = id_ativo WHERE id_ativo = ?";

    $q = $pdo->prepare($sql);
    $qlog = $pdo->prepare($log);
    $q->execute(array($ativo,$comentario,$data_aquisicao,$localizacao,$fabricante,$modelo,$imei,$numero_serie,$ativo_sap,$evento,$data_evento,$id_colaborador));
    $qlog->execute(array($acao_log,$data_log,$id_ativo));
    Database::disconnect();


问题是,我不希望用户为日志输入任何内容,它应该是自动的:/

致命错误:未捕获的 PDOException:SQLSTATE[HY093]:无效参数编号:绑定变量的数量与 C:\xampp\htdocs\gestao\Ativos\create.php:129 中的标记数量不匹配堆栈跟踪:#0 C:\ xampp\htdocs\gestao\Ativos\create.php(129): PDOStatement->execute(Array) #1 {main} 在第 129 行的 C:\xampp\htdocs\gestao\Ativos\create.php 中抛出

标签: phpmysql

解决方案


您的查询在很多层面上都是错误的。

  1. SELECT ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, id_colaborador 这个真正错误的表和列名称不能被 PDO 中的参数替换。

  2. 您的插入查询也是错误的:

    $log = "INSERT INTO log_ativos (acao_log, data_log, id_ativo) VALUES (". $acao_log2 . "," . $data_log . ", id_ativo = id_ativo WHERE id_ativo = ?";

上面的查询非常错误.. INSERT 不支持 where 子句,而是您正在查看更新。

这可能是您正在寻找的。

<?php
if ($valid) {
    $pdo = Database::connect();
    $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

    $acao_log2 = '[' . $data_log . '] ' . ' O ativo ' . $ativo . ' com o S/N ' . $numero_serie . ' foi entregue ao colaborador ' . $id_colaborador . ' [' . $user . ']';

    $sql = "INSERT INTO ativos (ativo,comentario,data_aquisicao,localizacao,fabricante,modelo,imei,
            numero_serie,ativo_sap,evento,data_evento,id_colaborador) 
            SELECT column1,column2,column3,column4,column5,column6,column7,column8,column9,column10,column11, id_colaborador 
            FROM colaboradores 
            WHERE nome = ?";

    $q = $pdo->prepare($sql);
    $q->execute(array($nomeVariable));

    $log  = "UPDATE log_ativos SET acao_log = ? , data_log = ? WHERE id_ativo = ? ";
    $qlog = $pdo->prepare($log);
    $qlog->execute(array($id_ativo));

}

?>

花点时间做sql查询教程,和php手册和sql手册做朋友

更新

根据您在下面的评论,

我想根据第一个查询将生成的 id_ativo 为该表创建一个新的日志记录,

那么当插入的第一个语句成功获取最后一个插入 id时您需要做什么,该插入 id是在下一个插入中生成并使用的。

这是如何:

<?php

if ($valid) {
    $pdo = Database::connect();
    $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

    $acao_log2 = '[' . $data_log . '] ' . ' O ativo ' . $ativo . ' com o S/N ' . $numero_serie . ' foi entregue ao colaborador ' . $id_colaborador . ' [' . $user . ']';

    $sql = "INSERT INTO ativos (ativo,comentario,data_aquisicao,localizacao,fabricante,modelo,imei,
            numero_serie,ativo_sap,evento,data_evento,id_colaborador) 
            SELECT column1,column2,column3,column4,column5,column6,column7,column8,column9,column10,column11, id_colaborador 
            FROM colaboradores 
            WHERE nome = ?";

    $q = $pdo->prepare($sql);
    $q->execute(array($nomeVariable));

    if ($q) {
        //get last ID that was generated by previos insert
        $id_ativo = $pdo->lastInsertId();

    }

    $log  = "INSERT INTO log_ativos (acao_log,data_log,id_ativo) VALUES(?,?,?)";
    $qlog = $pdo->prepare($log);
    $qlog->execute(array($acao_log2,$data_log,$id_ativo));

}

?>

推荐阅读