bindParam与foreach奇怪的结果

时间:2014-11-18 13:02:53

标签: php mysql

使用以下命令将几个参数动态绑定到语句:

$dbh = new PDO("mysql:host=localhost;dbname=name", USER, PASSWORD);

$params = array(':date' => '2014-02-01',
                ':amount' => 40,
                ':type' => 1
                );

$query = "INSERT INTO entry (`date`, amount, type) VALUES (:date, :amount, :type)";
$stmt = $dbh->prepare($query);

foreach ($params as $param => $value) {
    $stmt->bindParam($param, $value);
}

$stmt->execute()

代码可以工作,但会将以下内容插入表中: 0000-00-00,1.00,1

这里发生了什么?

2 个答案:

答案 0 :(得分:1)

您错过了data type

PDOStatement::bindParam的正确格式应该是这样的

$sth->bindParam(':calories', $calories, PDO::PARAM_INT); //note PDO::PARAM_INT here 

EG,

$sql = "INSERT INTO movies(filmName,
            filmDescription,
            filmImage,
            filmPrice,
            filmReview) VALUES (
            :filmName,
            :filmDescription,
            :filmImage,
            :filmPrice,
            :filmReview)";

$stmt = $pdo->prepare($sql);

$stmt->bindParam(':filmName', $_POST['filmName'], PDO::PARAM_STR);      
$stmt->bindParam(':filmDescription', $_POST['filmDescription'], PDO::PARAM_STR);
$stmt->bindParam(':filmImage', $_POST['filmImage'], PDO::PARAM_STR);
// use PARAM_STR although a number 
$stmt->bindParam(':filmPrice', $_POST['filmPrice'], PDO::PARAM_STR);
$stmt->bindParam(':filmReview', $_POST['filmReview'], PDO::PARAM_STR);  

$stmt->execute(); 

REFERENCE

REFERENCE 2

答案 1 :(得分:1)

根据Vili对php.net的评论使用foreach ($params as $param => &$value)代替foreach ($params as $param => $value)

为动态添加的查询参数添加变量类型需要一些额外的步骤。

顺便说一句。您至少在示例代码中没有动态定义$params数组,因此这也可能有效。将整个foreach替换为:

$result = $stmt->execute($params);