PHP / MySQL bir sınıf veritabanı erişimi izole - Birden fazla satır sonucu bir cepten bir şekilde ayarlamak nasıl işleneceğini

3 Cevap php

Sınıfta PHP / MySQLisolating veritabanı erişimi - Birden fazla satır seçer nasıl işleneceğini

Here’s a coding question. I isolated all DB access functions in a class

<?php
class DB {
    var $conn;         
    function DBClass () {
                @$this-> conn = mysqli_connect (DB_SERVER, DB_USER, DB_PASS, DB_NAME);
    }
    function validateUser ($aUserid, $aPassword) {
                …  validation code – sql injection code etc..
                $sql = "Select userid, name, level From users where userid = '$aUserid' and password = '$aPassword'";
                $result = mysqli_query ( $this->conn, $sql );
                if (!$result || (mysqli_num_rows ($result) < 1)) {
                            return false;
                }
                $dbarray = mysqli_fetch_assoc ($result); // get a row
                return $dbarray;
    }

    function getProduct ($aProductid) {

                return $dbarray;
    }

    function getProductList () {  
                // <----------- this would be the problem function
    }
}

$DB = new DBClass();
?>

Benim yordamı çağrılırken:

<?php
        $dbarray = $DB->validateUser ($_POST['userid'], $_POST['password']); 
?>

Sorun yok gayet iyi çalışıyor. Birden fazla satır bir sonuç kümesi ile bir sorun haline çalıştırmak. Şimdi geri döndüm her satır için sınıf nesnesine almak zorunda. Ben arama rutin MySQL kodu eklerseniz sorun yok, ama benim sınıfta bu izole tutmak istiyorum ve ben bu kodu nasıl emin değilim.

Herhangi bir düşünce? Herhangi bir örnek?

3 Cevap

PHP 5.3.0 ve mysqlnd kullanırsanız, yeni bir fonksiyon mysqli_fetch_all() kullanabilirsiniz. Bu ilişkisel diziler bir dizi döndürür.

PHP önceki bir sürümünü kullanıyorsanız, PDO kullanarak geçiş ve fonksiyonunu PDOStatement::fetchAll() kullanabilirsiniz.

Sen ne çok büyük bir sonuç kümesi hakkında bir açıklama isteyin. Bu sınırsız bir sonuç kümesi dizi PHP bellek limitini aşmasına neden olabilir ve bu ölümcül bir hata neden ve komut dosyasını durdurmak olacağını doğrudur. Ama bu gerçekten bir sorun mu? Kaç ürün var mı? Sen LIMIT sorgu sınırsız olmadığından emin olmak için kullanabilirsiniz.


Geri sınıfa gidiyor ilgili sorularınızın diğer kısmı yeniden, ben bir Iterator sınıf yapma öneririm:

class DB implements IteratorAggregate
{
  protected $_data = array();

  public function getProductList() {
    // fetch all results from SQL query, stuff them into $this->_data
    return $this->getIterator();
  }

  public function getIterator() {
    return new ArrayIterator($this->_data);
  }
}

Şimdi bir foreach döngüde sınıfını kullanabilirsiniz:

$db = new DB();
foreach ($db->getProductList() as $product) {
  // do something with each product
}

IteratorAggregate arabirimi bile bunu anlamına gelir:

$db = new DB();
$db->getProductList();
// ...other steps...
foreach ($db as $product) {
  // do something with each product
}

Tabii ki sadece bu yöntem ile bir seferde bir sonuç kümesini saklamak olabilir. Eğer arada başka sorguları için DB sınıf kullandıysanız, bu karmaşık şeyler olur. Bu sebeple, insanların çoğu bütün veritabanı işlemleri saklanması için tek bir sınıf yazmak için çalışmayın. Onlar Domain Model onlar veritabanı bağlantısı ayrılmış, birlikte çalışmak için gereken her tür için ayrı sınıflar yazmak.

Eğer bir dizi sonucu kaydetmek ve geri olabilir:

function getProductList () {
   $sql = "SELECT ...";
   $result = mysqli_query ( $this->conn, $sql );

   $myProducts = array();

   while ($row = mysqli_fetch_assoc($result))
      $myProducts[] = $row; // or array_push($myProducts, $row)
   }

   return $myProducts
}

Sonuç olarak diziler bir dizi olacak ve bunun her bir elemanı, sonucun bir satır içerecektir.

Eğer giriş sayfasında, bir SQL enjeksiyon hakkına sahiptir.

What happens if someone inputs that as password: xxx' OR 'yyy' <> 'x