[英]Why does my PHP transaction not work?
我正在为我的投资组合网站创建一个CMS项目。 我无法使更新功能正常工作。 我觉得它与我构建PDO事务的方式有关。 在我的数据库中,我有一个项目表,类别表和关联的content_category表。 我能够很好地将我的项目插入到这些表中。 我想要做的是插入我的项目表然后删除content_category表中的所有记录,最后将当前类别记录插入到该关联表中以完成事务。 我确实得到了返回声明“Project Updated”。 但表格没有更新。 任何人的想法?
这是代码:
这是我的Project类中的一个函数。
public function update(){
try {
$conn = getConnection();
$conn->beginTransaction();
$sql = "UPDATE project
SET project_title = :title,
project_description = :desc,
project_isFeatured = :feat,
project_mainImage = :image
WHERE project_id = :id";
$st = $conn->prepare($sql);
$st->bindValue(":id", $this->id, PDO::PARAM_INT);
$st->bindValue(":title", $this->title, PDO::PARAM_STR);
$st->bindValue(":desc", $this->description, PDO::PARAM_STR);
$st->bindValue(":feat", $this->isFeatured, PDO::PARAM_BOOL);
$st->bindValue(":image", $this->mainImage, PDO::PARAM_INT);
$st->execute();
$sql = "DELETE from content_category
WHERE content_id = :id";
$st = $conn->prepare($sql);
$st->bindValue("id", $this->id, PDO::PARAM_INT);
$st->execute();
$sql = "INSERT into content_category (content_id, cat_id)
VALUES (?,?)";
$st = $conn->prepare($sql);
foreach($this->categories as $key=>$value){
$st->execute(array(intval($projectID), intval($value)));
}
$conn->commit();
$conn = null;
return "Project updated";
}
catch(Exception $e) {
echo $e->getMessage();
$conn->rollBack();
return "Error... Unable to update!";
}
}
您的表的数据库引擎需要是INNODB。 如果您使用的是phpMyAdmin,则默认为MyISAM。 (我不知道这是否会导致更新不通过或只是忽略事务行。编辑:非常确定文档说它会抛出错误,如果你在myISAM上开始事务则不会做任何事情)
为了确保您没有遇到PDO错误,您应该像这样设置PDO错误报告:
$dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
PDO中有一些函数,例如prepare()
,它将返回false或抛出PDOException,具体取决于设置的错误模式。 这样,它会抛出一个异常,你肯定会知道你是否遇到了问题!
此外,如果您的数据库不支持事务(如MyISAM),则beginTransaction()
函数将返回false。 所以,也许在那里添加一个支票,如:
if($conn->beginTransaction()) {
// Do transaction here
} else {
echo("Unable to use transactions with this database.");
}
奇怪的是,根据PHP文档 ,如果您的数据库不支持事务,您将获得异常...
不幸的是,并非每个数据库都支持事务,因此当您第一次打开连接时,PDO需要以所谓的“自动提交”模式运行。 自动提交模式意味着您运行的每个查询都有自己的隐式事务(如果数据库支持它),或者如果数据库不支持事务则没有事务。 如果需要事务,则必须使用PDO :: beginTransaction()方法来启动事务。 如果底层驱动程序不支持事务,则抛出PDOException(无论您的错误处理设置如何:这始终是一个严重的错误条件) 。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.