Archive for the 'MySQL' Kategori

MySQL ile CDC (Change Data Capture)

Amaç : Tabloda yapılan tüm değişiklikleri satır satır tutmak istiyoruz.

"firmalar" adında bir tablomuz var.

SQL:
  1. CREATE TABLE `firmalar` (
  2.   `id` int(11) NOT NULL AUTO_INCREMENT,
  3.   `ad` varchar(255) NOT NULL,
  4.   `resim_link` varchar(255) NOT NULL COMMENT 'logo',
  5.   `adres` text NOT NULL,
  6.   `tel1` varchar(30) NOT NULL,
  7.   `tel2` varchar(30) NOT NULL,
  8.   `faks1` varchar(30) NOT NULL,
  9.   `faks2` varchar(30) NOT NULL,
  10.   `web` varchar(255) NOT NULL,
  11.   `vergi_dairesi` varchar(100) NOT NULL,
  12.   `vergino` int(11) NOT NULL,
  13.   `ilgili_kisi` varchar(60) NOT NULL,
  14.   `ilgili_email` varchar(255) NOT NULL,
  15.   `durum` tinyint(4) NOT NULL,
  16.   `iuser` int(11) NOT NULL COMMENT 'insert eder user',
  17.   `idate` datetime NOT NULL COMMENT 'insert tarihi',
  18.   `uuser` int(11) NOT NULL COMMENT 'update eder user',
  19.   `udate` datetime NOT NULL COMMENT 'update tarihi',
  20.   PRIMARY KEY  (`id`)
  21. ) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8

Tablodaki ek loglama alanları. Bu alanlar ile o satırın insert ve update bilgilerini tutuyoruz. Yani o firmayı kim girdi, ne zaman girdi, kim güncelledi ne zaman güncelledi bilgilerini tutuyoruz.
iuser : insert eden user id
idate : ilk insert edilme tarihi
uuser : son update eder user id
udate : son update edilme tarihi

Peki değişen veriler/alanlar neler onları tutmak için basit çapta bir CDC yapısı oluşturmamız gerek.

Öncelikle değişimleri tutacak olan tablomuzu açalım.
Tabonun adı : arsiv_firmalar

SQL:
  1. CREATE TABLE `arsiv_firmalar` (
  2.   `id` int(11) NOT NULL AUTO_INCREMENT,
  3.   `firma_id` int(11) NOT NULL,
  4.   `ad` varchar(255) NOT NULL,
  5.   `resim_link` varchar(255) NOT NULL COMMENT 'logo',
  6.   `adres` text NOT NULL,
  7.   `tel1` varchar(30) NOT NULL,
  8.   `tel2` varchar(30) NOT NULL,
  9.   `faks1` varchar(30) NOT NULL,
  10.   `faks2` varchar(30) NOT NULL,
  11.   `web` varchar(255) NOT NULL,
  12.   `vergi_dairesi` varchar(100) NOT NULL,
  13.   `vergino` int(11) NOT NULL,
  14.   `ilgili_kisi` varchar(60) NOT NULL,
  15.   `ilgili_email` varchar(255) NOT NULL,
  16.   `durum` tinyint(4) NOT NULL,
  17.   `iuser` int(11) NOT NULL COMMENT 'insert eder user',
  18.   `idate` datetime NOT NULL COMMENT 'insert tarihi',
  19.   `uuser` int(11) NOT NULL COMMENT 'update eder user',
  20.   `udate` datetime NOT NULL COMMENT 'update tarihi',
  21.   `zaman` datetime NOT NULL COMMENT 'kayit tarihi',
  22.   PRIMARY KEY  (`id`)
  23. ) ENGINE=InnoDB DEFAULT CHARSET=utf8

id : bu alan arşiv tablosunun kendi id alanı olacak, firma id lerini firma_id alanı tutacak.
zaman : değişikliğin yapıldığı zamanı tutacak.

Yapmak istedğimiz iş;
`firmalar` tablosunda yapılan tüm değişikliklerde ilgili satırı olduğu gibi `arsiv_firmalar` tablosuna yazmak.
Bunun için MySQL de bir TRIGGER oluşturuyoruz.

cdc_firmalar_update : Trigger adı.

SQL:
  1. CREATE TRIGGER cdc_firmalar_update AFTER UPDATE ON firmalar
  2. FOR EACH ROW INSERT
  3.     INTO arsiv_firmalar SET
  4.         firma_id = NEW.id,
  5.         ad = NEW.ad,
  6.         resim_link=NEW.resim_link,
  7.         adres=NEW.adres,   
  8.         tel1=NEW.tel1,
  9.         tel2=NEW.tel2,
  10.         faks1=NEW.faks1,
  11.         faks2=NEW.faks2,
  12.         web=NEW.web,
  13.         vergi_dairesi=NEW.vergi_dairesi,
  14.         vergino = NEW.vergino,
  15.         ilgili_kisi = NEW.ilgili_kisi,
  16.         ilgili_email = NEW.ilgili_email,
  17.         durum = NEW.durum,
  18.         iuser = NEW.iuser,
  19.         idate = NEW.idate,
  20.         uuser = NEW.uuser,
  21.         udate = NEW.udate,
  22.         zaman = NOW();

Bu trigger firmalar tablosuna yapılan her update işlemindne sonra (AFTER UPDATE ON firmalar ) çalışacak ve yeni girilen verileri arsiv_firmalar tablosuna insert edecek.

Diyelim ki firma_id=50 olan kayıt için değişim tutanağını görmek istiyoruz.

SQL:
  1. SELECT * FROM arsiv_firmalar WHERE firma_id=50 ORDER BY zaman ASC;

Bu sorgu bize 50 nolu firma için yapılan tüm değişiklikleri satır satır gösterecek.

Bu yapıyı tüm talolar için kurarsanız veritabanındaki tüm değişiklikleri kayıt etmiş olursunuz.

AB
06.07.2011

PHP ile Çok Basit Bir "Ziyaretçi Defteri Örneği" yapalım.

Veritabanı tablomuz :

SQL:
  1. CREATE TABLE IF NOT EXISTS `ziyaretci` (
  2.   `id` int(11) NOT NULL AUTO_INCREMENT,
  3.   `ad` varchar(60) NOT NULL,
  4.   `soyad` varchar(60) NOT NULL,
  5.   `email` varchar(255) NOT NULL,
  6.   `yorum` text NOT NULL,
  7.   `tarih` date NOT NULL,
  8.   PRIMARY KEY (`id`)
  9. ) ENGINE=MyISAM  ;

PHP kodlarımız:

PHP:
  1. <?php
  2. # form gonderidldi mi?
  3. if(!empty($_POST)){
  4.     # evet, formu gondermiş, kayit işlemini yap
  5.  
  6.     mysql_connect("localhost","root","");
  7.     mysql_select_db("kurs");
  8.  
  9.     $ad = addslashes($_POST['ad']);
  10.     $soyad = addslashes($_POST['soyad']);
  11.     $email = addslashes($_POST['email']);
  12.     $yorum = addslashes($_POST['yorum']);
  13.  
  14.     $tarih = date("Y-m-d"); # 2010-12-31
  15.  
  16.     $SQL = "INSERT INTO ziyaretci SET ad='$ad', soyad='$soyad', email='$email', yorum='$yorum', tarih='$tarih' ";
  17.  
  18.     $sorgu = mysql_query($SQL);
  19.  
  20.     echo "<font color='blue'> Kayıt yapıldı. Teşekkür ederiz... </font>";
  21. }
  22. ?>
  23.  
  24. <FORM METHOD=POST ACTION="">
  25.  
  26. <TABLE>
  27. <TR>
  28.     <TD>Ad</TD>
  29.     <TD>:</TD>
  30.     <TD><INPUT TYPE="text" NAME="ad"></TD>
  31. </TR>
  32. <TR>
  33.     <TD>Soyad</TD>
  34.     <TD>:</TD>
  35.     <TD><INPUT TYPE="text" NAME="soyad"></TD>
  36. </TR>
  37. <TR>
  38.     <TD>Email</TD>
  39.     <TD>:</TD>
  40.     <TD><INPUT TYPE="text" NAME="email"></TD>
  41. </TR>
  42. <TR>
  43.     <TD>Yorum</TD>
  44.     <TD>:</TD>
  45.     <TD><TEXTAREA NAME="yorum" ROWS="5" COLS="45"></TEXTAREA></TD>
  46. </TR>
  47. <TR>
  48.     <TD></TD>
  49.     <TD></TD>
  50.     <TD><INPUT TYPE="submit" value="Kaydet"></TD>
  51. </TR>
  52. </TABLE>
  53.    
  54. </FORM>
  55.  
  56. <BR><BR><BR><BR>
  57.  
  58. <?php
  59.  
  60. $SQL="SELECT * FROM ziyaretci ORDER BY id DESC";
  61. $sorgu = mysql_query($SQL);
  62.  
  63. echo "<table border=1>";
  64.  
  65. $ii=0;
  66.  
  67. while( $sira=mysql_fetch_object($sorgu) ){
  68.        
  69.         $ii = $ii + 1;
  70.         if($ii % 2 == 0){
  71.             $bgcolor="#FFFF00";
  72.         }
  73.         if($ii % 2 == 1){
  74.             $bgcolor="#00FF00";
  75.         }
  76.  
  77.        
  78.        
  79.         echo "<tr bgcolor='$bgcolor'>";
  80.             echo "<td> $sira->id </td>";
  81.             echo "<td> $sira->ad </td>";
  82.             echo "<td> $sira->soyad </td>";
  83.             echo "<td> $sira->email </td>";
  84.             echo "<td> $sira->yorum </td>";
  85.             echo "<td> $sira->tarih </td>";
  86.         echo "</tr>";
  87. }   
  88. echo "</table>";
  89.  
  90. ?>

UPDATE urun SET desc_urun = TRIM(TRAILING '<LI><A href="http:' FROM desc_urun) WHERE urun_id='5656' LIMIT 1;

bu sorgu ile ürün açıklamasının sonunda yer alan hatalı html tagini siliyoruz. sadece hatalı olan ve sonda olan "<LI><A href="http:' FROM desc_urun" yi silecek.

PHP Telefon Rehberi Örneği Kodlar + Veritabanı şeklinde indirebilirsiniz.

İndir : php-telefon-rehberi.rar

update icerik_yeni SET baslik=REPLACE(baslik,'ð','ğ');
update icerik_yeni SET baslik=REPLACE(baslik,'Ý','İ');
update icerik_yeni SET baslik=REPLACE(baslik,'ý','ı');
update icerik_yeni SET baslik=REPLACE(baslik,'þ','ş');
update icerik_yeni SET baslik=REPLACE(baslik,'Þ','Ş');
update icerik_yeni SET baslik=REPLACE(baslik,'Ð','Ğ');

2009 Yerel seçimleri bize yaradı :) Güncel ilçeler veritabanı ihtiyacı olanlar bunları kullanabilir.

PHP:
  1. <?php
  2. /*
  3. DROP TABLE IF EXISTS `ilceler`;
  4. CREATE TABLE  ``ilceler` (
  5.   `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  6.   `il_id` int(10) unsigned NOT NULL DEFAULT '0',
  7.   `ilce` varchar(255) NOT NULL DEFAULT '',
  8.   PRIMARY KEY (`id`)
  9. ) ENGINE=InnoDB AUTO_INCREMENT=974 DEFAULT CHARSET=utf8;
  10. */
  11.  
  12. mysql_connect("localhost","root","");
  13. mysql_select_db("ililce");
  14.  
  15. $SQL="SET NAMES 'utf8' ";
  16.  
  17. for ($ii=1;$ii<82;$ii++) {
  18.     $f = file_get_contents("http://www.milliyet.com.tr/Secim2009/api/belediyelist.ashx?sehirid=".$ii);
  19.    
  20.     $t1 = explode(";",$f); # 197#Tatvan
  21.    
  22.     foreach ($t1 AS $key=>$val) {
  23.        
  24.         $t2 = explode("#",$val);
  25.         $ilce=$t2[1];
  26.                
  27.         $SQL="INSERT INTO ilceler SET il_id='$ii',ilce='$ilce' ";
  28.         mysql_query($SQL);
  29.         //echo $SQL;
  30.        
  31.     }   
  32. }
  33. ?>

PHP ve Smarty ikilisini kullanıyorsanız birgün mutlaka çok dilli site yapma ihtiyacınız olacaktır.
Smarty temalarınıza dil desteği eklemek için birkaç yöntem var.
Bunlardan en basiti farklı dillere farklı .tpl ler oluşturmak. Uzun vadede çok masraflı bir iş olarak görünüyor. Bu şıkkı eleyelim.

Benim istediğim yönetilebilen diller ekle, çıkart, tercüme et gibi seçenekleri olan bir panel.

Öncelikle veritabanını tasarlayalim:
3 tablomuz var; diller, diller için key tanımlamaları, keylerin tercümeleri.

(more...)

MySQL 'de yavaş çalışan sorguları izlemek istiyorsanız MySQL Slow Query Log 'u açmanız gerekecek.

my.cnf 'de [mysqld] alanına :

log-slow-queries = /var/log/mysql-slow-queries.log

satırını ekleyin.
Yavaş SQL sorgularını /var/log/mysql-slow-queries.log dosyasından takip edebilirsiniz.

SQL sorgularının arasına açıklama satırları yazabilirsiniz.
Örnek :

SQL:
  1. SELECT /* personel adları */ ad FROM personel;

SQL:
  1. SELECT /* maaş verisi */ id,maas FROM maas;

/* ... */ arasına yazdığınız herşeyi MySQL açıklama satırı olarak değerlendirir.

Windows,PHP,MySQL Geliştirme ortamınızı USB Disk ile yanınızda dolaştırın , ortamlara beraber gidin :) Nasıl mı?

Wos Portable bu işlem için cok guzel bir imkan sunuyor. Download sayfasındaki bir sihirbaz yardımı ile istedigniz php mysql apache phpmyadmin  sürümlerini seciyorsunuz ve paketi idiriyorsunuz.
İndirme işlemi tamamlandıktan sonra paketi usb diske açın ve start.exe yi caliştırın. Hepsi bu...