MySQLi içinde SELECT * FROM

5 Cevap php

Sitem oldukça geniş, ve ben sadece son zamanlarda (bir geç gaf beni ara) PHP5 geçiş yaptı.

Benim MySQL sorgunun tüm önce bu gibi inşa edilmiştir:

"SELECT * FROM tablename WHERE field1 = 'value' && field2 = 'value2'";

Bu çok kolay, basit ve dostu yaptı.

Ben şimdi belirgin güvenlik için mysqli için geçiş yapmak için çalışıyorum, ve ben bind_param belirli argümanlar gerektirdiğinde aynı SELECT * FROM sorguları uygulamak için nasıl bulmaktan zor bir zaman yaşıyorum.

Bu deyimi geçmişte bir şey midir?

Eğer öyleyse, nasıl dahil sütun ton ile bir sorgu ele? Ben gerçekten her zaman hepsini dışarı yazmanız gerekiyor mu?

5 Cevap

"SELECT * FROM tablename WHERE field1 = 'value' && field2 = 'value2'";

olur

"? * Tabloismi DAN alan1 = && field2 =" SELECT;

geçirilir; $mysqli::prepare,

$stmt = $mysqli->prepare(
  "SELECT * FROM tablename WHERE field1 = ? && field2 = ?");
$stmt->bind_param( "ss", $value, $value2); 
// "ss' is a format string, each "s" means string
$stmt->execute();

$stmt->bind_result($col1, $col2);
// then fetch and close the statement

OP yorumlar:

ben 5 parametreler var eğer öyleyse, ben potansiyel (girdilerin türlerine bağlı?) "sssis" ya da bir şey olabilir

Doğru, hazır açıklamada ? parametre başına bir tür belirleyici, hepsi konumsal (birinci belirleyici ilk ?, ikinci parametre için ilk gerçek parametre (yerine edildiği geçerlidir bind_param)).

mysqli kaçan ve (bence) alıntı ilgilenir.

Bu bir ay önce zaten vardı, ama oh iyi.

Yanılıyor olabilirim, ancak soru için ben bind_param burada gerçekten sorun olmadığını duygu olsun. Her zaman, bazı koşulları tanımlamak için sorgu dizesinde kendisi direkt olarak, ? tutucuları ayarlamak için bind_param kullanarak gerekir. Bu gerçekten bir sorun değil.

Ben mysqli SELECT * sorguları kullanarak vardı sorunu bind_result parçasıdır. Ilginç alır orası. Ben Jeffrey Way Bu yazı geldi: http://jeff-way.com/2009/05/27/tricky-prepared-statements/ (Bu bağlantı, artık aktif değil). Script basitçe sonuçları üzerinden döngüler ve bir dizi olarak döndürür - Orada kaç sütun bilmek gerek, ve sen hala hazırlanmış ifadeleri kullanabilirsiniz.

Bu durumda, bu gibi bir şey olacaktır:

$stmt = $mysqli->prepare(
  'SELECT * FROM tablename WHERE field1 = ? AND field2 = ?');
$stmt->bind_param('ss', $value, $value2);
$stmt->execute();

Sonra siteden pasajı kullanın:

$meta = $stmt->result_metadata();

while ($field = $meta->fetch_field()) {
  $parameters[] = &$row[$field->name];
}

call_user_func_array(array($stmt, 'bind_result'), $parameters);

while ($stmt->fetch()) {
  foreach($row as $key => $val) {
    $x[$key] = $val;
  }
  $results[] = $x;
}

Ve $results şimdi SELECT * tüm bilgileri içerir. Bugüne kadar bu ideal bir çözüm bulundu.

Eğer geçiş olsa da, yerine mysqli'nin PDO anahtarı Bu veritabanı agnositc kod yazmak ve hazırlanan tablolar için daha iyi özelliklere sahip olur.

http://www.php.net/pdo

Bindparam for PDO: http://se.php.net/manual/en/pdostatement.bindparam.php

$sth = $dbh->prepare("SELECT * FROM tablename WHERE field1 = :value1 && field2 = :value2");
$sth->bindParam(':value1', 'foo');
$sth->bindParam(':value2', 'bar');
$sth->execute();

veya:

$sth = $dbh->prepare("SELECT * FROM tablename WHERE field1 = ? && field2 = ?");
$sth->bindParam(1, 'foo');
$sth->bindParam(2, 'bar');
$sth->execute();

ya da bir dizi gibi parametrelerle çalıştırın:

$sth = $dbh->prepare("SELECT * FROM tablename WHERE field1 = :value1 && field2 = :value2");
$sth->execute(array(':value1' => 'foo' , ':value2' => 'bar'));

Eğer uygulama gelecekte farklı veritabanları üzerinde çalışabiliyor olmak istiyorum eğer sizin için daha kolay olacaktır.

Ben de size PDO ile çalışan iken Zend Framwework gelen bazı sınıfların kullanarak bazı zaman yatırım gerektiğini düşünüyorum. Onların Zend_Db check out ve daha spesifik [Zend_Db_Factory] [2]. Sen çerçevenin tümünü kullanabilir ya da MVC deseni için uygulamaya dönüştürmek için var, ama çerçevesini kullanarak ve üzerinde okuma iyi harcanan zaman olduğunu bilmiyorum.

Hala (mysqli sunucusu ile iletişim sadece başka bir yoludur, SQL dilinin kendisi değişmemiş, genişletilmiş) kullanabilirsiniz. Prepared statements olsa da, daha güvenli - düzgün her zaman kendi değerlerini kaçan sorun geçmesi gerekmez beri. Onlar gibi istiyorum ama geçerseniz sql Piggybacking riski azalır varsa, onları bırakabilirsiniz.

Bu deyimi geçmişte bir şey midir?

Evet. Kullanmayınız {[(0)];} bir bakım kabus. Orada bu yapı neden kötü olduğuna dair SO diğer parçacığı ton, ve nasıl daha iyi sorguları yazmak yardımcı olacaktır kaçınarak.

Ayrıca bkz: