PHP'nin mysqli veri erişim işlevlerini karıştırma?

3 Cevap php

Ben kullandım son birkaç gün içinde bir kaç soru gördüm mysqli ama cevaplar $stmt->execute() ve $db->query() arasındaki farkı fark yok görünüyor nerede .

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

Bu bir ham SQL kullanır ve SQL enjeksiyon saldırıları önlemek için giriş kaçmak için programcı gerektirir, ama programcı column => value eşleşmelerini içeren bir ilişkisel dizi (veya düz bir dizi) almak için izin verir:

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

Alternatif olarak, parametreleri ve sonuçları güzel bağlama sağlayan bu, yapabilir, ama (AFAIK) size basit dizi sonucunda her türlü veremez:

$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
}

Benim soru - ilk desen gösterilen basit dizi çıktısı almak için mysqli ile herhangi bir yolu yoktur, ancak yine de ikinci desen başı olarak güvenli bir şekilde bağlı giriş parametrelerini kullanarak ederken?

Ben (yerine PDO kullanmaktan başka!) Bunu zaten bulamıyorum.

3 Cevap

Php kılavuzun bu sayfada yorumlarda bu tür bir şey yapmak için bir işlevin birden çok uygulama vardır: mysqli_stmt::fetch

Alnitak,

AFAIK, otomatik getirilen sonuçlarına bütün bir dizi bağlamak olamaz. Ne yazık ki. Bunun (muhtemelen bu yüzden etrafında sonuçları geçmek kolaydır) üzerinden bir 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ıdaki, size istenen davranışı verecektir. Ancak, dinamik dizi indeksleri çağrışım dizi alanları bağlamak olmaz - yani, o kimliği, vb ['id'] $ dizi bağlı olması belirtmelisiniz

Ilişkisel indeksleri bağlama dinamik gerçekten senaryo gereği, her zaman sonra sorgusu gerçekleştirmek, kurulum Doç dizi indeksleri sonra, ilk olarak seçilen alanlar için sorgu ayrıştırma basit bir sınıf yazabilirsiniz.

Ben hayır derim. I mysqli veya hazırlanmış tablolar bir ton ile çalıştı değil düşündüm, ben ikinci örnekte her adım ayrık ve gerekli olduğuna inanıyorum. Sana verebileceğim tek teselli ilk örnek, güvenli ve gerçekten ikinci örnekte sayabilirsiniz kaçan bazı SQL geçiştirilmiştir olmasıdır.