2014-01-12 99 views
2

我從tab1中選擇數據到一個變量,並在另一個查詢中使用它,該查詢更新tab1。目標列target屬於INT類型,因此在設置之前將其舍入。在PDO中的Mysql變量和多個查詢。更新查詢不起作用

它在mysql工作臺上運行良好,php也沒有錯誤(error_reporting設置爲-1)。它只是不真正更新目標列 - 它保持爲零。

任何想法爲什麼?

$q = 'SELECT @tmp = (SELECT t 
         FROM tab1 
         WHERE a_id = :id1); 
     UPDATE tab1 
     SET target = (SELECT ROUND(@tmp/(SELECT COUNT(*) 
              FROM tab2 
              WHERE b_id = :id2))); 
     '; 

$sth = $dbh->prepare($q); 
$sth->execute(array(':id1' => $id, ':id2' => $id)); 
+1

[*您不能使用相同的名稱的命名參數標記準備好的聲明中有兩次*](http://php.net/manual/pdo.prepare.php)。此外,爲了支持多重查詢,您需要確保將「PDO :: ATTR_EMULATE_PREPARES」屬性設置爲「true」 – Phil

+0

「PDO :: ATTR_EMULATE_PREPARES」設置爲「1」。此外,只是試圖重命名命名參數,仍然沒有成功。非常感謝您的時間! – notnull

+0

請在上面的問題中反映任何代碼更改。另外,您的PDO連接使用什麼錯誤模式?編輯代碼 – Phil

回答

0

當使用SELECT與用戶變量,我們必須使用不同的分配,這是:。一定要將模擬準備設置爲true。

$q = 'SELECT @tmp:= (SELECT t 
        FROM tab1 
        WHERE a_id = :id1); 
     UPDATE tab1 
     SET target = (SELECT ROUND(@tmp/(SELECT COUNT(*) 
             FROM tab2 
             WHERE b_id = :id2))); 
    '; 
$sth = DB::query($q); 
var_dump($sth->fetch()); 
$sth->nextRowset(); 
var_dump($sth); 

但MySQL參考http://dev.mysql.com/doc/refman/5.0/en/user-variables.html狀態,我們應該設置用戶定義的變量與SET

所以你的情況:

$q = 'SET @tmp = (SELECT t 
         FROM tab1 
         WHERE a_id = :id1); 
     UPDATE tab1 
     SET target = (SELECT ROUND(@tmp/(SELECT COUNT(*) 
              FROM tab2 
              WHERE b_id = :id2))); 
     ';