2014-08-29 28 views
0

我需要幫助在PDO中一次更新多行。爲此,我使用UPDATE SET CASE WHEN,但我在將值綁定到位置佔位符時非常困惑。假設我$_POST內容是這樣的:當在PDO中使用大小寫更新多行時,參數號無效

$ _ POST [ 「TID」]:

Array 
(
    [0] => 383 
    [1] => 386 
) 

$ _ POST [ 「時代」]:

Array 
(
    [0] => 45 
    [1] => 30 
) 

然後$ SQL應該是:

UPDATE `person` SET age = CASE 
WHEN user_id = ? AND tid = ? THEN ? 
WHEN user_id = ? AND tid = ? THEN ? 
ELSE `age` END 

下面的代碼給我這個錯誤

[HY093]: Invalid parameter number: number of bound variables does not match number of tokens 

我期待產生這樣的正確的號碼綁定變量:

$users->bindValue(1, $_SESSION["user_id"]); 
$users->bindValue(2, 383); 
$users->bindValue(3, 45); 
$users->bindValue(4, $_SESSION["user_id"]); 
$users->bindValue(5, 386); 
$users->bindValue(6, 30); 

這有什麼錯用下面的代碼?

try 
{ 
    $dbh = new PDO("mysql:host=$hostname;dbname=$databasename", $username, $password); 
    $dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 
    $tid = $_POST["tid"]; 
    $age = $_POST["age"]; 
    $count = count($tid); 

    for($i=0;$i<$count;$i++) 
    { 
     $wa .= " WHEN user_id = ? AND tid = ? THEN ?";    
    } 

    $sql = "UPDATE `person` SET `age` = CASE $wa ELSE `age` END"; 

    $users = $dbh->prepare($sql); 

    for($i=1;$i<$count;$i+=3) 
    {  
     $users->bindValue($i, $_SESSION["user_id"]); 
    } 

    $j = 2; 
    foreach($tid as $t) 
    { 
     $users->bindValue($j, $t); 
     $j+=3; 
    } 
    $k = 3; 
    foreach($age as $a) 
    { 
     $users->bindValue($k, $a); 
     $k+=3; 
    } 

    $users->execute();   
    $dbh = null; 

} 
catch(PDOException $e) 
{ 
    echo $e->getMessage(); 
} 
+0

確實沒有「的foreach」工作方式的代碼? – Bulat 2014-08-29 09:58:13

回答

1

你的第一個循環是錯誤的。最終的測試沒有考慮的事實,你被3

for($i=1;$i<$count*3;$i+=3) 
    {  
     $users->bindValue($i, $_SESSION["user_id"]); 
    } 

遞增或者你可以在一個循環做的一切:

for($i=0;$i<$count;$i++) 
    {  
     $users->bindValue(3*$i+1, $_SESSION["user_id"]); 
     $users->bindValue(3*$i+2, $tid[$i]); 
     $users->bindValue(3*$i+3, $age[$i]); 
    } 
相關問題