Mysql
 sql >> Teknologi Basis Data >  >> RDS >> Mysql

Apakah mungkin untuk melihat data apa yang diubah oleh kueri?

OKE. Solusi saya adalah kombinasi PHP dan MySQL untuk membuatnya bekerja setransparan mungkin.

Metode ini ada di Data kelas pembungkus yang menggunakan PDO dan pernyataan yang disiapkan.

Beberapa penjelasan tentang metode lain yang digunakan:

  • Data::prepareAndExecute ($query, $tokens); adalah metode pintasan yang menyiapkan kueri, menjalankannya, dan, jika ada hasil, mengembalikan larik asosiatif dari hasil tersebut.
  • Data::isSafeDatabaseEntity ($table) cukup periksa apakah nama tabel cocok dengan preg_match ("/^([a-zA-Z0-9_]+)$/", $check); perintah untuk mencegah injeksi SQL. Ini karena saya tidak dapat menggunakan pernyataan yang disiapkan untuk nama bidang dan tabel.
  • Data::tableInfo ($table); mengembalikan larik asosiatif kolom dalam tabel berdasarkan informasi yang diterima dari PDOStatement::getColumnMeta (); .
  • Data::getTablePrimaryKey ($table); menggunakan hasil SHOW INDEX FROM... pertanyaan. Harus dikatakan bahwa ini dirancang untuk bekerja dengan PK bidang tunggal saja.

Ekstrak dari Data saya kelas:

public static function addTableLogging ($table, $ignorecolumns = array ())
{
    if (Data::isSafeDatabaseEntity ($table))
    {
        $update_trigger = "CREATE TRIGGER `{$table}_after_update` AFTER UPDATE ON `{$table}` FOR EACH ROW BEGIN\n";
        $insert_trigger = "CREATE TRIGGER `{$table}_after_insert` AFTER INSERT ON `{$table}` FOR EACH ROW BEGIN\n";
        $columns = Data::tableInfo ($table);
        $pk = Data::getTablePrimaryKey ($table);
        foreach ($columns as $column)
        {
            if (!in_array ($column ['name'], $ignorecolumns))
            {
                $update_trigger .= "   IF (NEW.{$column ['name']} != OLD.{$column ['name']}) THEN
     CALL changelog_store ('{$table}', OLD.{$pk}, '{$column ['name']}', OLD.{$column ['name']}, NEW.{$column ['name']});
  END IF;\n";
                $insert_trigger .= "   CALL changelog_store ('{$table}', NEW.{$pk}, '{$column ['name']}', '', NEW.{$column ['name']});\n";
            }
        }
        $update_trigger .= "END";
        $insert_trigger .= "END";

        self::removeTableLogging ($table);
        self::prepareAndExecute ($update_trigger);
        self::prepareAndExecute ($insert_trigger);
    }
}

public static function removeTableLogging ($table)
{
    if (self::isSafeDatabaseEntity ($table))
    {
        Data::prepareAndExecute ("DROP TRIGGER IF EXISTS `{$table}_after_update`;");
        Data::prepareAndExecute ("DROP TRIGGER IF EXISTS `{$table}_after_insert`;");
    }
}

public static function refreshLoggingProcedure ()
{
    /* -- for logging into MySQL Table:
      CREATE TABLE `changelog` (
        `change_id` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT,
        `change_table` VARCHAR(50) NULL DEFAULT NULL,
        `change_table_id` VARCHAR(25) NULL DEFAULT NULL,
        `change_field` VARCHAR(50) NULL DEFAULT NULL,
        `change_old` VARCHAR(255) NULL DEFAULT NULL,
        `change_new` VARCHAR(255) NULL DEFAULT NULL,
        `change_user` INT(10) UNSIGNED NOT NULL DEFAULT '0',
        `change_date` DATETIME NOT NULL DEFAULT '0000-00-00 00:00:00',
        PRIMARY KEY (`change_id`),
        INDEX `change_table_id` (`change_table_id`),
        INDEX `change_table` (`change_table`, `change_field`)
      );
    */
    $logquery = "CREATE PROCEDURE `changelog_store`(IN `tab` VARCHAR(50), IN `pkval` INT, IN `fieldn` VARCHAR(50), IN `oldv` TEXT, IN `newv` TEXT)
LANGUAGE SQL
NOT DETERMINISTIC
CONTAINS SQL
SQL SECURITY DEFINER
COMMENT ''
BEGIN
    IF ISNULL(@STAFFID) THEN
        SET @STAFFID = 0;
    END IF;
    INSERT INTO `changelog` (change_table, change_table_id, change_field, change_old, change_new, change_date, change_user)
        VALUES (tab, pkval, fieldn, oldv, newv, NOW(), @STAFFID);
END";
    Data::prepareAndExecute ("DROP PROCEDURE IF EXISTS `changelog_store`;");
    Data::prepareAndExecute ($logquery);
}



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Ulangi n kali tanpa menggunakan prosedur tersimpan

  2. Bagaimana cara menjalankan kueri mysql di wordpress?

  3. Bagaimana cara menggabungkan dua tabel dalam pernyataan UPDATE?

  4. Ambil data hitungan dari Firebase seperti MySQL

  5. konten file biner ditampilkan di php print_r tetapi tidak disimpan di mysql