2013-01-03 80 views
0

这里是我的PHP脚本的一大块必须缺少的东西:与PDO多种问题插入

$startIndex = 7; 
$endIndex = 303; 
$defaults = range($startIndex, $endIndex); 

$sql = "INSERT INTO items (itemId, userId) VALUES "; 
$part = array_fill(0, count($defaults), "(?, ?)"); 
$sql .= implode(",", $part); 
try { 
    $db = DB::getInstance(); 
    $stmt = $db->dbh->prepare($sql); 
    $i = 1; 
    foreach($defaults as $default) { 
    $stmt->bindParam($i++, $default); 
    $stmt->bindparam($i++, $userId); 
    } 
    if ($stmt->execute()) { 
    echo "result=ok"; 
    }else { 
    echo 'invalid query'; 
    } 

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

的多个插入正在发生的一切似乎不错,除了所有条目标识字段都进来为303 ($ defaults数组中的最后一个元素)。 foreach循环似乎正在按照我的预期工作,因为echo $ default会给出我期望的整数序列。因此,它必须是一个问题,结合

请帮助:)

回答

1

这里发生的是你绑定的参数设置为$default变量,而不是它的价值。

$default的值随循环$defaults阵列而变化。绑定参数使用引用,而不是副本。

你可以改变你的循环和绑定参数引用数组项:

foreach($defaults as $key => $default) { 
    $stmt->bindParam($i++, $defaults[$key]); 
    $stmt->bindparam($i++, $userId); 
} 
+0

我想我失去了一些东西愚蠢,tyvm :) – Helto

1

bindParam需要一个参考。它将变量而不是值绑定到语句。

foreach($defaults as &$default) {   //pass $default as a reference (&) 
    $stmt->bindParam($i++, $default);  // bind the variable to the statement 
} 

或按值传递和使用bindValue代替bindParam:

您可以通过引用传递解决问题

foreach($defaults as &$default) { 
    $stmt->bindValue($i++, $default);  // bind the value to the statement 
}