2009-03-09 13 views
0

Son birkaç gün içinde mysqli'u kullanan ancak yanıtların $stmt->execute() ve $db->query() arasındaki farkı tanımadığı birkaç soru gördüm.PHP'nin mysqli veri erişim fonksiyonlarını karıştırmak mı?

Anladığım kadarıyla, mysqli adresindeki sonuçlara erişmek için iki farklı model vardır. Alternatif olarak

$result_set = $db->query("SAFE SQL QUERY HERE"); 
while ($row = $result_set->fetch_assoc()) { 
    # do something with $row['fieldname']; 
} 

:

Bu, bir column => value eşlemeler içeren bir dizi ile (ya bir düz dizi) almak için programcı ham SQL kullanır ve SQL enjeksiyon saldırılarını engellemek için giriş kaçmak için, programcı gerektiren izin veren, fakat almak için mysqli ile herhangi bir yolu yoktur -

$stmt = $db-prepare("SQL QUERY WITH ? PLACEHOLDERS"); 
$stmt->bind_param("s", $input_variable); 
$stmt->execute(); 
$stmt->bind_results($output_col1, $output_col2); 
while ($stmt->fetch()) { 
    # do something with $output_col1 and $output_col2 
} 

sorum şu: Eğer parametreleri ve sonuçların güzel bağlama izin veren yapabiliriz, ancak (AFAIK) size basit dizi sonucunda her türlü veremez İlk modelde gösterilen basit dizi çıkışı, ancak hala ikinci modele göre güvenli bir şekilde giriş parametrelerini kullanırken?

Bunu yapmak için yine de bulamıyorum (bunun yerine PDO'u kullanma!).

+0

Olafur - Ben senin yazım değişikliği geri alındı ​​ettik. "tanınmış", standart İngilizce yazımdır. – Alnitak

cevap

1

php kılavuzun bu sayfada yorumlarında bu tür bir şey yapmak için bir fonksiyonun birden uygulamaları vardır: mysqli_stmt::fetch

0

Hayır derim. Ben mysqli ile çalışmadım ya da bir açıklamaları hazırladım düşündüm, ikinci örneğindeki her adımın ayrık ve gerekli olduğuna inanıyorum. Size verebileceğim tek tesellim, ilk örneğinizin, ikinci örneğinizde güvenle ve gerçekten göz ardı edebileceğiniz bir kaç SQL'den kaçmasıdır.

1

Alnitak,

AFAIK, otomatik olarak getirilen sonuçlarına bütün bir dizi bağlamak mümkün değil. Ne yazık ki. Eğer (o etrafında sonuçları geçmek kolaydır muhtemelen bu yüzden) bunun dışında dizi davranışı arıyorsanız Ancak, bu deneyebilirsiniz:

<?php 
$dbh = new mysqli(...); 
$arr = array(); 
if($stmt = $dbh->prepare('SELECT id, email FROM email_list'); 
{ 
    $stmt->execute(); 
    $stmt->bind_result($arr['id'], $arr['email']); 

    while($stmt->fetch()) 
    DoSomething($arr); 
} 
?> 

Bu, yukarıda, size talep davranışı verecektir. Bununla birlikte, dizi alanlarını dizideki çağrışımsal indekslere dinamik olarak bağlamaz - yani, kimliğin $ arr ['id'], vb. Ile ilişkilendirilmiş olması gerekir.

İlişkisel indekslere dinamik bağlanma senaryonuza gerçekten ihtiyaç duyuyorsanız, her zaman seçili alanlar için sorguyu ayrıştıracak basit bir sınıf yazabilir, daha sonra assoc dizisi indekslerini ayarlayabilir, sonra da sorguyu gerçekleştirebilirsiniz.

+0

ilginç, ancak (AIUI) $ sonuç verir [] = $ arr, iki boyutlu bir sonuç dizisi elde etmek için ortak bir modeldir, çünkü her döngüde aynı $ arr kullanıyor. Bence $ arr'ın bir kopyasını almak zorunda kalacağım ve sonuçların $ sonuçlarına eklemelisin [] – Alnitak

+0

Test etmek için yeterince kolay, ve sen haklısın! Çok boyutlu bir dizi oluşturmak istiyorsanız, ilişkili dizinin derin bir kopyasını gerçekleştirmeniz gerekir. While döngüsünde, $ multi [] ['id'] = $ arr ['id'] gibi bir şey yapabilirsiniz; ($ arr cinsinden her assoc. endeksi için). Bu size ihtiyacınız olanı verecektir. –