Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/70.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 在事务处理期间,是否可以对同一个表使用两次删除查询?_Php_Mysql - Fatal编程技术网

Php 在事务处理期间,是否可以对同一个表使用两次删除查询?

Php 在事务处理期间,是否可以对同一个表使用两次删除查询?,php,mysql,Php,Mysql,在事务处理过程中是否可以对同一个表使用两次删除查询? 我有两个数组想在提交之前删除同一个表,如果一个失败,希望可以使它回滚,但如果我使用下面2个删除查询一次,则会出现一些错误。我找不到哪里不对劲 $connect_db_x_article->beginTransaction(); // image if (!empty($data['gallery_old']['gallery_old_delete']['gallery_old_image_delete_id'])) {

在事务处理过程中是否可以对同一个表使用两次删除查询?
我有两个数组想在提交之前删除同一个表,如果一个失败,希望可以使它回滚,但如果我使用下面2个删除查询一次,则会出现一些错误。我找不到哪里不对劲

  $connect_db_x_article->beginTransaction();

  // image
  if (!empty($data['gallery_old']['gallery_old_delete']['gallery_old_image_delete_id'])) {
    for ($i=0; $i < count($data['gallery_old']['gallery_old_delete']['gallery_old_image_delete_id']); $i++) {
      $file_id = $data['gallery_old']['gallery_old_delete']['gallery_old_image_delete_id'][$i];

      $sql = "SELECT * FROM article_gallery WHERE id = :id";
      $stmt = $connect_db_article->prepare($sql);
      $stmt->bindValue(':id', $file_id);
      $stmt->execute();
      $row = $stmt->fetchAll(PDO::FETCH_ASSOC);

      $sql = "DELETE FROM article_gallery WHERE id = :id";
      $stmt = $connect_db_article->prepare($sql);
      $stmt->bindValue(':id', $row[0]['id']);
      $stmt->execute();

      $path = $_SERVER['DOCUMENT_ROOT'].$base_uri.'/assets/images';
      $folder_path = $path.'/'.$id;
      $file_path = $folder_path.'/'.$row[0]['file_name'].'.'.$row[0]['file_format'];
      if (is_file($file_path)) {
        unlink($file_path);
      }
    }
  }

  // video_embed
  if (!empty($data['gallery_old']['gallery_old_delete']['gallery_old_video_embed_delete_id'])) {
    for ($i=0; $i < count($data['gallery_old']['gallery_old_delete']['gallery_old_video_embed_delete_id']); $i++) {
      $file_id = $data['gallery_old']['gallery_old_delete']['gallery_old_video_embed_delete_id'][$i];

      $sql = "DELETE FROM article_gallery WHERE id = :id";
      $stmt = $connect_db_article->prepare($sql);
      $stmt->bindValue(':id', $file_id);
      $stmt->execute();
    }
  }

  $connect_db_article->commit();
$connect_db_x_article->beginTransaction();
//形象
如果(!empty($data['gallery\u old']['gallery\u old\u delete']['gallery\u old\u image\u delete\u id'])){
对于($i=0;$iprepare($sql);
$stmt->bindValue(':id',$file\u id);
$stmt->execute();
$row=$stmt->fetchAll(PDO::FETCH_ASSOC);
$sql=“从文章库中删除,其中id=:id”;
$stmt=$connect\u db\u article->prepare($sql);
$stmt->bindValue(':id',$row[0]['id']);
$stmt->execute();
$path=$\u服务器['DOCUMENT\u ROOT'].$base\u uri.'/assets/images';
$folder_path=$path.'/'.$id;
$file\u path=$folder\u path.'/'.$row[0]['file\u name']...$row[0]['file\u format'];
if(is_file($file_path)){
取消链接($file\u path);
}
}
}
//视频嵌入
如果(!empty($data['gallery\u old']['gallery\u old\u delete']['gallery\u old\u video\u embed\u delete\u id'])){
对于($i=0;$iprepare($sql);
$stmt->bindValue(':id',$file\u id);
$stmt->execute();
}
}
$connect_db_article->commit();

你可以做任何你想做的事情,包括删除两次。或者说是一万次。事务只保证您的查询要么全部执行并存储到硬盘,要么在任何查询失败时都不执行。因此,你是安全的。至于你的代码,它是次优的。准备好的语句准备一次,执行多次。为什么要准备三次相同的delete语句?只需为
id
提供一个不同的参数并执行它。感谢回复和说明!!