9. SGBD'in kullanımı MySQL
![]() |
9.1. MySQLdb modülünün kurulumu
MySQL veritabanını kullanan komut dosyaları yazacağız:
![]() |
MySQL veritabanını yönetmeye yarayan Python işlevleri, Python'un ilk dağıtımında bulunmayan MySQLdb modülünde toplanmıştır. Bu nedenle modülü indirip kurmanız gerekir. İşte bunu yapmanın bir yolu:
![]() |
- Programlar menüsünden [1] Python paket yöneticisini seçin. Ardından [2] komut penceresi açılacaktır.
Paketler arasında mysql anahtar kelimesini arayın:
C:\Documents and Settings\st>pypm search mysql
Get: [pypm-be.activestate.com] :repository-index:
Get: [pypm-free.activestate.com] :repository-index:
autosync: synced 2 repositories
chartio Setup wizard and connection client for connecting
chartio-setup Setup wizard and connection client for connecting
cns.recipe.zmysqlda Recipe for installing ZMySQLDA
collective.recipe.zmysqlda Recipe for installing ZMySQLDA
django-mysql-manager DESCRIPTION_DESCRIPTION_DESCRIPTION
jaraco.mysql MySQLDB-compatible MySQL wrapper by Jason R. Coomb
lovely.testlayers mysql, postgres nginx, memcached cassandra test la
mtstat-mysql MySQL Plugins for mtstat
mysql-autodoc Generate HTML documentation from a mysql database
mysql-python Python interface to MySQL
mysqldbda MySQL Database adapter
products.zmysqlda MySQL Zope2 adapter.
pymysql Pure Python MySQL Driver
pymysql-sa PyMySQL dialect for SQLAlchemy.
pymysql3 Pure Python MySQL Driver
sa-mysql-dt Alternative implementation of DateTime column for
schemaobject Iterate over a MySQL database schema as a Python o
schemasync A MySQL Schema Synchronization Utility
simplestore A datastore layer built on top of MySQL in Python.
sqlbean A auto maping ORM for MYSQL and can bind with memc
sqlwitch sqlwitch offers idiomatic SQL generation on top of
tiddlywebplugins.mysql MySQL-based store for tiddlyweb
tiddlywebplugins.mysql2 MySQL-based store for tiddlyweb
zest.recipe.mysql A Buildout recipe to setup a MySQL database.
Adında veya açıklamasında mysql anahtar kelimesi bulunan tüm modüller listelenmiştir. İlgilendiğimiz modül, 14. satırdaki [mysql-python]'tir. Bunu kuruyoruz:
C:\Documents and Settings\st>pypm install mysql-python
The following packages will be installed into "%APPDATA%\Python" (2.7):
mysql-python-1.2.3
Hit: [pypm-free.activestate.com] mysql-python 1.2.3
Installing mysql-python-1.2.3
C:\Documents and Settings\st>echo %APPDATA%
C:\Documents and Settings\st\Application Data
-
- satır: mysql-python-1.2.3 paketi, 8. satırda belirtilen "%APPDATA%\Python" klasörüne kuruldu.
Aşağıdaki durumlarda bu işlem başarısız olabilir:
- kullanılan Python yorumlayıcısı 64 bit sürüm ise;
- %APPDATA% yolu aksanlı karakterler içeriyorsa.
9.2. MySQL'in kurulumu
SGBD ve MySQL'i kurmanın çeşitli yolları vardır. Burada, birkaç yazılımı bir araya getiren WampServer paketini kullandık:
- bir Apache web sunucusu. Bunu Python ile web komut dosyaları yazmak için kullanacağız;
- SGBD ve MySQL;
- PHP betik dili;
- SGBD MySQL'te PHP ile yazılmış bir yönetim aracı: phpMyAdmin.
WampServer, Haziran 2011 itibarıyla şu adresten indirilebilir:
![]() |
- [1] dosyasını indirirken, uygun olan WampServer sürümünü indirin;
- [2]'te, kurulum tamamlandıktan sonra programı çalıştırın. Bu işlem, Apache web sunucusunu ve SGBD ile MySQL'i başlatacaktır;
- [3]'te, başlatıldıktan sonra, WampServer, görev çubuğunun sağ alt köşesindeki [3] simgesinden yönetilebilir;
- [4]'te, MySQL yönetim aracı başlatılır.
[dbpersonnes] veritabanı oluşturulur:

[admpersonnes] adlı bir kullanıcı, [nobody] şifresiyle oluşturulur:
![]() | ![]() |
![]() |
- [1], kullanıcı adı;
- [2] olarak, SGBD makinesinde kendisine verilen haklar;
- [3]'te, şifresi [nobody];
- [4] olarak, aynı şekilde;
- [5]'te, bu kullanıcıya hiçbir hak verilmez;
- [6]'te, kullanıcı oluşturulur.
![]() |
- [7]'te, phpMyAdmin'in ana sayfasına geri dönülür;
- [8]'te, bu sayfadaki [Privileges] bağlantısını kullanarak [admpersonnes] ve [9] kullanıcılarının ayarlarını düzenlemeye gidilir.
![]() |
- [10]'te, [admpersonnes] kullanıcısına [dbpersonnes] veritabanı üzerinde haklar vermek istediğimiz belirtilir;
- [11]'te seçim onaylanır.
![]() |
- [12] [Tout cocher] bağlantısı ile, [admpersonnes] kullanıcısına [dbpersonnes] ve [13] veritabanları üzerinde tüm haklar verilir;
- [14]'te onaylanır.
Artık elimizde şunlar var:
- MySQL ve [dbpersonnes] veritabanları;
- bu veritabanı üzerinde tüm haklara sahip bir kullanıcı: [admpersonnes / nobody].
Veritabanını kullanmak için Python komut dosyaları yazacağız.
9.3. MySQL veritabanına bağlanma - 1
# MySQLdb modülünü içe aktarıyoruz
import sys
sys.path.append("D:\Programs\ActivePython\site-packages")
import MySQLdb
# bir veritabanına bağlanma MySQL
....
Notlar:
- 2-4. satırlar: SGBD ve MySQL ile işlemler içeren komut dosyaları, MySQLdb modülünü içe aktarmalıdır. Bu modülü [%APPDATA%\Python] klasörüne kurduğumuzu hatırlayalım. Bir Python kodu bir modül talep ettiğinde, [%APPDATA%\Python] klasörü otomatik olarak taranır. Aslında, sys.path içinde bildirilen tüm klasörler taranır. İşte bu klasörleri görüntüleyen bir örnek:
# -*- coding=utf-8 -*-
import sys
# klasörlerin görüntülenmesi sys.path
for dossier in sys.path:
print dossier
Ekran çıktısı şu şekildedir:
- satırda, [site-packages] klasörü görülmektedir; MySQLdb başlangıçta buraya kurulmuştu. pypm yardımcı programının Python modüllerini yüklediği dizin olan [site-packages] dizinini taşıyoruz. Python'un modülleri aramak için tarayacağı yeni bir dizin eklemek için, bunu sys.path listesine ekliyoruz:
# modülün içe aktarılması MySQLdb
import sys
sys.path.append("D:\Programs\ActivePython\site-packages")
import MySQLdb
# MySQL veritabanına bağlanma
....
- satıra, MySQLdb modülünün taşındığı klasörü ekleyin.
Örneğin tam kodu şöyledir:
# MySQLdb modülünün içe aktarılması
import sys
sys.path.append("D:\Programs\ActivePython\site-packages")
import MySQLdb
# bir veritabanına bağlanma MySQL
# kullanıcı kimliği (admpersonnes,nobody)
user="admpersonnes"
pwd="nobody"
host="localhost"
connexion=None
try:
print "connexion..."
# oturum açma
connexion=MySQLdb.connect(host=host,user=user,passwd=pwd)
# izleme
print "Connexion a MySQL reussie sous l'identite host={0},user={1},passwd={2}".format(host,user,pwd)
except MySQLdb.OperationalError,message:
print "Erreur : {0}".format(message)
finally:
try:
connexion.close()
except:
pass
- 8-11. satırlar: komut dosyası (15. satırda), [admpersonnes / nobody] kullanıcısını [localhost] makinesindeki SGBD ve MySQL'e bağlayacaktır. Kullanıcı belirli bir veritabanına bağlanmaz;
- 12-24. satırlar: Bağlantı başarısız olabilir. Bu nedenle, bağlantı işlemi bir try / except / finally bloğu içinde gerçekleştirilir;
-
- satır: MySQLdb modülünün connect yöntemi, farklı adlandırılmış parametreleri kabul eder:
- user: [admpersonnes] bağlantısının sahibi olan kullanıcı;
- pwd: [nobody] kullanıcısının şifresi;
- host: MySQL ve [localhost] veritabanı yönetim sisteminin bulunduğu makine;
- db: Bağlanılacak veritabanı. İsteğe bağlı.
-
- satır: Bir istisna atılırsa, bu istisna [ MySQLdb.OperationalError] türündedir ve ilgili hata mesajı [message] değişkeninde bulunur;
- 20-23. satırlar: [finally] cümlesinde bağlantı kapatılır. Bir istisna oluşursa, bu istisna yakalanır (23. satır) ancak herhangi bir işlem yapılmaz (24. satır).
connexion...
Connexion a MySQL reussie sous l'identite host=localhost,user=admpersonnes,passwd=nobody
9.4. MySQL veritabanına bağlanma - 2
# MySQLdb modülünün içe aktarılması
import sys
sys.path.append("D:\Programs\ActivePython\site-packages")
import MySQLdb
# ---------------------------------------------------------------------------------
def testeConnexion(hote,login,pwd):
# sunucu hote'deki mysql veritabanı sistemine (login, pwd) bağlanıp sonra bağlantıyı keser
# MySQLdb.operationalError istisnasını tetikler
# bağlantı
connexion=MySQLdb.connect(host=hote,user=login,passwd=pwd)
print "Connexion a MySQL reussie sous l'identite (%s,%s,%s)" % (hote,login,passwd)
# bağlantı kapatılıyor
connexion.close()
print "Fermeture connexion MySQL reussie\n"
# ---------------------------------------------- ana program
# veritabanına bağlantı MySQL
# kullanıcı kimliği
user="admpersonnes"
passwd="nobody"
host="localhost"
# bağlantı testi
try:
testeConnexion(host,user,passwd)
except MySQLdb.OperationalError,message:
print message
# var olmayan bir kullanıcıyla
try:
testeConnexion(host,"xx","xx")
except MySQLdb.OperationalError,message:
print message
Notlar:
- 7-15. satırlar: Bir kullanıcıyı SGBD MySQL'e bağlamaya ve ardından bağlantıyı kesmeye çalışan bir işlev. Sonucu görüntüler;
- 18-34. satırlar: ana program – testeConnexion yöntemini iki kez çağırır ve olası istisnaları görüntüler.
9.5. MySQL tablosunun oluşturulması
Artık bir SGBD MySQL ile bağlantı kurmayı öğrendiğimize göre, bu bağlantı üzerinden SQL komutları vermeye başlayacağız. Bunun için, oluşturulan [dbpersonnes] veritabanına bağlanacağız ve bu bağlantıyı kullanarak veritabanında bir tablo oluşturacağız.
# MySQLdb modülünün içe aktarılması
import sys
sys.path.append("D:\Programs\ActivePython\site-packages")
import MySQLdb
# ---------------------------------------------------------------------------------
def executeSQL(connexion,update):
# bağlantı üzerinde güncelleme isteği yürütülüyor
# bir imleç isteniyor
curseur=connexion.cursor()
# bağlantı üzerinde SQL sorgusu yürütülüyor
try:
curseur.execute(update)
connexion.commit()
except Exception, erreur:
connexion.rollback()
raise
finally:
curseur.close()
# ---------------------------------------------- ana işlev
# MySQL veritabanına bağlanıyor
# kullanıcı kimliği
ID="admpersonnes"
PWD="nobody"
# veritabanı yönetim sisteminin ana bilgisayarı
HOTE="localhost"
# veritabanı kimliği
BASE="dbpersonnes"
# bağlantı
try:
connexion=MySQLdb.connect(host=HOTE,user=ID,passwd=PWD,db=BASE)
except MySQLdb.OperationalError,message:
print message
sys.exit()
# "kişiler" tablosu varsa silinir
# Varsa bir hata oluşacaktır
# bu durum göz ardı edilir
requete="drop table personnes"
try:
executeSQL(connexion,requete)
except:
pass
# "kişiler" tablosunun oluşturulması
requete="create table personnes (prenom varchar(30) NOT NULL, nom varchar(30) NOT NULL, age integer NOT NULL, primary key(nom,prenom))"
try:
executeSQL(connexion,requete)
except MySQLdb.OperationalError,message:
print message
sys.exit()
# oturum kapatılır ve programdan çıkılır
try:
connexion.close()
except MySQLdb.OperationalError,message:
print message
sys.exit()
Notlar:
-
- satır: executeSQL işlevi, açık bir bağlantı üzerinde SQL sorgusunu yürütür;
-
- satır: Bağlantı üzerindeki SQL işlemleri, imleç adı verilen özel bir nesne aracılığıyla gerçekleştirilir;
-
- satır: bir imleç alınır;
-
- satır: SQL sorgusunun yürütülmesi;
- satır 14: mevcut işlem onaylanır;
- satır 15: istisna durumunda, hata mesajı "hata" değişkeninde depolanır;
- satır 16: mevcut işlem geçersiz kılınır;
- satır 17: istisna yeniden tetiklenir;
- satır 19: hata olsun ya da olmasın, imleç kapatılır. Bu, imleçle ilişkili kaynakları serbest bırakır.
create table personnes (prenom varchar(30) NOT NULL, nom varchar(30) NOT NULL, age integer NOT NULL, primary key(nom,prenom)) : requete reussie
phpMyAdmin ile doğrulama:
![]() |
- [dbpersonnes] [1] veritabanında, [personnes] [2] adlı bir tablo bulunur; bu tablonun yapısı [3] ve birincil anahtarı [4]'e sahiptir.
9.6. [personnes] tablosunun doldurulması
Daha önce [personnes] tablosunu oluşturduktan sonra, şimdi bu tabloyu dolduruyoruz.
# MySQLdb modülünün içe aktarılması
import sys
sys.path.append("D:\Programs\ActivePython\site-packages")
import MySQLdb
# diğer modüller
import re
# ---------------------------------------------------------------------------------
def executerCommandes(HOTE,ID,PWD,BASE,SQL,suivi=False,arret=True):
# bağlantıyı kullan (HOTE,ID,PWD,BASE)
# bu bağlantı üzerinden SQL metin dosyasında bulunan SQL komutlarını yürütür
# bu dosya, her satırda bir tane olmak üzere çalıştırılacak SQL komut dosyasıdır
# eğer takip=True ise, her bir SQL komutunun yürütülmesi, komutun başarılı olup olmadığını belirten bir mesajın görüntülenmesiyle sonuçlanır
# durdurma=True ise, işlev karşılaşılan ilk hatada durur; aksi takdirde tüm SQL komutlarını yürütür
# fonksiyon bir liste döndürür (hata sayısı, hata1, hata2, ...)
# SQL dosyasının varlığı kontrol edilir
data=None
try:
data=open(SQL,"r")
except:
return [1,"Le fichier %s n'existe pas" % (SQL)]
# bağlantı
try:
connexion=MySQLdb.connect(host=HOTE,user=ID,passwd=PWD,db=BASE)
except MySQLdb.OperationalError,erreur:
return [1,"Erreur lors de la connexion a MySQL sous l'identite (%s,%s,%s,%s) : %s" % (HOTE, ID, PWD, BASE, erreur)]
# bir imleç talep edilir
curseur=connexion.cursor()
# SQL dosyasında bulunan SQL sorgularının yürütülmesi
# bunlar bir tabloya ekleniyor
requetes=data.readlines()
# tek tek çalıştırılıyor - başlangıçta hata yok
erreurs=[0]
for i in range(len(requetes)):
# geçerli sorguyu saklıyoruz
requete=requetes[i]
# Sorgu boş mu? Eğer öyleyse, bir sonraki sorguya geçilir
if re.match(r"^\s*$",requete):
continue
# i sorgusunu çalıştırıyoruz
erreur=""
try:
curseur.execute(requete)
except Exception, erreur:
pass
#Bir hata oluştu mu?
if erreur:
# bir hata daha
erreurs[0]+=1
# hata mesajı
msg="%s : Erreur (%s)" % (requete,erreur)
erreurs.append(msg)
# ekran izleme var mı, yok mu?
if suivi:
print msg
# durulacak mı?
if arret:
return erreurs
else:
if suivi:
print "%s : Execution reussie" % (requete)
# bağlantıyı kapatma ve kaynakları serbest bırakma
curseur.close()
connexion.commit()
# bağlantı kesiliyor
try:
connexion.close()
except MySQLdb.OperationalError,erreur:
# bir hata daha
erreurs[0]+=1
# hata mesajı
msg="%s : Erreur (%s)" % (requete,erreur)
erreurs.append(msg)
# geri dönüş
return erreurs
# ---------------------------------------------- ana
# veritabanına bağlanma MySQL
# kullanıcı kimliği
ID="admpersonnes"
PWD="nobody"
# veritabanı yönetim sisteminin ana bilgisayarı
HOTE="localhost"
# veritabanı kimliği
BASE="dbpersonnes"
# çalıştırılacak SQL komut metin dosyasının kimliği
TEXTE="sql.txt";
# tablonun oluşturulması ve doldurulması
erreurs=executerCommandes(HOTE,ID,PWD,BASE,TEXTE,True,False)
# hata sayısının görüntülenmesi
print "il y a eu %s erreur(s)" % (erreurs[0])
for i in range(1,len(erreurs)):
print erreurs[i]
sql.txt dosyası:
- satıra kasıtlı olarak bir hata eklenmiştir.
Ekran sonuçları:
drop table personnes : Execution reussie
create table personnes (prenom varchar(30) not null, nom varchar(30) not null, age integer not null, primary key (nom,prenom)) : Execution reussie
insert into personnes values('Paul','Langevin',48) : Execution reussie
insert into personnes values ('Sylvie','Lefur',70) : Execution reussie
xx : Erreur ((1064, "You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'xx' at
line 1"))
insert into personnes values ('Pierre','Nicazou',35) : Execution reussie
insert into personnes values ('Geraldine','Colou',26) : Execution reussie
insert into personnes values ('Paulette','Girond',56) : Execution reussie
il y a eu 1 erreur(s)
xx : Erreur ((1064, "You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'xx' at line 1"))
phpMyAdmin ile doğrulama:

- [1]'te, [Afficher] bağlantısı, [personnes] ve [2] tablolarının içeriğine erişim sağlar.
9.7. Herhangi bir SQL sorgusunun çalıştırılması
Aşağıdaki komut dosyası, bir SQL komut dosyasını çalıştırmaya ve her bir komutun sonucunu görüntülemeye olanak tanır:
- komut SELECT ise, SELECT komutunun sonucu;
- komut INSERT, UPDATE veya DELETE ise değiştirilen satır sayısı.
# MySQLdb modülünün içe aktarılması
import sys
sys.path.append("D:\Programs\ActivePython\site-packages")
import MySQLdb
# diğer modüller
import re
def cutNewLineChar(ligne):
# varsa [ligne]'teki satır sonu işaretini siler
l=len(ligne)
while(ligne[l-1]=="\n" or ligne[l-1]=="\r"):
l-=1
return(ligne[0:l])
# ---------------------------------------------------------------------------------
def afficherInfos(curseur):
# bir SQL sorgusunun sonucunu görüntüler
# Bu bir SELECT sorgusu muydu?
if curseur.description:
# bir açıklama var - dolayısıyla bu bir SELECT sorgusudur
# description[i], SELECT sorgusundaki i numaralı sütunun açıklamasıdır
# descriptionQZXW2HTMLBW2ldZQXQZXW2HTMLBWzBdZQX, select'in i numaralı sütununun adıdır
# alan adları görüntülenir
titre=""
for i in range(len(curseur.description)):
titre+=curseur.description[i][0]+","
# alan listesi son virgül olmadan görüntülenir
print titre[0:len(titre)-1]
# ayırıcı satır
print "-"*(len(titre)-1)
# seçim tablosunun geçerli satırı
ligne=curseur.fetchone()
while ligne:
print ligne
# seçim listesinin bir sonraki satırı
ligne=curseur.fetchone()
else:
# alan yok - bu bir seçim listesi değildi
print "%s lignes(s) a (ont) ete modifiee(s)" % (curseur.rowcount)
# ---------------------------------------------------------------------------------
def executerCommandes(HOTE,ID,PWD,BASE,SQL,suivi=False,arret=True):
# bağlantıyı kullan (HOTE,ID,PWD,BASE)
#, bu bağlantı üzerinden SQL metin dosyasında bulunan SQL komutlarını yürütür
# bu dosya, her satırda bir tane olmak üzere çalıştırılacak SQL komut dosyasıdır
# takip=1 ise, her bir SQL komutunun yürütülmesi sonrasında, komutun başarılı olup olmadığına dair bir mesaj görüntülenir
# durdurma=1 ise, işlev karşılaşılan ilk hatada durur; aksi takdirde tüm SQL komutlarını yürütür
# fonksiyon bir dizi döndürür (hata sayısı, hata1, hata2, ...)
# SQL dosyasının varlığı kontrol edilir
data=None
try:
data=open(SQL,"r")
except:
return [1,"Le fichier %s n'existe pas" % (SQL)]
# bağlantı
try:
connexion=MySQLdb.connect(host=HOTE,user=ID,passwd=PWD,db=BASE)
except MySQLdb.OperationalError,erreur:
return [1,"Erreur lors de la connexion a MySQL sous l'identite (%s,%s,%s,%s) : %s" % (HOTE, ID, PWD, BASE, erreur)]
# bir imleç talep edilir
curseur=connexion.cursor()
# SQL dosyasında bulunan SQL sorgularının yürütülmesi
# bunlar bir tabloya ekleniyor
requetes=data.readlines()
# tek tek çalıştırılıyor - başlangıçta hata yok
erreurs=[0]
for i in range(len(requetes)):
# geçerli sorguyu saklıyoruz
requete=requetes[i]
# Sorgu boş mu? Eğer öyleyse, bir sonraki sorguya geçilir
if re.match(r"^\s*$",requete):
continue
# i sorgusunu çalıştırıyoruz
erreur=""
try:
curseur.execute(requete)
except Exception, erreur:
pass
#Bir hata oluştu mu?
if erreur:
# bir hata daha
erreurs[0]+=1
# hata mesajı
msg="%s : Erreur (%s)" % (requete,erreur)
erreurs.append(msg)
# ekran izleme var mı, yok mu?
if suivi:
print msg
# durulacak mı?
if arret:
return erreurs
else:
if suivi:
print "%s : Execution reussie" % (requete)
# yürütülen isteğin sonucu hakkında bilgiler
afficherInfos(curseur)
# bağlantının kapatılması ve kaynakların serbest bırakılması
curseur.close()
connexion.commit()
# bağlantı kesiliyor
try:
connexion.close()
except MySQLdb.OperationalError,erreur:
# bir hata daha
erreurs[0]+=1
# hata mesajı
msg="%s : Erreur (%s)" % (requete,erreur)
erreurs.append(msg)
# geri dönüş
return erreurs
# ---------------------------------------------- ana
# veritabanına bağlanılıyor MySQL
# kullanıcı kimliği
ID="admpersonnes"
PWD="nobody"
# veritabanı yönetim sisteminin ana bilgisayarı
HOTE="localhost"
# veritabanı kimliği
BASE="dbpersonnes"
# çalıştırılacak SQL komut metin dosyasının kimliği
TEXTE="sql2.txt"
# tablonun oluşturulması ve doldurulması
erreurs=executerCommandes(HOTE,ID,PWD,BASE,TEXTE,True,False)
# hata sayısının görüntülenmesi
print "il y a eu %s erreur(s)" % (erreurs[0])
for i in range(1,len(erreurs)):
print erreurs[i]
Notlar:
- yeni değişiklik, komut dosyasının 100. satırında yer almaktadır: SQL komutunun yürütülmesinden sonra, bu sorgu tarafından kullanılan imleçle ilgili bilgiler istenir. Bu bilgiler, 16-40. satırlardaki afficheInfos işlevi tarafından sağlanır;
-
- ve 39. satırlar: eğer yürütülen SQL sorgusu bir SELECT olsaydı, [curseur.description] özniteliği, i numaralı elemanı SELECT sonucundaki i numaralı alanı tanımlayan bir dizidir. Aksi takdirde, [curseur.rowcount] özniteliği (satır 39), INSERT, UPDATE veya DELETE sorguları tarafından değiştirilen satır sayısını gösterir;
-
- ve 36. satırlar: [curseur.fetchone] yöntemi, SELECT'ten geçerli satırı almayı sağlar. Bunları tek seferde alabilen [curseur.fetchall] yöntemi de mevcuttur.
Çalıştırılan isteklerin dosyası:
Ekran sonuçları:
PhpMyadmin kontrolü:
![]() |











