Üye Kayıt Üye Giriş

MYSQL Komutları-6


MYSQL Komutları-6

MySQL'DE KULLANICILAR ve YETKİLENDİRME

MySQL'de tüm kullanıcılar ve yetkileri, "mysql" isimli bir veritabanında tutulur.
* Bir kullanıcı iki parçadan oluşur : kullanici_ismi@bilgisayar_ismi (hostname). Bu ikiliyi MySQL tek bir kullanıcı olarak algılar. Yani ahmet@localhost ile ahmet@penguen aynı kullanıcılar değildir (localhost ve penguen aynı makinalar olsa dahi).
* Bir kullanıcının 4 yetki seviyesi vardır. Her yetki seviyesi için mysql isimli veritabanında birer tablo bulunur.
* Hiyerarşik olarak bu tablolar en genelden özele doğru tanımlama yapar.
* User tablosu : Bağlanan kullanıcının sunucuya bağlanma hakkı olup olmadığını kontrol eder. Eğer erişim hakkı varsa, kullanıcı tabloda kendisi için belirtilen yetkilere sahip olur.
* Db tablosu : Hangi kullanıcıların hangi veritabanlarına hangi bilgisayarlardan ulaşabileceğini belirler. Eğer kullanıcının ilgili veritabanına erişim hakkı varsa, tabloda kendisi için belirtilen yetkilere sahip olur.
* Tables_priv tablosu : Aynı db tablosu gibi çalışır, ancak veritabanları yerine içindeki tablolara erişimi düzenler.
* Columns_priv tablosu : Aynı db ve tables_priv tabloları gibi çalışır, ancak veritabanlarının içindeki tabloların içindeki kolonlara erişimi düzenler.

MySQL'in Yedeklenmesi

* Sunucu seviyesinde yedekleme
Veri dizininin (ör: /usr/local/mysql/var) topluca yedeklenmesi. Bu dizin MySQL veritabanları, kullanıcıları ve log dosyalarını içerir.
- mysqlhotcopy
* SQL seviyesinde yedekleme
Veritabanlarının SQL komutlarından oluşan bir metin dosyası olarak yedeğinin alınması (sqldump)
- mysqldump
- mysqlimport
* BACKUP TABLE / RESTORE TABLE
 

NEXT_DAY

NEXT_DAY(tarih,gün) : Verilen tarihten bir sonraki haftanın istenilen gününün tarihini döndürür. Girilen gün bir numara yada günün adı olabilir. 'FRIDAV' ve 6 aynı günü ifade eder. Günler pazar gününden itibaren sayılmaya başlanır. Omeğin pazartesi günü için 2 girilmelidir.

 

NOT IN alandaki belirlenmiş değerlere eşit olmayanları getirmek

SELECT * FROM `ogrenciler` WHERE adi NOT IN ('ahmet','mehmet')
 

NOT işleci

NOT BETWEEN Verilen değerler arasında olamyan değerler
NOT IN (Iiste) Listedeki değerler içerisinde olmayan
NOT LlKE Benzer olmayan
IS NOT NULL Boş olmayan

ORDER BY ifadesi

Seçilen kolonların hangi sırada geleceğini belirlemek amacıyla kullanılır.
SELECT ENAME,JOB FROM EMP ORDER BY ENAME;
Ornekte çalışanlar isimlerilerine göre sıralı olarak getirilmektedir.
ORDER BY ENAME ~ : Küçükten büyüğe sıralar
ORDER BY ENAME ~ : Büyükten küçüğe sıralar
Birden fazla kolon sıralanmak istendiğinde kolon isimleri virgül ile ayrılarak yazılır. (ODER BY DEPTNO.SAL DESC gibi). Sıralama sırasında NULL değerleri sıralama nasıl olursa olsun ilk sırada yer alırlar.
 

phpMyAdmin

* phpMyAdmin, özellikle MySQL'in web-veritabanı çözümlerde kullanımında her geçen gün defacto standart haline gelen yönetim arayüzüdür.
* Web üzerinden çalıştığı için bir ek istemci programa ihtiyaç duymaksızın, herhangi bir bilgisayardan uzaktaki MySQL sunucuyu yönetilebilir.
* "Root" olarak tüm bir MySQL sunucusunu yönetebileceğiniz gibi sadece belirli bir veritabanını da yönetebilirsiniz. phpMyAdmin hangi kullanıcı ismi ile veritabanına bağlanırsa, onun haklarına sahip olur.
* Birden fazla MySQL sunucusunu da, her birinin kendi ayarlarıyla tek bir phpMyAdmin ile yönetebilirsiniz.
* Türkçe de dahil olmak üzere 45+ dilde kullanılabilir.
* Her türlü kayıt ekleme, silme, değiştirme; veritabanı/tablo yaratma; kullanıcı açma/yetkilendirme; kısacası aklınıza gelen her şeyi phpMyAdmin ile SQL komutlarına ihtiyaç duymaksızın yapabilirsiniz.
* Veritabanının içeriğini SQL komutlarından oluşan bir dosyaya boşaltabilir, daha sonra o dosyadan veritabanını istediğiniz başka herhangi bir sunucuda oluşturabilirsiniz.
* Bu hazır tanımlanmış işlemlerin dışında her tür SQL komutunu kendiniz yazarak çalıştırabilir, phpMyAdmin'i tam bir SQL istemcisi gibi kullanabilirsiniz.
 

RAND rastgele kayıttan başlayarak istenilen miktar kadar kayıt getirmek

SELECT * FROM `ogrenciler` ORDER BY RAND() limit 10
 

Rastgele veri çekmek

SELECT * FROM `cities` ORDER BY rand() LIMIT 0,1

 

Replikasyon

# ek yönlü replikasyon, hem sistemin sağlamlığını hem de hızını arttırmak için kullanılabilir.
# Sağlamlık için, iki sisteminiz olabilir ve ana sunucuda problem çıktığında yedek olana geçebilirsiniz.
# Hız için ise, güncelleme içermeyen sorguları yedek sunucuya yönlendirebilirsiniz.
# Veritaban(lar)ının birkaç farklı fiziksel mekanda bulunması gerekiyorsa, replikasyon ile verilerin sürekli güncel olması sağlanabilir.
# Replikasyon sırasında dikkat edilmesi gereken en önemli nokta, tüm güncelleme işlemlerinin ana sunucuda yapılmasıdır. Aksi takdirde dikkatli olunmadığında veri kaybına yol açılabilir

ROUND


ROUND(kolonlsabit,n) : Verilen değeri virgülden sonra n basamağını dikkate
alarak yuvarlar. Eğer n değeri negatif girilirse virgülün soluna kalan n adet rakam yuvarlanır.

ROUND(45.923,1) --> 45,9
ROUND(45.923) --> 46
ROUND(45.923,1) --> 45,3
ROUND(42.323,-1) --> 40
 

ROUND(TARİH)

ROUND(tarih) : Girilen tarihin saat kısmını yuvarlar. Bu genelde saat bilgisi içeren tarihlerin Karşılaştırılmasında faydalı olur.
 

ROUND(tarih,'MONTH')

ROUND(tarih,'MONTH') : Girilen tarihi ay bilgisine kadar yuvarlar. Ayın 15'şinden önceki günler ayın ilk gününün tarihini, sonraki günler için sonraki ayın ilk gününün tarihini getirir.

 

ROUND(tarih,'YEAR')

ROUND(tarih,'VEAR') : Girilen tarihi yıl bazında yuvarlar. Girilen tarih yılın ilk yarısını gösteriyor ise o yılın ilk gününün tarihi geri dönderilir, değilse bir sonraki yılın ilk gününün tarihi döndürülür.

 

RPAD

RPAD(kolonlsabit,n,'karakter dizisi') : Parametre olarak verilen kolon ya da sabitin
sonuna n adet istenilen karakter dizisinden basar. Eğer karakter dizisi verilmez ise boşluk ekler.

SELECT LPAD(DNAME,20,'*'),LPAD(DNAME, 15) FROM DEPT;
RPAD(DNAME,20,'*') RPAD(DNAME,15)
ACCOUNTING********** ACCOUNTING
RESEARCH************ RESEARCH
SALES****************** SALES
OPERATIONS********** OPERATIONS

RTRIM

RTRIM(kolonlsabit,'karakter dizisi') : L TRIM ile aynı işlemi yapar; tek farkı islenilen
karakteri (ya da karakterler) dizinin sonundan siler.

Sorgu Cache'i (Query Cache)

MySQL, bir kullanıcı tarafından yapılan bir SELECT sorgusunun metnini ve sorgunun sonucunu cache'ler. Aynı sorgu tekrar yapıldığında ise veritabanında tarama yapmak yerine cache'deki veriyi kullanıcıya gönderir.
* Cache, bayat veri göndermez. Bir tablo güncellendiğinde, o tabloda yapılmış olan tüm sorgular cache'ten silinir.
* Verilerin çok fazla okunduğu ancak nadiren güncellendiği uygulamalarda büyük kazanç sağlar.

 

Sorguda birden fazla koşul kullanma AND (ve) ve OR (ya da) işleçleri

Koşul ifadelerini birleştirmek amacıyla kullanılır. AND işleci arasında bulunduğu her iki koşul ifadesinin de doğru olmak
zorunda olduğunu, OR işleci arasında bulunduğu her iki koşul ifadesinden sadece birisinin doğru olmasının
yeterli olduğunu ifade etmek için kullanılır.

Aynı SQL cümlesinde hem AND hem de OR işleçleri koşullar arasında istenilen kombinasyonda kullanılabilir.
AND işleci her zaman OR işlecine göre daha önceliklidir ve daha önce işletilir. OR işlecini AND işlecine göre
öncelikli hale getirebilmek için parantezlerden "()" faydalanılır.
SELECT EMPNO,ENAME,JOB,SAL
FROM EMP
WHERE SAL BETWEEN 1 000 AND 2000
AND JOB='CLERK'.

SQL left join

SELECT t1.id,t1.name1 FROM `t1`,t2 WHERE t1.id=t2.id

t1 ve t2 tablosundaki id alanları eşitse t1 alanlarını getirir

 

Tablo oluşturulurken kullanılan bazı alan türleri

 

Int: Sayısal veri tipidir. Negatif ve pozitif değerler alabilir.
Char(değer): değer büyüklüğünde string ifade saklanabilecek tiptir.
Varchar(değer): değer büyüklüğünde string ifade saklanabilecek tiptir. Değişken boyutta olabilir.
Date: Tarih bilgisini tutan tiptir.
Time: Zaman bilgisini tutan tiptir.
DateTime: Tarih ve zaman bilgisini bir arada tutan tiptir.
Timestamp: O anki tarih ve saat bilgisini tutan tiptir.
Enum(değer1,değer2,..,değerN): Metin olarak aynı anda doğru olamayacak bilgileri depolar.
Set(değer1,değer2,..,değerN): Enum tipine benzer, ancak birden çok değeri aynı anda alabilir.

Tarih fonksiyonları

Dateadd (tarihparcasi , sayi , tarih) bir tarihe gun, ay, yil vs ekleyerek tarih bulma
Datediff (tarihparcasi , tarih1, tarih2) Iki tarih arasindaki farki bulma
Datename(tarihparcasi, tarih) month secildiginde aylarin isimleri ile gorulebilmesini saglar, digerlerinde degerini getirir
Datepart(tarihparcasi, tarih) Verilen tarihteki secilen alanin degerini verir
Getdate() O andaki gecerli tarih ve saati verir
 

TO_CHAR

TO_CHAR(sayıltarih,['format]) : Verilen rakam ya da tarihi istenilen formatta karaktere dönüştürür.

 

to_char

Tarih verilerini biçimlendirir.

to_char(sysdate,'DD-MONTH-YYYY DAY') bugün
bugün 18 Ekim 2008 Cuma

TO_DATE

TO_DATE('karakter' ,'format') : Formatı belirli karakter halindeki bir tarihi tarih türüne dönüştürür.

Tarih Formatlan (TO_DATE ile kullanılabilen)
ELEMAN Anlamı
yyyy Dört Basamaklı Yıl
yyy Yılın son üç basamağı
yy Yılın son iki basamağı
Y Yılın son basamağı
RR Farklı Dil İçin yılın son iki basamağı
Q Ocak-Mart i
MM İki basamaklı ay
RM Romen rakamı ile ay
MONTH Ayın uzun ismi
MON Ayın kısa ismi
ww Yılın hangi haftası olduğu(1-53)
w Ayın hangi haftası olduğu(1-5)
DDD Yılın günü (1-366)
DD Ayın günü (1-31)
D Haftanın günü(1-7)
DAY Günün uzun adı (Pazartesi)
DY Günün kısa adı (Pzt)
HH veya Günün saati (1-12)
HH12 Günün saati (1-12)
HH24 Günün Saati (0-23)
MI Dakika(0-59)
SS Saniye(0-59)
SSSSS Gec nraki sagece yarısından sonra saniye sayısı
Ornek : TO-DATE('27-0CT -95','DD-MON-RR')

Sayı Formatlan
ELEMAN ÖRNEK Anlamı
9 9999 Yazılacak sayının uzunluğunu belirler
0 0999 Eğer sayı küçükse boşluk yerine sıfır basar
$ $999 Rakam başına dolar işareti ekler
B B99999 Sıfır olan sayıları basmaz
S S9999 Poz. sayıların başına + neg. ise - işareti ekler.
PR 99999PR Negatif ise <...> şeklinde yazar
D 99D99 Ondalıklı sayıları bu şekilde ayırır
G 9G999 Grup ayrıcını G harfinin olduğu yere basar
C 99999C Rakamın yanına parabirimi kısaltmasını yazar
L 9999L Ülke için kullanılan parabirimi kısaltmasını yazar.
, 9,999 istenilen pozisyona virgül basılır
. 999.99 ondalıklı kısımlar nokta ile ayrılır
V 999V99 Gelen sayıyı 10'un n'inci kuvveti ile çarpar. n V harfinden sonraki 9'Iarın sayısıdır.
EEEE 9.999EEEE 8ilimsel olarak yazar
RN yada rn RN rn Girilen sayıyı büyük yada küçük romen rakamları ile 1 ile 3999 arası için yazar.

TO_NUMBER

TO_NUMBER('karakterler') : Karakter türünde verilmiş olan rakamları sayısal türe dönüştürür.

TRANSLATE

TRANSLATE(kolonlsabit1eski,yeni) : Verilen karakter dizisi içerisinde 'eski'
parametresi olarak girilecek karakterleri bularak 'yeni' olarak girilecek olan karakterler ile yer değiştirir.

TRUNC

TRUNC(kolonlsabit,n) : Virgülden sonraki n basamak sıfırlanır. Eğer n değeri
negatif girilirse virgülün solunda kalan n adet rakam sıfırlanır.
 

TRUNC(tarih,'MONTH') TRUNC(tarih,'YEAR')

TRUNC(tarih,'MONTH') : Verilen tarihin ayının ilk gününün tarihini bulur.
TRUNC(tarih,'VEAR') : Verilen tarihin yılının ilk gününün tarihini bulur.
 

Tüm Metinde Arama (Full-text Search)

* Tabloda indeks olarak ayarlandığı kolon(lar)da doğal dil araması yapar. Tıpkı bir arama motoru gibi ilgili metinleri kelimelere ayırarak indeks oluşturur. Arama yapılan metinler ne kadar büyük olursa, o kadar verimli çalışır.
* Tüm metinde arama özelliği sadece MyISAM tablo tipinde kullanılabilir. Standart bir indeks gibi, tablo yaratılırken ya da daha sonra oluşturulabilir.
* FULLTEXT indeksleri; CHAR, VARCHAR ya da TEXT/BLOB veri tipleri için kullanılabilir.
* Tüm metinde arama MATCH() fonksiyonu ile gerçekleştirilir.
* FULLTEXT indeks, alanın tamamına uygulanmak zorundadır. Sadece belirli bir kısmına yapılamaz.

 

Tüm Tabloları optimize etmek

dbConnect()

$alltables = mysql_query("SHOW TABLES");

while ($table = mysql_fetch_assoc($alltables))
{

foreach ($table as $db => $tablename)
{
mysql_query("OPTIMIZE TABLE '".$tablename."'")
or die(mysql_error());
}

}
 

UNION iki tablodaki aynı isimli alanları birleştirmek

SELECT name,age FROM football
UNION
SELECT name,age FROM baseball

 

Update Deyimi

Bir alanı güncellemek için kullanılır.

Kullanım şekli:

Update [Tablo Adı] Set alan=yeni deger Where aranan alan= alan değeri

Örnekler:

Update isim set ad='murat' where soy='yüce';

Soyadı yüce olan kayıtların adını murat yapar.


Update isim set posta='a@b.net' where ad='murat' or soy='yüce';

Ad değeri murat veya soy değeri yüce olan kayıtların posta alanını a@b.net olarak günceller.
 

UPPER

Parametre olarak alınan karakterleri büyük harfe dönüştürür.
İfadenin büyük harf veya küçük harf olması sonucu değiştirmez, her durumda byük harfe çevirir.

 

Veri Nitelikleri

1. KARAKTER NİTELİKLER
CHAR


Belirli sayıdaki karakteri saklamak için kullanılır.
Şayet saklanan değer tanımlanan genişlikten kısa ise, karakter kümesinin sağ tarafına tanımlı genişliğe gelene kadar MySQL tarafından boşluk karakteri eklenir.
Örneğin, CHAR(5) tanımlamasını, bu alanda daima 5 karakter uzunluğundaki değerleri saklamak istediğimizde kullanırız. Şayet bu alana "ABC" karakter kümesi eklenecek olursa veritabanında saklanma şekli "ABC "dir.
VARCHAR

Değişken sayıdaki karakterleri saklamak için kullanılır.
Nitelik tanımlamasında girilen değer saklanacak en büyük karakter uzunluğudur.
MySQL 4.1 belirtimlerine göre bir VARCHAR alan en çok 255 karakter (1 byte=28) saklayabilir, ancak MySQL 5'ten sonra 255 ya da 65535 (2 byte) karakter saklayabilirsiniz.
Şayet tanımlanandan (n olsun) daha uzun bir karakter kümesi girme girişiminde bulunursanız ilk n karakteri veritabanına kaydedilecek geri kalan karakterleri kaybetmiş olacaksınızdır.
2. SAYISAL NİTELİKLER

TINYINT

Belirli genişlikte ikili saklar, her zaman 1 byte'dır.
Yukarıdaki ifadenin pratikteki anlamı tinyint alanda en fazla 255 (28-1) sayının saklanabileceğidir.
Şayet sütunu SIGNED olarak tanımlamışsanız, saklanabilecek en büyük pozitif sayı 127, en küçük negatif sayı da -127 olur; 0(sıfır)'ı da sayarsanız 255 sayı tanımlamış oluruz.
Öte yandan değerlerinizin işaretinin aynı olacağını biliyorsanız, sütunu UNSIGNED yaparak; en büyük pozitif sayı limitini 255'e taşıyabilirsiniz.
SMALLINT

Belirli genişlikte ikili saklar, her zaman 2 byte'dır.
SIGNED özelliği ile saklanabilecek en büyük pozitif sayı , en küçük negatif sayı da -32767.
UNSIGNED olarak en büyük (28*28)-1 = (32767*2)-1 = 65'535 olur.
MEDIUMINT

Belirli genişlikte ikili saklar, her zaman 3 byte'dır.
SIGNED özelliği ile saklanabilecek en büyük pozitif sayı 9'199'871, en küçük negatif sayı da -9'199'871.
UNSIGNED olarak en büyük (28*28*28)-1 = 18'399'743 olur.
INT

Belirli genişlikte ikili saklar, her zaman 4 byte'dır.
SIGNED özelliği ile saklanabilecek en büyük pozitif sayı 2'147'483'647, en küçük negatif sayı da -2'147'483'647.
UNSIGNED olarak en büyük (28*28*28*28)-1 = 4'294'967'295 olur.
BIGINT

Belirli genişlikte ikili saklar, her zaman 8 byte'dır.
Yine benzer şekilde, UNSIGNED olarak (28*28*28*28*28*28*28*28)-1 = 18'446'744'073'709'551'616 sayısı saklanabilir; şayet SIGNED olarak kullanacaksanız da bunun yarısı kadar bir değer tutabilirsiniz.
2. ZAMANSAL NİTELİKLER

DATE

Veritabanında saklanma şekli 3 byte'dır.
Tarih saklamak için kullanılır.
En az etkili (significant) basamak en önce saklanır; yani varsayılan depolama biçimi 'yyyy-aa-gg' dir (y: yıl, a: ay, g:gün)
DATETIME

Veritabanında saklanma şekli 8 byte'dır.
Tarih ve zamanı saklamak için kullanılır.
Varsayılan depolama biçimi 'yyyy-aa-gg SS:dd:ss' dir. (y: yıl, a: ay, g:gün, S: saat, d: dakika, s: saniye)
TIME

Veritabanında saklanma şekli 3 byte'dır.
Zamanı saklamak için kullanılır.
Varsayılan depolama biçimi 'SS:dd:ss' dir. (y: yıl, a: ay, g:gün, S: saat, d: dakika, s: saniye)
TIMESTAMP

Varsayılan depolama şekli 4 byte'dır. Bir UNIX fonksiyonu olan time() fonksiyonu ile aynı işi yapar.
Epoch ismi verilen (00:00:00 UTC, Ocak 1, 1970) tarihinden o ana kadarki zaman uzaklığı saklayabilen bir alandır.
YEAR

UNSIGNED TINYINT gibi saklanır.
Farkı ise YEAR alanının 1901 ötelenmiştir. (YEAR) 0 = 1901 olarak düşünülebilir.
Bazı İpuçları

Veritabanı alanlarınızın niteliklerini tanımlarken, gereksinimlerinizi mutlaka belirleyiniz. Örneğin üye sıra no tutacak bir alan tanımlarken yaklaşık ne kadar üyeniz olacağını düşününüz; 100 kişi civarında bir üye potansiyeli öngörüyorsanız bunun için BIGINT tanımlamayınız, bu ciddi performans israfıdır.
Veritabanında saklayacağınız verileri mutlaka veri tipine uygun tanımlanmış alanlarda saklayınız. Sadece rakamlardan oluşacak bir alanı ya da tarih tipinde bir veriyi asla ve asla VARCHAR tipinde saklamayınız; bu veritabanının sizin veritipine özel sunduğu bir çok güzel özellikten (Sıralama seçeneği esneklikleri gibi) feragat etmektir.
Veritabanında bir işlemin yapılma zamanını girecekseniz,yani o anki zamana ihtiyacınız varsa bunun için PHP kodunuz içinde date() fonksiyonu ile o anki zamanı oluşturup girmenize gerek yoktur, zaten MySQL'de NOW() diye bir fonksiyon vardır, çoğu kişinin farkında olmadığı.
Ve son olarak -kendimi yineliyor gibi olacağım ama- veritabanı tasarımı gerçekten önemli bir iştir, bir uygulama yazmadan veritabanı tasarımına yeterli zamanı ayırınız.

 

Veri tabanından sistem tarihini de okumak

Veri tabanından sistem tarihini de okumak aşağıdaki SQL sorgusu ile mümkündür.

SELECT SYSDATE FROM SYSTEM.DUAL;

Bu sorgu DUAL isimli sahte bir tablo kullanarak o andaki sistem tarihini okumamızı sağlamaktadır.

Tarih üzerinde aritmetik işlemler
tarih+sayı : Tarihe istenilen gün sayısı eklenir.
tarih-sayı : Tarihten istenilen gün sayısı çıkartılır.
tarih1-tarih2 : Iki tarih arasındaki gün sayısını bulunur
tarih+sayıl24 : Istenilen saat sayısını tarihe eklenir.

 

Veritabaninda Resim veya Normal Dosyalari Saklamak

İşlem basamaklarını yazarsak kısaca :

1- Resmi veritabanina kaydetme (resimekle.php)

2- Resmi secme (resimgoster.php)

3- Resmi ekranda gösterme (resimgetir.php)

1- Öncelikle resmi veritabanindan okuma islemleri için kisa bir seyler yazayim,
resimlerimizi asagida belirtilmis vt içinde saklayacacagimiz, verilmis vt
yapisina bakarsak çogu sey tanidik, belki longblob için biraz bilgi edinmek
lazim, blob(binary-large-object) çesitli bilgi çesitlerini tutabilen bir
tiptir. Deger olarak maximum 4294967295 (2^32 - 1) karakterdir. Blob'da da
Varchar'da oldugu gibi bir degisken kendisine atanan kisimda, girilen bilgi
kadar yer tutar. Yani 10 karakterlik bir tanimlama yapilip eger 4
karakterlik bir bilgi girilirse toplam alan 5 olacak(1 byte string ifade
uzunlugunu tutar). Blob'ta da benzer bir mantik vardir. Evet bu kadar bilgi
yeter.

"turkphp_veritabani" veritabani içindeki "resim" isimli tablonun yapisi :

id int,auto_increment,primary
aciklama varchar (50)
dosyaadi varchar(50)
boyut varchar(50)
resimdata longblob
dosyatip varchar(10)

Tablo icin SQL semasi :

CREATE TABLE resim (
id MEDIUMINT(5) DEFAULT '0' NOT NULL AUTO_INCREMENT,
aciklama VARCHAR(50),
dosyaadi VARCHAR(50),
boyut MEDIUMINT(8),
resimdata LONGBLOB,
dosyatip VARCHAR(10),
PRIMARY KEY (id)
);

Ilk önce yapacagimiz dosyalari makineden vt'ye aktarmak ,asagidaki form
yardimi ile yerel makineden seçilen bir dosyayi bir açiklama ile beraber
vt'ye kaydediyoruz. Kaydetme islemi ardindan her bir dosya için
mysql_insert_id komutu ile otomatik bir id numarasi saglaniyor resimlere.(Bu
komut, AUTO_INCREMENT kolon için sorgu sonrasi bir ID üretir.)

Burada birde form içindeki birkaç olaydan kisaca söz etmek
isterim,biliniyordur ama ben yinede söyleyeyim ki yazacak bir seyler olsun :
)
Form içinde gelen bilginin tür olarak(enctype) multipart/form-data seçilmis,
ve gizli parametre olarak dosya boyutu 2400000 byte olarak belirtilmis, daha
yukarisi dosyalar için ben bölümlemenizi tavsiye ederim, dosya çekme islemi
içinde tip olarak file seçildi. Böylece dosyayi "gözat "
butonu ile seçip form_data degiskenine aktarmis oluyoruz.

Resimekle.php

if ($submit)
{
mysql_connect("localhost","turk_user","******");
mysql_select_db("turkphp_veritabani");
$data = addslashes(fread(fopen($form_data, "rb"),filesize($form_data)));
$sonuc=mysql_query("INSERT INTO resim
(id,aciklama,dosyaadi,boyut,resimdata,dosyatip) ".
"VALUES
('null','$form_aciklama','$form_data_name','$form_data_size','$data','$form_data_type')");
$id= mysql_insert_id(); //otomatik ID verildi.
print "

Database ID No: $id";
mysql_close();
echo "
n";
echo "Yuklediginiz resme bakabilir veya bilgisayariniza indirebilirsiniz...";
echo "
n";
echo "Anasayfaya donebilirsiniz....";
}
else"Ana Sayfa";
{
print
?>
 

enctype="multipart/form-data">
Saklanacak dosya için açýklama:




Database gonderilecek dosyayi secin: name="form_data" size="40">



NOT : Bu demoda maximum dosya boyutu "10000" byte olarak ayarlanmistir...


 


}
?>
2- Simdide ekledigimiz resmi gösterelim. Vt içindeki tüm resimleri göstermek
veya belli bir resmi seçmek için çesitli yöntemler kullanabiliriz.Bir form
yardimi ile dosyaadi veya id degiskenlerini kullanabiliriz. Basitçe id si
veya dosyaadi girilen degisken vt'den sorgu ile çagrilip. Bir nesne olarak
fetch ediliyor,burada istenirse degerler array olarak da çekilebilir, bir
fark yok sanirim ama sadece kullanim farki var. (Array kullanimi : echo
$sira["dosyaadi"] , nesne kullanimi: echo $sira->dosyaadi (pointer gibi))
Burada resimleri localhost/resimgoster.php?id=2 seklinde id parametresini
göndererek resmi çagiriyoruz, eger kisi herhangi bir id yazmamissa tüm
resimleri gösteriyor.

Formu hazirlayalim...iste hazir asagida : )

resimgoster.php
$i=0;
mysql_connect("localhost","turk_user","******") or die("server baglantisi
olmadi");
@mysql_select_db("turkphp_veritabani") or die("Veritabaný seçilemedi");
//eðer id kýsmýnda bir deðer yoksa tüm resimleri göster
if ($id==0 || $id==" ")
{
$sonuc=mysql_query("SELECT * FROM resim");
while($sira=mysql_fetch_object($sonuc))
{
$i++;
// burada resimgetir dosyasýna id ile resim ekrana çýkartýlýyor,dosyaadi ve
// açýklama ile beraber.
echo "";
echo "tt";
echo "Dosya adi : " . $sira->dosyaadi . "";
echo "tt";
echo "Dosya açiklamasi: ". $sira->aciklama . "";
echo "
n";
}
echo "Toplam dosya sayisi:$i";
echo "
";
exit();
}
//eger id kisminda bir deger varsa sadece olani göster
$sonuc=mysql_query("SELECT * FROM resim where id='$id' ") or die("Sorgu
calismadi");
if ($sonuc==NULL)
{
echo "Böyle bir resim yok..";
exit();
}
$sira=mysql_fetch_object($sonuc);
echo "";
?>
3- Bunlarýn ardindan gelelim en önemli kisma :) (finali en son yapalim
dedim). Burada hazirlayacagimiz dosya ile resimgoster'den gelen id'yi (tabi
bir id gelmiþse) kullanarak vt'den uygun olan resmi, eger id gelmemisse tüm
resimleri gösterecek. Burada önemli nokta gösterilecek veri bir resim oldugu
için content-type için image/gif veya iamge/pjpeg seçilecek (ama herhangi
bir tanesi hepsi için çalisiyor :) )
resimgetir.php
Header("Content-type: Image/gif");// veya image/pjpeg
mysql_connect("localhost","turk_user","*******") or die("server baglantisi
olmadi");
@mysql_select_db("turkphp_veritabani") or die("Veritabani Secilemedi");
$sonuc=mysql_query("SELECT * FROM resim WHERE id='$id' ") or die("Sorgu
çalistirilamadi");
$sira=mysql_fetch_object($sonuc);
echo $sira->resimdata;
?>
Bu olayi daha gelistirebiliriz. Örnegin resimleri bir combobox içine alip
oradanda seçildigi anda (onchange olayi) resmi göstermek gibi.Örnegin;
 

 

Veritabanından kayıt silmek
 

//database'den silme

$baglanti= mysql_connect("localhost","root","pass") or die ("Database baglanilamadi");

mysql_select_db("kullanicilar",$baglanti)
or die ("Database secilemedi!");

$sorgu = mysql_query("DELETE FROM users
WHERE username = '$username'");

$sonuc=mysql_query($sorgu, $baglanti);

echo "$username kullanicisi silindi...";
 

 

Bilgisayar Dershanesi Ders Sahibi;
Bilgisayar Dershanesi

Yorumlar

Yorum Yapabilmek İçin Üye Girişi Yapmanız Gerekmektedir.

ETİKETLER