Veritabanı sınıfta Hazırlanan Tablolar

1 Cevap php

The Problem

Yani benim web tabanlı uygulama yazıyorum ve benim kafama dank etti "Durr, eşyalarını SQL enjeksiyonu ve etajer geniş açık! Db sınıfı Rewrite!"

Şu anda benim $db sınıfını yeniden yazıyorum ve ben hazırlanmış deyimleri uygulamak alacağımı nasıl anlayış sorun önemli miktarda yaşıyorum.

Previously...

Ben böyle bir şey kullanmak için kullanılır:

$db->runQuery("SELECT * FROM someTable WHERE someField = '$var1'");
while ($result = mysql_fetch_array($db->result){
    // ... ugh, tedious
}

Select deyimleri yaparken Şaşmaz, ben bir dizi kapma ve sonuçları döngü ediyorum.

I understand that...

  1. Ben MySQL olmayan hazırlanmış deyimleri kullanarak için yakılan edilmelidir.
  2. Ben mysql her değişken parametrenin ne tür bildirmek zorunda. (Ya ben)?

I'd like to...

Sonra bana (. Değerler bir ilişkisel dizi olarak) çalışmak için bir sonuca dönmek hangi (bir örnek olarak select kullanmasına izin) benim yeni işlevine benim sorgu ve değerler geçmek mümkün;

$query  = "SELECT * FROM someTable WHERE someField = ? AND anotherField = ?";
$params = array($var1, $var2);
$result = $db->doSelect($query, $params);
// Then do all sorts of neat stuff with $result - huzzah!

I'm having trouble with...

Ben birlikte tüm bilgi getirmek nasıl anlamak.

  1. Nasıl bir değerler dizisi mevcut ve benim hazır deyimi ile birlikte mushed bu var mı?
  2. Nasıl (execute()?) Çalıştırırım ve bir dizi dönün mushed Açıklamada, dedi?

I'm sorry if my question is somewhat roundabout, however I'm frazzled from trying to understand it. If more information is required, please let me know and I'll add it.

1 Cevap

Burada bir Yürüt / hazırlayın fonksiyonu dizi için yazdım budur. Bu elbette büyük bir DB nesne parçasıdır.

/**
*   Prepares a query to be run, storing the data in $this->preparedTokens
*   Use the following characters to indicate how the data is to be put into SQL statement
*   ? -> escaped and quoted (with single quotes) before inserting
*   ^ -> inserted as is
*   & -> implodes the array escpaping each value
*   @ -> implodes the array (no escaping)
*
*   @param      string      $sql        The SQL statement to prepare
*
*   @return     int         The key of prepare sql query to be passed to $this->Execute()
*/
public function Prepare($sql) {
    $simges = preg_split('/((?<!\\\)[@&?^])/', $sql, -1, PREG_SPLIT_DELIM_CAPTURE);

    // loop through removing any escaped values
    foreach ($simges as $key => $val) {
        switch ($val) {
            case '?' :
            case '&' :
            case '@' :
                break;
            default :
                $simges[$key] = preg_replace('/\\\([@&?^])/', "\\1", $val);
                break;
        } // switch
    } // foreach

    $this->preparedTokens[] = $simges;
    end($this->preparedTokens);
    return key($this->preparedTokens);
} // function Prepare

/**
*   Creates the SQL placing the data in the appropriate places and then runs the sql
*
*   @param      int         $preparedKey        The key of the prepared sql
*   @param      array       $data               The array of data to put into the query (the count of this array must match that of the prepared query)
*
*   @return     object      false if the $preparedKey does not exist in $this->preparedTokens
*                           false if count of needed values in sql statement does not equal the number of keys in the data array
*                           otherwise, the result of $this->Query()
*/
public function Execute($preparedKey, $data) {
    if (isset($this->preparedTokens[$preparedKey])) {
        $simges = $this->preparedTokens[$preparedKey];
        $query = '';
        $dataKey = 0;
        $count = 0;

        // count the number of simges we have
        $validTokens = array('?', '^', '&', '@');
        foreach ($simges as $val) {
            if (in_array($val, $validTokens)) {
                ++$count;
            } // if
        } // foreach

        // check to ensure we have the same number of simges as data keys
        if ($count != count($data)) {
            trigger_error('Query Error: The number of values received in execute does not equal the number of values needed for the query', E_USER_ERROR);
            return false;
        } // if

        // loop through the simges creating the sql statement
        foreach ($simges as $val) {
            switch ($val) {
                case '?' :
                    $query .= "'" . $this->EscapeString($data[$dataKey++]) . "'";
                    break;
                case '^' :
                    $query .= $data[$dataKey++];
                    break;
                case '&' :
                    $query .= $this->ImplodeEscape($data[$dataKey++]);
                    break;
                case '@' :
                    $query .= implode(',', $data[$dataKey++]);
                    break;
                default :
                    $query .= $val;
                    break;
            } // switch
        } // foreach

        return $this->Query($query);

    } else {
        return false;
    } // if
} // function Execute

/**
*   Runs $this->Prepare() then $this->Execute() for the sql and the data
*   Use the following characters to indicate how the data is to be put into SQL statement
*   ? -> escaped and quoted (with single quotes) before inserting
*   ^ -> inserted as is
*   & -> implodes the array escpaping each value
*   @ -> implodes the array (no escaping)
*
*   @param      string      $sql        The SQL statement to prepare
*   @param      array       $data       The array of data to put into the query (the count of this array must match that of the prepared query)
*
*   @return     object      returns value from $this->Query() if Execute was successful
*                           otherwise it'll be false
*/
public function PrepareExecute($sql, $data) {
    return $this->Execute($this->Prepare($sql), $data);
} // function PrepareExecute

$this->Query() MySQL deyimini çalıştırır ve sonra (kesilmiş açıklamada, ilk 6 karakterlere göre) ifadesi ne bağlı olarak farklı değerler döndürür:

  • false başarısız olursa (kullanım $ this-> GetError () hata mesajı alıyorum)
  • eğer başarılı INSERT, sonra insert id
  • Başarılı DELETE veya UPDATE veya etkilenen satırların ardından numarayı DEĞİŞTİR eğer
  • eğer başarılı SELECT veya herhangi diğer sorgu tipi, sonra Sorgu nesne

Bu sizin için ne arıyorsanız eğer emin değilim, ama yardımcı olabilir.

Bu söylemeyi unutmuşum, ama fikirlerin çoğu Armut :: DB sınıftan çıktı: http://pear.php.net/package/DB