【问题标题】:PDO Prepare with bindParam doesn't work使用 bindParam 进行 PDO 准备不起作用
【发布时间】:2013-05-11 14:34:39
【问题描述】:

xampp 安装中的 PHP 5.4.7,MySQL 5.5.27 - 我整天都在努力让各种 UPDATE 语句正常工作,但无济于事。阅读并尝试了来自http://wiki.hashphp.org/PDO_Tutorial_for_MySQL_Developers 的示例,并放弃了一次更新(找到了替代解决方案),但我想知道下面的这个有什么问题。顺便说一句,我所有其他 PDO FETCHALL 查询都可以正常工作...

function updateThisMemberInterests($PDOdbObject, $memberId, $interests)
{
try
{
    $intId = 0;
    $upInt = $connectionObject->prepare("UPDATE `member_interest` SET (`interest_id`) VALUES (:intId)");
    $upInt->bindParam(':intId', $intId, PDO::PARAM_INT);
    foreach($interests as $intId)
    {
        $upInt->execute();
    }
    $affected_rows = $upInt->rowCount();
    return $affected_rows;
}
catch (PDOException $e)
{
    echo "There was a problem connecting to this database.";
    $e->getMessage();
}
}

我的数据库设置函数指定: PDO::ATTR_EMULATE_PREPARES => 假, PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION

但除了我在 Catch 中回显的消息外,我什么也没得到。

一定是错误地解释了教程的说明 - 谁能告诉我它是什么?

【问题讨论】:

  • 我很确定 rowCount() 仅适用于最近的 execute(),因此在循环之后调用它不会为您提供正确的信息。
  • 无论如何,你的问题是你的函数接受$PDOdbObject,但你在函数体中调用$connectionObject。打开error_reportingdisplay_errors,你会看到在非对象上调用成员函数prepare()
  • 关于 rowCount() - 注意,谢谢。关于 $PDOdbObject,这是它在我的数据层文件中的名称。在我多次尝试弄清楚发生了什么时,我将整个函数移到了调用文件中——所以我的错误是,我用 caling var 名称发布了这个函数。实际上,它们都是数据层文件中的 $PDOdbObject。所以不是那样...
  • 您还需要回显异常消息,现在您只是丢弃它的输出。这应该告诉你一些有用的东西......echo $e->getMessge();
  • Michael - 感谢您提供错误报告信息!呃!有一个新的 IDE,它还没有正确设置。这使得发现问题变得更加容易:D。

标签: pdo transactions


【解决方案1】:

好的 - 由于打开了错误处理,我发现了几个问题,特别是我混合了 INSERT 和 UPDATE 语法。最后,我通过删除现有利益并插入新利益的交易解决了这个问题。这很好用。

这是我的代码:

function updateThisMemberInterests($PDOdbObject, $memberId, $interests)
{
if ($interests != 0)
{
    try
    {
        //begin transaction
        $PDOdbObject->beginTransaction();

        $delInts = "DELETE FROM `member_interest` WHERE `member_id` = $memberId";
        $PDOdbObject->exec($delInts);

        $intId = 0;
        $upInt = $PDOdbObject->prepare(  "INSERT INTO member_interest (`member_id`,`interest_id`) VALUES ($memberId, :interest_id)" );
        $upInt->bindParam(':interest_id', $intId, PDO::PARAM_INT);
        foreach($interests as $intId)
        {
            $upInt->execute();
        }
        //commit
        $PDOdbObject->commit();
        $affected_rows = $upInt->rowCount();
        return $affected_rows;
    }
    catch (PDOException $e)
    {
        echo "There was a problem - rolling back this transaction.";
        //rollback transaction
        $PDOdbObject->rollBack();
        echo $e->getMessage();
    }
}//more than zero interests changed
}

【讨论】:

    猜你喜欢
    • 2011-11-10
    • 2021-08-15
    • 1970-01-01
    • 1970-01-01
    • 2016-11-19
    • 2013-11-05
    • 2013-06-04
    • 2013-06-15
    相关资源
    最近更新 更多