[英]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.