PDO在循环中准备语句

时间:2013-08-24 12:43:08

标签: php mysql sql pdo

这很简单,但出于某种原因,我很难用它。 基本上,我做一个select语句来查找结果。我遍历该结果并更新我在结果中找到的项目。

这是我的代码:

$pdo->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);

$stmt = $pdo->prepare("select * from licenses where email='empty' limit $quantity");
$stmt->execute();
$row = $stmt->fetchAll(PDO::FETCH_ASSOC);


if ($stmt->rowCount() > 0)
{
    $stmt = $pdo->prepare("update licenses set email=:em, exp_date=:exp where 'id'=:id");

    foreach ($row as $row)
    {
        $expires = date("Y-m-d", strtotime('+365 days'));
        $license = $row['license_key'];
        $lid = $row['id'];

        echo $license . '<br> ID:' . $lid;

        $stmt->bindValue(':em', $email1, PDO::PARAM_STR);
        $stmt->bindValue(':exp', $expires, PDO::PARAM_STR);
        $stmt->bindValue(':id', $lid, PDO::PARAM_INT);

        $stmt->execute();
    }

此代码工作,它在工作状态下更新我的数据库。但是,该网站返回504错误,并且不会显示许可证的输出。有谁知道这段代码有什么问题,或者我怎样才能完成我的目标?

**编辑:当我使用fiddler时,我收到此错误: [Fiddler] ReadResponse()失败:服务器没有为此请求返回响应。

2 个答案:

答案 0 :(得分:3)

将变量名称$row更改为$rows

$rows = $stmt->fetchAll(PDO::FETCH_ASSOC); // change variable $row to $rows
foreach ($rows as $row) {
  // Your Code
}

答案 1 :(得分:3)

好吧,我不敢相信我们都错过了这个。在更新查询中,您在where子句中使用表达式'id'=:id。这实际上意味着,如果你的$ id是15 - &gt; 'id'!= 15并且查询永远不会更新表中的任何值。删除id周围的引号:

$stmt = $pdo->prepare("update licenses 
            set email=:em, exp_date=:exp where id=:id");