- Konu sahibi
- #1
PHP'de
Örneğin
Bu durumda değere
Yalnız size ait ayrı deneme veritabanında, aşağıdaki tablo adı henüz yokken hazırlık SQL’ini çalıştırın. app_db, app_user ve parola yer tutucudur; gerçek gizli değeri kod deposuna kaydetmeyin. PHP örneği MySQLi eklentisi ve UTF-8 HTML yanıtı içindir; üretim verisine uygulanmaz.
PHP dosyası:
Bağlantı veya sorgu hatasında
Hangi yöntemin kullanılacağı, satır değerlerine nasıl erişmek istediğinize bağlıdır:
Web uygulamalarında sütun adlarıyla erişim çoğu zaman daha anlaşılırdır. Ancak sorguda aynı ada sahip sütunlar seçilirse ilişkisel dizide anahtar çakışması yaşanabilir. Bu nedenle takma ad kullanın. Aşağıdaki ek sorgu users ve profiles tablolarının ayrıca mevcut olduğu farklı bir JOIN senaryosunu gösterir; yukarıdaki tek tablo hazırlığının devamı değildir:
fetch_assoc(), MySQLi ile çalıştırılmış bir sorgu sonucundaki bir sonraki satırı sütun adlarını anahtar olarak kullanan ilişkisel dizi şeklinde döndürür. Her çağrıda sonuç kümesinden bir satır tüketilir. Okunacak satır kalmadığında null döner; bu nedenle tüm kayıtları okumak için genellikle while döngüsüyle kullanılır.Örneğin
name ve email sütunları bulunan bir sonuç satırı şöyle gelir:
Kod:
$row = [
'name' => 'Ayşe',
'email' => '[email protected]'
];
Bu durumda değere
$row['name'] ve $row['email'] ile erişilir. fetch_assoc() sorguyu çalıştırmaz; sorgunun döndürdüğü mysqli_result nesnesinden satır okur.Çalışan temel örnek
Yalnız size ait ayrı deneme veritabanında, aşağıdaki tablo adı henüz yokken hazırlık SQL’ini çalıştırın. app_db, app_user ve parola yer tutucudur; gerçek gizli değeri kod deposuna kaydetmeyin. PHP örneği MySQLi eklentisi ve UTF-8 HTML yanıtı içindir; üretim verisine uygulanmaz.
Kod:
CREATE TABLE fetch_assoc_demo_users (
id INT PRIMARY KEY AUTO_INCREMENT,
name VARCHAR(100) NOT NULL,
email VARCHAR(255) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
INSERT INTO fetch_assoc_demo_users (name, email) VALUES
('Ayşe', '[email protected]'),
('Mehmet', '[email protected]');
PHP dosyası:
Kod:
<?php
declare(strict_types=1);
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$db = new mysqli('localhost', 'app_user', 'app_password', 'app_db');
$db->set_charset('utf8mb4');
$result = $db->query(
'SELECT id, name, email FROM fetch_assoc_demo_users ORDER BY id'
);
while (is_array($row = $result->fetch_assoc())) {
echo htmlspecialchars(
$row['id'] . ' - ' . $row['name'] . ' - ' . $row['email'],
ENT_QUOTES | ENT_SUBSTITUTE,
'UTF-8'
) . "<br>\n";
}
$result->free();
$db->close();
while döngüsü her turda bir sonraki satırı alır. Son satırdan sonra fetch_assoc() null döndürür ve döngü sona erer. Başarılı örnek çıktısı şu biçimdedir:
Kod:
1 - Ayşe - [email protected]
2 - Mehmet - [email protected]
Bağlantı veya sorgu hatasında
MYSQLI_REPORT_ERROR nedeniyle hata oluşur; bu genellikle veritabanı bilgilerinin, tablo adının veya SQL sorgusunun kontrol edilmesi gerektiği anlamına gelir. Sorgu başarılı olduğu hâlde hiç satır yoksa döngü hiç çalışmaz. Bu durum hata değil, sonuç kümesinin boş olduğunu gösterir.fetch_assoc, fetch_row ve fetch_array farkı
Hangi yöntemin kullanılacağı, satır değerlerine nasıl erişmek istediğinize bağlıdır:
| Yöntem | Erişim biçimi | Uygun kullanım |
|---|---|---|
fetch_assoc() | $row['email'] | Sütun adlarıyla okunabilir kod |
fetch_row() | $row[0] | Sayısal sıra ile erişim |
fetch_array() | Ad veya sıra numarası | Her iki erişim biçiminin gerektiği durumlar |
Web uygulamalarında sütun adlarıyla erişim çoğu zaman daha anlaşılırdır. Ancak sorguda aynı ada sahip sütunlar seçilirse ilişkisel dizide anahtar çakışması yaşanabilir. Bu nedenle takma ad kullanın. Aşağıdaki ek sorgu users ve profiles tablolarının ayrıca mevcut olduğu farklı bir JOIN senaryosunu gösterir; yukarıdaki tek tablo hazırlığının devamı değildir:
Kod:
SELECT
users.name AS user_name,
profiles.name AS profile_name
FROM users
JOIN profiles ON profiles.user_id = users.id
Kullanırken dikkat edilecek noktalar
- SELECT için query() sonucu mysqli_result olabilir. prepare() ise statement döndürür; execute() ardından mysqlnd mevcutsa get_result() ile sonuç nesnesi alın;
fetch_assoc()doğrudan SQL metni üzerinde çalışmaz. - Bir satırı
fetch_assoc()ile okuduktan sonra aynı sonuçta tekrar çağrı yapmak sonraki satırı getirir. Aynı satıra yeniden erişmeniz gerekiyorsa değerleri ayrı bir değişkende saklayın. - Kullanıcıdan gelen değerleri SQL metnine birleştirmeyin. Değişken koşullarda hazırlanmış ifadeyle
prepare(),bind_param()veget_result()kullanın. - Sorgu sonucunu artık kullanmayacaksanız
free()ile serbest bırakın. Büyük sonuçlarda tüm satırları gereksiz yere diziye doldurmak yerine döngü içinde işleyin. - HTML çıktısında veritabanından gelen metni
htmlspecialchars()ile kodlayın. Bu,fetch_assoc()işleminin değil, veriyi HTML içinde gösterme aşamasının gereğidir.