MySQL Query farklı değişken türlerini kaçmak için Fonksiyon

4 Cevap php

Ben olarak benim PHP sorguları yazma hasta var:

"WHERE '" . Database::escape($var) . "'";

Escape () fonksiyonu sadece () mysql_real_escape_string çağırır - ama onu sonra diğer veritabanları için destek uzatabilirsiniz var.

Sorguda tek tırnak dizeleri zorunda benim kod daha karmaşık hale edildi. Yani benim fikrim, bir sorgu için bir değişken 'hazırlamak' benim veritabanı sınıfının bir diğer işlevi oluşturmak için oldu:

static public function prepare($var)
{

    if (is_object($var) || is_array($var) ) {
        return " '" . Database::escape(serialize($var)) . "' ";

    } else if (is_bool($var)) {
        return ' ' . (int)$var . ' ';

    } else if (is_int($var)) {
        return ' ' . $var . ' ';

    } else if (is_string($var) || is_float($var)) {
        return " '" . Database::escape($var) . "' ";

    } else {
        throw new Exception('Unsupported variable type [' . gettype($var) . ']');
    }
}

Şimdi burada parası ben bir sorguya geçmek hangi değişkenlerin hakkında endişelenmenize gerek yok olmasıdır. Ancak iki soru getiriyor:

  1. Ben düzgün, her değişken türünü ele muyum?
  2. Ne sebeple (eğer varsa) için ben bu yapmamalıyım?

4 Cevap

A) ifadeleri ve PDO gibi b) bir veritabanı soyutlama katmanı () pepared sizin için arıyoruz.

Ne kendi başınıza yapmak için çalışıyoruz zaten çözüldü, kendi uygulama rulo olmamalıdır.

Eğer bu yolda giderseniz fark edeceksiniz ki bu:

"... WHERE '" . Database::escape($var) . "'"

anlamsız ve tehlikelidir. SQL kodu ve parametrelerinin net bir ayrılık daha açık olmasını gerektirir ve SQL enjeksiyonu aynı zamanda karşı güvenli tarafta alır:

"--- WHERE SomeField = ?"  /* the parameter (?) will be filled elsewhere */

Bu veritabanı alanında gerçek satıcı-bağımsızlık ihtiyaçları ve önceliklerine bağlı olarak, yere sert ve imkansız arasında olduğunu bilmenizde yarar var. Bir çok feda etmeye istekli olmadıkça Yani taşınabilir SQL yazmaya çalışıyorum could boşuna bir egzersiz olarak çıkıyor. MySQL için bile noktasına SQL Server, diyelim ki, imkansız bulacaksınız LİMİT fıkra ile başlar.

Evet, Parametrelenmiş sorguları kullanmak ve sadece Çalışacak. Bu doğru çözüm olduğunu ve o korkunç zor değil.

PHP, bunu yapmak için PDO kullanmak, onun API çok daha aklı başında mysql_ veya mysqli_ daha ve dahası, bu hataları istisnalar atmak ve diğer güzel şeyler yapabilirsiniz.

Muhtemelen bu yapmamalıyız. İşte nedenleri: mysqli::prepare veya PDO::prepare

Eğer bir şey (örneğin "5") bir int olarak saklamak istediğiniz bir dize sakladığınız eğer fonksiyonu kendisi için olduğu gibi, ne olur? Hala yine de teklif edeceğiz.

Sen deneyebilirsiniz

$sql = "SELECT * FROM SomeTable WHERE userid = '{Database::prepare($userid}'";

yazarak sorunları hafifletmek için. Benim önerim bir formdan girişleri kabul ediyorsanız, neden kurulum Veritabanı :: onları temizlemek için $ _REQUEST veya $ _POST ile çalıştırmak için () hazırlamak, ya da bir kopyasını tükürmek olduğunu rağmen?

Bu bunu nasıl:

$safe_post = InputCleaner::clean($_POST);
$sql = "SELECT * FROM table WHERE userid = {$safe_post['userid']}";