欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  后端开发

PDO->exec()修改数据时若数据未改变,将修改失败。

程序员文章站 2022-04-11 21:28:07
...
PDO->exec()修改数据时若数据未改变,将修改失败。返回是0,而我用改回的0来判断数据是否修改在功,但问题来了,当我用事务同处理多个表时,有的表会修改数据,而有的表则不会被修改。其中一个表的数据未被改动的话就会导至整个事务失败而执行抛出异常语句,导致回滚修改失败。有什么办法能解决这个问题?

	try {		$DB->BeginTransaction();	//事务开始		$updateNews=$DB->Update(DBI('Prefix').'news',$arrNews,'ID',$ID);		if($updateNews!==FALSE){			echo '
新闻标题表修改成功。'; }else{ throw new PDOException('异常:新闻标题表修改失败。'); //抛出异常 } $updateConnent=$DB->Update(DBI('Prefix').'newsconnent',$arrConnent,'NewsID',$ID); if($updateConnent!==FALSE){ echo '
新闻内容表修改成功。'; }else{ throw new PDOException('异常:新闻内容表修改失败。'); //抛出异常 } $DB->Commit(); //成功,提交。 } catch (PDOException $e) { echo '编辑失败:'.$e->getMessage(); $DB->Rollback(); //失败,回滚 }


回复讨论(解决方案)

PDO::exec() 执行 update 时返回 0 的原因有:
1、不存在指定条件的记录
2、被修改字段的内容与待修改的内容相同
PDO::exec() 返回 false 的原因是:sql 指令时错误的

不知道你的 $DB->Update 是怎么写的,为什么会判断 $updateNews!==FALSE

你给出的代码是同时修改 标题 和 内容,但事实上这种情况时极少出现的

PDO::exec() 执行 update 时返回 0 的原因有:
1、不存在指定条件的记录
2、被修改字段的内容与待修改的内容相同
PDO::exec() 返回 false 的原因是:sql 指令时错误的

不知道你的 $DB->Update 是怎么写的,为什么会判断 $updateNews!==FALSE

你给出的代码是同时修改 标题 和 内容,但事实上这种情况时极少出现的



PDO::exec() 执行 update 时返回 0 的原因有:
1、不存在指定条件的记录
2、被修改字段的内容与待修改的内容相同
PDO::exec() 返回 false 的原因是:sql 指令时错误的

不知道你的 $DB->Update 是怎么写的,为什么会判断 $updateNews!==FALSE

你给出的代码是同时修改 标题 和 内容,但事实上这种情况时极少出现的



内容和标题是分表的,以前用mysqli时似乎没有这样的问题。这次想用事务来处理存储修改两个表。
封装的$DB->Update()方法里当exec()返回0的时候,将被认为是修改失败,$DB->Update()返回的就是FALSE,否则返回的是影响条数。在处理单表的时候,这似乎没什么问题,因为数据表肯定要修改,但作为事务的时候,发现如果其中一表未被修改,也就是返回了0,我封装的方法会被认为是修改失败的,就会抛出异常导至回滚。是不是这种情况不该用事务?但是我觉得这个问题不解决,似乎以后还会是问题。肯定有要修改的数据与源数据偶尔出现相同的时候。
目前用笨方法可以解决,就是在内容表和标题表中都加个时间字段,每次存储的时候都会更新这个LastTime时间。也就解决了存储失败的问题,但不知在程序上是否有更好的方法。

加上修改时间是对的,符合业务流程
但是,只修改标题或只修改内容也是经常发生的
其实标题与内容并没有强联系(实际是用 id 建立联系的)
所以修改不需要使用事务,插入和删除才需要使用事务

加上修改时间是对的,符合业务流程
但是,只修改标题或只修改内容也是经常发生的
其实标题与内容并没有强联系(实际是用 id 建立联系的)
所以修改不需要使用事务,插入和删除才需要使用事务



谢谢,非常感谢。