Mehmet

WFN Üye
Konular
1,851
Mesajlar
1,852
Çözüm
0
Ticaret Puanı
0
Üyelik
1 Ay 6 Gün
Konum
YurtDışı
Web Sitesi
Var
Alanı
Google Adsense
1/1
Konu sahibi
PHP'de 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öntemErişim biçimiUygun 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​


  1. 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.
  2. 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.
  3. Kullanıcıdan gelen değerleri SQL metnine birleştirmeyin. Değişken koşullarda hazırlanmış ifadeyle prepare(), bind_param() ve get_result() kullanın.
  4. 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.
  5. 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.

Sık sorulan sorular​

false ile null aynı durumu mu gösterir?​

Hayır. Belgelenmiş dönüş türü array|null|false şeklindedir: array satır, null satır sonu, false başarısızlık anlamına gelir. Sorgu hatalarının exception olarak raporlanması da ayrı bir aşamadır. İki durumu ayırmanız gerekiyorsa strict karşılaştırma kullanın; yalnız false bitişini bekleyen döngü null üzerinde devam edebilir.

Satır içindeki SQL NULL, sonuç kümesinin sonu mudur?​

Hayır. Bir sütunun SQL NULL değeri, dönen satır dizisinin ilgili alanında PHP null olur. Satırın kendisinin null olması ise okunacak başka satır kalmadığını gösterir. Dizinin varlığını ve alanın değerini ayrı kontrol edin.
 

Sende şimdi bize katılmak ister misin?

Kayıt ol

Bize katılım kolay ve ücretsizdir!

Konuyu görüntüleyenler

Bu konuyu şu anda görüntüleyen üye bulunmuyor.