簡體   English   中英

我的數據庫查詢在MySQL中將所有列設置為相同的值

[英]My database query keeps setting all columns to the same value in MySQL

這是我對Kohana 3的更新方法。

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);

    }

在每個var_dump()echo ,數據都很好。 沒有什么可以暗示為什么會發生這種情況。

基本上我正在做的是從配置中獲取此表的數據,構建一個帶有命名參數的查詢字符串,循環並定義命名參數然后執行。 而不是工作,我最終得到所有字段相同(似乎是最后一個數組值)。

我似乎無法弄明白,你呢? 非常感謝你的時間。

UPDATE

我只是想一想,查詢中的param名稱中的下划線是否有效?

另一個更新

這是echo $query的輸出

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

我也研究了將多個參數綁定到查詢的方法。 我以前從未在循環中完成它,但我認為它會起作用。 在Kohana 2.x中,我總是使用$bindings[] = 'tom@jones.com'等,但據我所知,新的Kohana不接受數組。

最終更新

謝謝大家,我認為它是通過引用傳遞的。 我把它設置為$updates[$key]

看起來我也可以使用param()方法而不是bind。 查看來源

bind函數使用引用你的$ value

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

似乎在測試中起作用的東西

$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);

結果如下: http//www.antiyes.com/test/hmm.php

你認為$ key和$的價值

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

正在通過參考傳遞?

下面沒有工作


這條線

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

你能把它改成:

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

看看會發生什么?

我不知道你在這里使用什么數據訪問層,但我猜這個:

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

可能會做一些非常具有欺騙性的事情:通過引用獲取參數。

所以會發生的事情是,因為$value是一個實數變量, bind()函數接收對它的引用,並記住它是這個變量 - 而不是變量的當前值 - 它將綁定到給定的參數。 然后你下一次繞過foreach循環,我們得到了類似C語言的經典循環問題:你沒有得到$key$value的新實例,你實際上是在改變你現有的變量已經有,就像for ($i= 0...循環的標准)。

那么,當需要進行查詢時,參數:a什么:a 它是$value的當前值,是循環中的最后一個$value 什么參數:b 相同。 等等。

我知道一些PHP參數化接口會這樣做(mysqli,我認為?),但一般來說,通過引用接收參數是IMO極有可能導致像這樣的不需要的行為,我當然認為它完全不適合像這樣的參數綁定接口。

ETA:只看了你發布到John評論的鏈接中的query.php。 是。 嘆。 它通過參考獲取參數。 真可怕。

為什么不使用查詢構建器?

這只是一個快速的猜測,因為我沒有足夠的時間自己玩查詢構建器。

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

查看源代碼,我相信你可以弄清楚查詢構建器是如何工作的:)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM