рдФрд░ рдХреНрдпрд╛ рд╣реЛрдЧрд╛ рдЕрдЧрд░ MySQL рдХреЗ рдкрд╛рд╕ рдЯреНрд░рд┐рдЧрд░ рдмрдирд╛рдиреЗ рдЬреИрд╕рд╛ рдПрдХ рдмрдбрд╝рд╛ рдЕрд╡рд╕рд░ рд╣реИ рдЬреЛ рд░рд┐рдХреЙрд░реНрдбреНрд╕ рдХреЛ рдбрд╛рд▓рдиреЗ, рдмрджрд▓рдиреЗ рдФрд░ рд╣рдЯрд╛рдиреЗ рдХреЗ рджреМрд░рд╛рди рдкреБрд░рд╛рдиреЗ рдФрд░ рдирдП рдбреЗрдЯрд╛ рдорд╛рдиреЛрдВ рдХреЛ рд░рд┐рдХреЙрд░реНрдб рдХрд░ рд╕рдХрддрд╛ рд╣реИ, рдЬреЛ рдХрд┐ php рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдореЗрдВ рдЬрд╛рдирдХрд╛рд░реА рдЬреЛрдбрд╝рддреЗ рд╣реИрдВ?
MySQL рдЯреНрд░рд┐рдЧрд░ рдкрддрд╛ рд╣реИ:
* рдЬрд┐рд╕ рдХреНрд╖рдг рдкрд░рд┐рд╡рд░реНрддрди рд╣реЛрддрд╛ рд╣реИ
* рдкреБрд░рд╛рдиреЗ рдФрд░ рдирдП рдЕрд░реНрде
PHP рдЬрд╛рдирддрд╛ рд╣реИ:
* рдЬреЛ рд╡рд░реНрддрдорд╛рди рдореЗрдВ рд▓реЙрдЧ рдЗрди рд╣реИ
* рдХреМрди рд╕рд╛ рдкреЗрдЬ рдЦреБрд▓рд╛ рд╣реИ, рдХреМрди рд╕рд╛ рдЧрдпрд╛
* рдмреНрд░реЗрд╡рд░
* рдЖрдИрдкреА рдкрддреЗ
* рдкреЛрд╕реНрдЯ, рдЬреА.рдИ.рдЯреА.
* рдХреБрдХреА
рд╕рднреА рдЖрд╡рд╢реНрдпрдХ рдЬрд╛рдирдХрд╛рд░реА рдХреЛ рд░рд┐рдХреЙрд░реНрдб рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдмрдВрдзрди рдХреЛрдИ рдХреИрд╕реЗ рдХрд░ рд╕рдХрддрд╛ рд╣реИ?
PHP рдФрд░ MySQL рдХреА рд╕реБрд╡рд┐рдзрд╛рдУрдВ рдХрд╛ рд▓рд╛рдн рдЙрдард╛рдПрдВ!
MySQL рдЕрд╕реНрдерд╛рдпреА рдЯреЗрдмрд▓ рдмрдирд╛ рд╕рдХрддрд╛ рд╣реИ рдЬреЛ рдХреЗрд╡рд▓ рдбреЗрдЯрд╛рдмреЗрд╕ рдХреЗ рдХрдиреЗрдХреНрд╢рди рдмрдВрдж рд╣реЛрдиреЗ рддрдХ рд░рд╣рддреЗ рд╣реИрдВ, рдФрд░ PHP, рдмрд╕ рдкреНрд░рддреНрдпреЗрдХ рдкреГрд╖реНрда рдХреЗ рдЙрджреНрдШрд╛рдЯрди рдкрд░, рдПрдХ рдирдпрд╛ рдХрдиреЗрдХреНрд╢рди рдмрдирд╛рддрд╛ рд╣реИ (рд╡реЗрдм тАЛтАЛрд╕рд░реНрд╡рд░ рдФрд░ php рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдХреЗ рд╡рд┐рд╢рд╛рд▓ рдмрд╣реБрдордд рдореЗрдВ)ред
рдЗрд╕ рдкреНрд░рдХрд╛рд░, рдпрджрд┐ рдЯреНрд░рд┐рдЧрд░ рдЕрд╕реНрдерд╛рдпреА рддрд╛рд▓рд┐рдХрд╛ рдХреЛ рднреА рд▓рд┐рдЦрддрд╛ рд╣реИ, рддреЛ рд╣рдо рдпрд╣ рдкрддрд╛ рд▓рдЧрд╛ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдкрд░рд┐рд╡рд░реНрддрдиреЛрдВ рдХреЗ рд▓рд┐рдП рдХреМрди рдпрд╛ рдХреНрдпрд╛ рдЬрд┐рдореНрдореЗрджрд╛рд░ рд╣реИред
рдереЛрдбрд╝рд╛ рдФрд░ рд╡рд┐рд╕реНрддрд╛рд░ рд╕реЗ - рд╣рдо рдкреГрд╖реНрда рдХреА рд╢реБрд░реБрдЖрдд рдореЗрдВ рдПрдХ рдЕрд╕реНрдерд╛рдпреА рддрд╛рд▓рд┐рдХрд╛ рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВ, рдпрджрд┐ рдЯреНрд░рд┐рдЧрд░ рдЖрдЧ рд▓рдЧрд╛рддрд╛ рд╣реИ, рддреЛ рдпрд╣ рдЯреНрд░реИрдХрд┐рдВрдЧ рдбреЗрдЯрд╛ рдХреЗ рд▓рд┐рдП рдЕрднрд┐рдкреНрд░реЗрдд рддрд╛рд▓рд┐рдХрд╛ рдХреЗ рд▓рд┐рдП рдЬрд╛рдирдХрд╛рд░реА рд▓рд┐рдЦрддрд╛ рд╣реИ, рдФрд░ рдЕрд╕реНрдерд╛рдпреА рддрд╛рд▓рд┐рдХрд╛ рдореЗрдВ last_insert_id () рджреНрд╡рд╛рд░рд╛ рд▓реМрдЯрд╛рдП рдЧрдП рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛ рд▓рд┐рдЦрддрд╛ рд╣реИред рдХрд╛рдо рдХреЗ рдЕрдВрдд рдореЗрдВ, рд╣рдо рдЕрд╕реНрдерд╛рдпреА рддрд╛рд▓рд┐рдХрд╛ рдХреА рдУрд░ рдореБрдбрд╝рддреЗ рд╣реИрдВ, рдФрд░ рдпрджрд┐ рдпрд╣ рдЦрд╛рд▓реА рдирд╣реАрдВ рд╣реИ, рддреЛ рд╣рдо рдкрд░рд┐рд╡рд░реНрддрди рддрд╛рд▓рд┐рдХрд╛ рдореЗрдВ рд╡рд╣ рд╕рдм рд░рд┐рдХреЙрд░реНрдб рдХрд░рддреЗ рд╣реИрдВ рдЬреЛ рд╣рдо рд▓реЛрдб рдХрд┐рдП рдЧрдП PHP рдкреГрд╖реНрда рд╕реЗ рдЬрд╛рдирддреЗ рд╣реИрдВред
рдЕрдЧрд▓рд╛ рдПрдХ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╡рд┐рдХрд▓реНрдк рд╣реИред1) рдЪрд▓реЛ рдЕрд╕реНрдерд╛рдпреА рддрд╛рд▓рд┐рдХрд╛ рдХреЗ рд╕рд╛рде рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВ - рд╣рдо рдЗрд╕реЗ рдкрд╣рд▓реА рдмрд╛рд░ рдкреГрд╖реНрда рдкрд░ рдЯреНрд░рд┐рдЧрд░ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рд╣реЛрдиреЗ рдкрд░ рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВ! рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдмрд╕ рд░рдЪрдирд╛рддреНрдордХ рд╕реВрдЪреА рд▓рд┐рдЦреЗрдВ temp_watch_changes IF EXISTS рдирд╣реАрдВред рдХреЗрд╡рд▓ рдПрдХ рдЫреЛрдЯреА рд╕реА рд╕рдорд╕реНрдпрд╛ рд╣реИ - MySQL рдХреЗ рд╡рд░реНрддрдорд╛рди рд╕рдВрд╕реНрдХрд░рдгреЛрдВ рдореЗрдВ рдпрд╣ рдкрддрд╛ рд▓рдЧрд╛рдирд╛ рдЕрд╕рдВрднрд╡ рд╣реИ рдХрд┐ рдХреНрдпрд╛ рдХреЛрдИ рдЕрд╕реНрдерд╛рдпреА рдХреНрд╡реЗрд░реА рдХрд┐рд╕реА рдХреНрд╡реЗрд░реА рджреНрд╡рд╛рд░рд╛ рдореМрдЬреВрдж рд╣реИред рдЗрд╕рд▓рд┐рдП, рдЗрд╕реЗ рдмрдирд╛рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП рддрд╛рдХрд┐ рдЬрдм рд╣рдо php рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдорд╛рдиреЛрдВ рдХрд╛ рдЪрдпрди рдХрд░реЗрдВ рддреЛ рдХреЛрдИ рддреНрд░реБрдЯрд┐ рди рд╣реЛред
рд╣рдо рдиреМрдЯрдВрдХреА рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рд╣рдо рд╕рдм рдХреБрдЫ рд╕реАрдзреЗ-рд╕рд╛рджреЗ рддрд░реАрдХреЗ рд╕реЗ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
рдПрдХ рдЫреЛрдЯреА рд╕реА рдЪрд╛рд▓ рдХреЗ рд░реВрдк рдореЗрдВ - MySQL рдореЗрдВ, рдПрдХ рд╣реА рдирд╛рдо рд╡рд╛рд▓реА рдПрдХ рдирд┐рдпрдорд┐рдд рдФрд░ рдЕрд╕реНрдерд╛рдпреА рддрд╛рд▓рд┐рдХрд╛ рдПрдХ рд╣реА рд╕рдордп рдореЗрдВ рдореМрдЬреВрдж рд╣реЛ рд╕рдХрддреА рд╣реИред рдпрджрд┐ рдХреЛрдИ рдЕрд╕реНрдерд╛рдпреА рд╣реИ, рддреЛ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рдФрд░ рд╣рд░ рдмрд╛рд░ php рд╕реЗ, рдпрд╣ рдЬрд╛рдБрдЪрдирд╛ рдХрд┐ рдХреНрдпрд╛ temp_watch_changes рддрд╛рд▓рд┐рдХрд╛ рдХреЗ рдЕрдВрджрд░ рд░рд┐рдХреЙрд░реНрдб рд╣реИрдВ рдпрд╛ рддреЛ рдЦрд╛рд▓реА рд╣реЛрдВрдЧреЗ, рдпрд╛ рдЯреНрд░рд┐рдЧрд░ рджреНрд╡рд╛рд░рд╛ рджрд░реНрдЬ рдХрд┐рдП рдЧрдП рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛ рдФрд░ рдХреЛрдИ рддреНрд░реБрдЯрд┐ рдирд╣реАрдВ рд╣реЛрдЧреАред
рдПрдХ рдЕрдзрд┐рдХ рд╕рд░рд▓ рддрд░реАрдХрд╛ рдпрд╣ рд╣реИ рдХрд┐ рд╣рд░ рдмрд╛рд░ рдкреГрд╖реНрда рд▓реЛрдб рд╣реЛрдиреЗ рдкрд░ рдПрдХ рдЕрд╕реНрдерд╛рдпреА рддрд╛рд▓рд┐рдХрд╛ рдмрдирд╛рдИ рдЬрд╛рдПред рд╣рдорд╛рд░реЗ рд╕рд░реНрд╡рд░ рдкрд░, рдпрд╣ 0.0008 рд╕реЗрдХрдВрдб рд▓реЗрддрд╛ рд╣реИ, рдЬреЛ рд╕рд┐рджреНрдзрд╛рдВрдд рд░реВрдк рдореЗрдВ рд╕реНрд╡реАрдХрд╛рд░реНрдп рд╣реИ :)
CREATE TEMPORARY TABLE temp_watch_changes ( id_change INTEGER NOT NULL )
2) рдПрдХ рддрд╛рд▓рд┐рдХрд╛ рдмрдирд╛рдПрдВ рдЬрд┐рд╕рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрди рд╕реНрд╡рдпрдВ рд╣реЛрдВ
CREATE TABLE `watch_changes` ( `id` int(11) NOT NULL AUTO_INCREMENT, `table_name` varchar(255) DEFAULT NULL, `column_name` varchar(255) DEFAULT '', `key_name` varchar(255) DEFAULT NULL, `key_value` varchar(1000) DEFAULT NULL, `old_value` text, `new_value` text, `type` enum('insert','update','delete') DEFAULT 'update', `date` timestamp NULL DEFAULT CURRENT_TIMESTAMP, `ip` varchar(255) DEFAULT NULL, `id_user` int(11) DEFAULT '0', `user_email` varchar(255) DEFAULT '', `post` text, `get` text, `session` text, `server` text, `user_agent` varchar(1000) DEFAULT '', `url` text, `referer` text, PRIMARY KEY (`id`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8;
3) рдПрдХ рдЯреНрд░рд┐рдЧрд░ рдмрдирд╛рдПрдБред рдпрд╣ рдкрддрд╛ рд▓рдЧрд╛рдиреЗ рдореЗрдВ рд╕рдлрд▓ рдирд╣реАрдВ рд╣реБрдЖ рдХрд┐ рдХреНрдпрд╛
рдЯреНрд░рд┐рдЧрд░ рдирд╛рдореЛрдВ рдореЗрдВ рд╕реНрддрдВрдн рдирд╛рдореЛрдВ рдХрд╛ рдЧрддрд┐рд╢реАрд▓ рд░реВрдк рд╕реЗ
рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╕рдВрднрд╡
рд╣реИ ред рд╢рд╛рдпрдж, рдпрд╣ рд╕рдВрднрд╡ рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рд╣рдореЗрдВ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЗрд╕рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред рдЖрдЦрд┐рд░рдХрд╛рд░, PHP рд╣реИред
function createWatchTrigger($table,$columns,$primaryKey){ if(!is_array($primaryKey)){ $primaryKey=array($primaryKey); } $types=array('update','insert','delete'); foreach($types as $type){ db::$used->internalQuery("drop trigger IF EXISTS {$table}_t_$type"); $triggerContent="CREATE TRIGGER {$table}_t_$type AFTER $type ON {$table} FOR EACH ROW BEGIN CREATE TEMPORARY TABLE IF NOT EXISTS temp_watch_changes ( id_change INTEGER NOT NULL ); "; foreach($columns as $columnTitle){ if($type=='update'){ $triggerContent.=" IF NEW.{$columnTitle} != OLD.$columnTitle THEN "; } $triggerContent.="INSERT INTO watch_changes (table_name,column_name,old_value,new_value,type,key_name,key_value) "; if($type=='insert'){ $triggerContent.="VALUES('{$table}','$columnTitle','', NEW.$columnTitle,'$type','".implode(',',$primaryKey)."',CONCAT('',NEW.".implode(",',',NEW.",$primaryKey)."));"; }else if($type=='update'){ $triggerContent.="VALUES('{$table}','$columnTitle',OLD.$columnTitle, NEW.$columnTitle,'$type','".implode(',',$primaryKey)."',CONCAT('',NEW.".implode(",',',NEW.",$primaryKey)."));"; }else if($type=='delete'){ $triggerContent.="VALUES('{$table}','$columnTitle',OLD.$columnTitle,'','$type','".implode(',',$primaryKey)."',CONCAT('',OLD.".implode(",',',OLD.",$primaryKey)."));"; } $triggerContent.=" set @last_id=last_insert_id(); INSERT INTO temp_watch_changes (id_change) values (@last_id);"; if($type=='update'){ $triggerContent.="END IF;"; } } $triggerContent.="\nEND;"; db::$used->internalQuery($triggerContent); } }
рдкрдардиреАрдпрддрд╛ рдХреА рджреГрд╖реНрдЯрд┐ рд╕реЗ рд╕реГрдЬрди рд╕рдорд╛рд░реЛрд╣ рд╣реА рдмреЗрд╣рддрд░ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред рд╡рд╣ 3 рдЯреНрд░рд┐рдЧрд░ рдмрдирд╛рддрд╛ рд╣реИ - рдЕрдкрдбреЗрдЯ рдкрд░, рд╕рдореНрдорд┐рд▓рд┐рдд рдХрд░реЗрдВ, рд╣рдЯрд╛рдПрдВред рдпрд╣ рддрд╛рд▓рд┐рдХрд╛ рдХрд╛ рдирд╛рдо рд▓реЗрддрд╛ рд╣реИ, рдЬрд┐рд╕рдХреЗ рд▓рд┐рдП рдХреЙрд▓рдо рдФрд░ рдЬрд┐рд╕рдХреЗ рджреНрд╡рд╛рд░рд╛ рдЖрдк рдпрд╣ рд░рд┐рдХреЙрд░реНрдб рдкрд╛ рд╕рдХрддреЗ рд╣реИрдВ (рд╢рд╛рдпрдж рдХрдИ рдХреБрдВрдЬреА)ред
рдЗрд╕реЗ рдЗрд╕ рддрд░рд╣ рдХрд╣рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ:
createWatchTrigger('employees',array('salary','job_title'),'id');
4) рдЕрдм рд╣рдо рдЗрд╕реЗ рдмрдирд╛рдПрдВрдЧреЗ рддрд╛рдХрд┐ PHP рдкреЗрдЬ рдХреЗ рд╕рдорд╛рдкреНрдд рд╣реЛрдиреЗ рдХреЗ рдмрд╛рдж рдЕрд╕реНрдерд╛рдпреА рдЯреЗрдмрд▓ рд╕реЗ рдбреЗрдЯрд╛ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХреЗред
рд╣рдо
register_shutdown_function рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗ, рдЬреЛ рдЖрдкрдХреЛ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЗ рдкреВрд░рд╛ рд╣реЛрдиреЗ рдкрд░ рдХрд┐рд╕реА рднреА рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред рдХрд┐рд╕реА рднреА рдкрд░рд┐рдпреЛрдЬрдирд╛ рдкрд░, рдПрдХ рдлрд╝рд╛рдЗрд▓ рд╣реЛрддреА рд╣реИ рдЬреЛ рд╣рдореЗрд╢рд╛ рд╢рд╛рдорд┐рд▓ рд╣реЛрддреА рд╣реИ - рд╣рдо рдЗрд╕реЗ рд╡рд╣рд╛рдВ рд░рдЦреЗрдВрдЧреЗред
function shutdown(){ $affectedRows=db::$used->fetchRows("select * from temp_watch_changes"); if($affectedRows){ if(User::isLogged()){ $userId=User::getCurrent()->getId(); $email=User::getCurrent()->getEmail(); }else{ $userId=0; $email=''; } $updateData=array( 'ip'=>$_SERVER['REMOTE_ADDR'], 'id_user'=>$userId, 'user_email'=>$email, 'post'=>serialize($_POST), 'get'=>serialize($_GET), 'session'=>serialize($_SESSION), 'server'=>serialize($_SERVER), 'user_agent'=>$_SERVER['HTTP_USER_AGENT'], 'url'=>serialize($_SERVER['REQUEST_URI']), 'referer'=>$_SERVER['HTTP_REFERER'] ); foreach($affectedRows as $row){ db::$used->update('watch_changes',$updateData,array('id'=>$row['id_change'])); } } } register_shutdown_function('shutdown');
рд╡рд╣ рд╕рдм рд╣реИред