PHP PDOStatement: Bir Array Key olarak ilk sütun olarak, A Row Fetch

5 Cevap php

I PDOStatement veritabanını sorgulamak için kullanıyorum. Ben bir iade satır bulduğumda, ben anahtarı ve değerleri olarak satırdaki sonraki elemanlar olarak $row[0] ile, bir diziye getirilecek istiyorum.

Ben, tabii, örneğin aşağıdaki gibi işi yapmak için foreach döngüler ve if Koşullamalar, bir arada yazabilirsiniz:

private static function GetMySQLResult($dbname, $sqlString) {


		$dbh =  self::ConstructPDOObject($dbname);
		 $dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

		$result=array();
		 foreach ($dbh->query($sqlString) as $row)
		 {
		 	$result[$row[0]][]=$row[1];  // the simplest case for 2 columns, should add more to handle more columns

		 }

		 return $result;

}

ama varolan bir yöntem için arıyorum; Böyle bir yöntem, already mevcut var mı?

5 Cevap

Kredi devdRew gidin. Check the other question here.

Görünüşe göre, siz cevap belirtilen olabilir. Ben de kontrol ve o inşaat büyük.

$q = $db->query("SELECT `name` AS name, `value` AS value FROM `settings`;");
$r  = $q->fetchAll(PDO::FETCH_KEY_PAIR);
$stmt->fetchAll(PDO::FETCH_GROUP|PDO::FETCH_UNIQUE); 

Bir kesmek biraz ama birisi decided FETCH_KEY_PAIR gerektiğini, 2 sütun sonuç kümesi tek çünkü bunu yapmak için gerçekten tek yolu olsa.

Not: ilk sütun bir anahtar kullanılır ve diğer herhangi bir şekilde belirlenen sonucunda döndürülen değil.

Bazı ipuçları, sen çift veri (sayısal ve metinsel kolon isimleri) ile sona kalmamak doğru PDOStatement->fetch() yöntemine stil almak geçmesi gerekiyor. PDO :: FETCH_BOTH kullandığınızda hem aynı değeri içeren $ satır gibi [0] ve $ satır ['id'].

$result = $dbh->query($sqlString);
while ($row = $result->fetch(PDO::FETCH_NUM)) {
...

Sorunuza gelince, tüm sonuçlar almak zorunda olacak ve daha sonra değer olarak anahtar ve sonuç satır olarak $ row ['id'] ile bir dizi oluşturmak - yapıyorsun gibi. Ben PDO etrafında bütün bir ORM kütüphane inşa ve ben bunu otomatik olarak yapmak için bir şey bulmak asla.

$result = $dbh->query($sqlString);

$results = array();
while ($row = $result->fetch(PDO::FETCH_NUM)) {
    $results[$row[0]] = $row;
}

return $results;

İki sütun tablo senaryoda yanı sıra, bu işlemek için PDO düzeyde bir şey yok, ama bu böyle, bunun için bir yeniden yineleyici yazabilirsiniz:

class FirstColumnKeyIterator implements Iterator
{
    private $stmt;
    private $key;
    private $data;
    private $mode;

    public function __construct(PDOStatement $stmt, $fetch_mode = PDO::FETCH_NUM)
    {
        $this->stmt = $stmt;
        $this->mode = $fetch_mode;
        $this->fetch();
    }

    private function fetch()
    {
        if (false !== ($this->data = $this->stmt->fetch($this->mode))) {
            $this->key = current(array_splice($this->data, 0, 1));
        }
    }

    public function rewind()
    {
        // nil operation
    }

    public function key()
    {
        return $this->key;
    }

    public function current()
    {
        return $this->data;
    }

    public function next()
    {
        $this->fetch();
    }

    public function valid()
    {
        return false !== $this->data;
    }
}

Yapıcı bir PDOStatement alır ve isteğe bağlı (varsayılan sayısal sütunlar, ama bir ilişkisel dizi için PDO::FETCH_ASSOC için değiştirilebilir) moduna almak ve tipik kullanarak sorgu sonuçları yineleme sağlar foreach.

Kullanımı örnek:

$dbh = new PDO(/* etc */);

$stmt = $dbh->query('SELECT * FROM accounts');
foreach (new FirstColumnKeyIterator($stmt, PDO::FETCH_ASSOC) as $key => $value) {
        echo $key, ' = ', print_r($value, true), PHP_EOL;
}

Afaik, PHP bunu ama ne istediğinizi elde edemeyeceği şekilde bir çift vardır olacağını varolan hiçbir yöntem vardır.

Xeoncross dedi ama biraz ne değiştirilmiş olmanın ilk biri:

$pdostmt = $pdo->query("SELECT ... FROM your_table");

$res = array();

foreach ($pdostmt->fetchAll(PDO::FETCH_ASSOC) as $row)
{
    $res[array_shift($row)] = $row;
}

Aksi takdirde, değişken atama yakalamak için bir __set() yöntemi ile bir sınıf oluşturabiliriz:

class at_res
{
  public $key;
  public $values = array();
  protected $flag = true;

  public function __set($var, $value)
  {
    if ($this->flag)
    {
      $this->key = $value;
      $this->flag = false;
    }
    else
    {
      $this->values[$var] = $value;
    }
  }

  public function extract()
  {
    return array($this->key => $this->values);
  }
}


$pdo = new PDO(...);

$pdostmt = $pdo->query("SELECT ... FROM your_table");

$res = $pdostmt->fetchObject('at_res');

var_dump($res->extract());

Umarım yardımcı olur.