我无法获得准备好的语句UPDATE以循环迭代

时间:2012-07-17 21:02:14

标签: php mysqli prepared-statement

我把它放在一个循环中的原因是因为我想为指定月份的每一天添加特定数据,因此循环运行'n'次,其中n是一个月中的天数。继承我的代码:     $ i = 0;

    while ($i < $loop_count) {

        $day_prefix = $i + 1;
        if (strlen($day_prefix) == 1) {
            $day_prefix = "0" . $day_prefix; //this gives 2012-01-01 through to 2012-01-31
        }

        if ($stmt = $sql_con->prepare("UPDATE DailyBudget SET amount = ? 
                                            WHERE date=?, code=?")) {
            $stmt->bind_param('isi', $budget_daily, $date_iterator . $day_prefix, $code);
            $stmt->execute();
            $stmt->close();

        }else
            echo "fail! </br>";

        $i++;
    }
$sql_con->close();        
}

我花了更多的时间来试图解决这个问题,所以非常感谢一些帮助!

提前致谢。

3 个答案:

答案 0 :(得分:1)

您似乎应该使用bind_value而不是bind_param,因为您可以动态创建值并为每个插入准备语句。对于bind_param,您应该尝试类似

的内容
$i = 0;
$stmt = $sql_con->prepare("UPDATE DailyBudget SET amount = ? WHERE date=?, code=?");
$stmt->bind_param('isi', $budget_daily, $date_iterator_prefix, $code);
while ($i < $loop_count) {
    $day_prefix = $i + 1;
    if (strlen($day_prefix) == 1) {
        $day_prefix = "0" . $day_prefix; //this gives 2012-01-01 through to 2012-01-31
    }
    $date_iterator_prefix = $date_iterator . $day_prefix;
    $stmt->execute();

    $i++;
}
$stmt->close();               
$sql_con->close();        

答案 1 :(得分:1)

我认为您的主要问题在于where conditionwhere condition是一个表达式,对于要更新的​​每一行,其计算结果为true。作为expression,组件/子条件必须通过逻辑运算符组合在where条件中。换句话说,在where子句/ condition中使用AND而不是逗号(,

考虑将代码更改为更像这样:

if ($stmt = $sql_con->prepare('UPDATE DailyBudget SET amount = ? WHERE date=? AND code=?')) {
    $year = 2012;
    $month = 1;
    $days_in_month = (int) date('d',(mktime(0,0,0,$month+1,1,$year)-86400));
    $day = 1;
    while ($day <= $days_in_month) {

        $budget_daily = 15.75 - .25 * $day;
        $code = 1;

        $date = $year.'-'.str_pad($month,2,0,STR_PAD_LEFT).'-'.str_pad($day,2,0,STR_PAD_LEFT);
        $stmt->bind_param('dsi', $budget_daily, $date, $code); 
        $stmt->execute();

        $day++; 
    }   
    $stmt->close();
}
else echo 'WARNING: There was an error with the prepare: '.$sql_con->error."\n";
$sql_con->close();

答案 2 :(得分:0)

实际上,准备好的陈述的好处是它准备了一次并且执行了很多次。

因此,您必须在循环之前进行准备。

$sth = $dbh->prepare('UPDATE DailyBudget SET amount = ? WHERE date=?, code=?"');
while($i < $loop_count) {
    $sth->execute(array($budget_daily, $date_iterator.$day_prefix, $code));
}