テーブルに対する登録/更新処理のログをトリガーを使って残そうと思います。
でも「どのカラムの値を残そうかなぁ」とか考えるのが面倒なので、
完全なコピーのログをとろうと思います。
これをかんたんに実装するコードです。
//サンプルテーブル sample_user をつくる
$db->query('DROP TABLE IF EXISTS sample_user');
$db->query('
CREATE TABLE `sample_user` (
`id` int(11) unsigned NOT NULL AUTO_INCREMENT,
`name` VARCHAR(255) NOT NULL,
`email` VARCHAR(255) NOT NULL,
`created` TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
PRIMARY KEY(id)
) ENGINE=MyISAM;
');
//ログ用テーブル _sample_user を sample_user から簡単につくる
$db->query('DROP TABLE IF EXISTS _sample_user');
//こうすると primary key や unique 属性を排除してテーブル生成できる
$db->query('CREATE TABLE _sample_user as SELECT * FROM sample_user LIMIT 0');
//更新日を記録するカラムを追加する
$db->query('ALTER TABLE _sample_user ADD _created TIMESTAMP NOT NULL');
//INSERT, UPDATE時に、_sample_tableへの挿入処理を行う
$db->query("DROP TRIGGER IF EXISTS insert_sample_user");
$db->query("DROP TRIGGER IF EXISTS update_sample_user");
$query1 = "CREATE TRIGGER insert_sample_user AFTER INSERT ON sample_user ";
$query2 = "CREATE TRIGGER update_sample_user AFTER UPDATE ON sample_user ";
$query3 = "FOR EACH ROW
BEGIN
INSERT IGNORE INTO _sample_user (SELECT *, NOW() FROM sample_user WHERE id = NEW.id);
END;";
$db->query($query1 . $query3);
$db->query($query2 . $query3);
これで、insert/updateのたびに完全なコピーログを、日付つきで残していくことができます。