Benim veritabanı sorgu MySQL aynı değere tüm sütunları ayar tutar

3 Cevap php

İşte Kohana 3 benim güncelleme yöntemidir.

public function update($type, $id, $updates) {
        $info = $this->getInfo($type);
        $dbTable = $info['table'];

        $updatesKeysToValues = array();

        var_dump($updates);

        foreach($updates as $key => $value) {
            // if the value is null or the key isnt set for this, don't update!
            if ($value === null OR ! isset($info['columnsToUpdateData'][$key])) continue;
            $updatesKeyToValues[] = "`$key` = :$key";

        }

        $updatesKeyToValues = implode(', ', $updatesKeyToValues);

        $query = 'UPDATE `' . $dbTable . '` SET ' . $updatesKeyToValues . ' WHERE id = :id LIMIT 1' ; 

        echo $query;

        $dbQuery = DB::query(Database::UPDATE, $query);

        foreach($updates as $key => $value) {
                echo "$key === $value\n<br>";
                $dbQuery->bind(':' . $key, $value);
         }

        $success = $dbQuery->bind(':id', $id)    
                        ->execute();    

        var_dump($success);

    }

Her var_dump() ve echo, veri gayet iyi sırasında. Bu neden oluyor önermek için bir şey yok.

Esasen ne yapıyorum, adında params ile bir sorgu dize bina döngü ve adlandırılmış params tanımlayan ve daha sonra yürütme, yapılandırma bu tablo için veri alma olduğunu. Bunun yerine çalışma, ben aynı (son dizi değeri ne olursa olsun gibi görünüyor) tüm alanlar ile sonuna kadar.

Yapabileceğini, onu anlamaya gibi olamaz? Zaman ayırdığınız için çok teşekkürler.

UPDATE

Ben sadece olan bir sorguda param adlarında geçerli altını, bir düşünce vardı?

ANOTHER UPDATE

Burada echo $query çıkışı olan

UPDATE `personnel` SET `first_name` = :first_name, `last_name` = :last_name, `email` = :email WHERE id = :id LIMIT 1

Ben de çok sorguya birden params bağlama bu yöntemi kadar pişirilir. Ben daha önce bir döngü içinde hiç yapmadım, ama işe kabul. Kohana 2.x, ben her zaman $bindings[] = 'tom@jones.com' vb kullanılan ediyorum, ama yeni Kohana kadarıyla söyleyebilirim gibi bir dizi kabul etmez.

FINAL UPDATE

Herkese teşekkürler, ben referans olarak geçirilen düşünüyorum. I $updates[$key] bunu ayarlayarak çevresinde var

Ben de param() yöntemi yerine bağlama kullanılan Nın olabilir gibi görünüyor. View source

3 Cevap

bağlama işlevi bir referansı sizin $ değerini kullanıyor

public function bind($param, & $var)
{
 // Bind a value to a variable
    $this->_parameters[$param] =& $var;
    return $this;
}

Bir testte iş gibi görünüyor şey

$a = array("a"=>1, "b"=>2, "c"=>3, "d"=>4, "e"=>5, "f"=>6);
$v = array();
$t = array();
$i = 0;
foreach($a as $key => $value)
{
    $t[] = $key;
    $v[] = &$t[$i];
    $i++;
}

print_r($v);

results are here: http://www.antiyes.com/test/hmm.php

Eğer $ anahtar & buluyorsun Dolar değer

$dbQuery->bind(':' . $key, $value);

referans olarak aktarılmaktadır?

Aşağıda işe yaramadı


Bu hat

$updatesKeyToValues[] = "`$key` = :$key";

: Eğer bunu değiştirebilir

$updatesKeyToValues[] = "`" . $key ."` = " . ":" . $key;

ve ne gördün mü?

Burada kullandığınız hangi veri erişim katmanı bilmiyorum, ama ben bu tahmin ediyorum:

foreach($updates as $key => $value) {
    $dbQuery->bind(':' . $key, $value);
}

referans parametreleri alarak: gerçekten aldatıcı şeyler yapıyor olabilir.

{[(- Peki ne olur $value Gerçek bir değişken olduğundan, bind() function bir başvuru alır ve onun bu variable hatırlar olurdu 3)]} değişkenin geçerli değeri - bu verilen parametreye bağlamak olacaktır. Sonra foreach döngü yuvarlak sefere gitmek, ve biz C gibi dillerin klasik döngü sorunu var: Eğer {$key yeni bir örneğini almak ve değil [(0)]}, aslında sadece standart for ($i= 0... döngü için gibi zaten mevcut değişkenleri, değişen ediyoruz.

Bu sorguyu yapmak için zamanı geldiğinde Yani, parametre ne :a? Bu $value mevcut değeri, döngü içinde sonuncusu. Parametre Neler :b? Aynı. Ve böylece.

Bazı PHP parameterisation arayüzler (mysqli, sanırım?) Bunu biliyorum, ama referans olarak genel alıcı parametreleri IMO bu gibi istenmeyen davranışlara yol son derece muhtemeldir, ve ben kesinlikle böyle bir parametre bağlama arayüzü için tamamen uygunsuz düşünün .

ETA: Sadece John yorumuna yayınlanan bağlantı query.php baktı. Evet. Sigh. Bu parametreleri referans olarak alıyor. Ne kadar korkunç.

Neden sorgu oluşturucu kullanmak değil mi?

Ben sorgu oluşturucu ile kendimi oynamak için yeterli zamanım olmadı gibi bu, sadece hızlı bir tahmin.

$query = DB::update();
$query->set($updates);
// etc

Kaynağını kontrol edin ve ben size sorgu oluşturucu nasıl çalıştığını anlamaya eminim :)