";准备“;SQL插入


"Prepare" SQL insert

我的网站上有一个文件上传功能,它在帖子提交后立即执行。

唯一的问题是,如果在提交帖子后上传文件时出现错误,例如文件太大,那么帖子仍然会被提交。

目前,如果文件上传失败,我必须删除插入的帖子,但我认为可能有更好的解决方案。

代码看起来像这样:

$query=$con->query('INSERT INTO `posts` (`user`,`comment`) VALUES("'.$user->id.'","'.$comment.'")'); //Submit post
$postID = $con->insert_id; //This variable is needed for the file upload
if (empty($error)){  //proceed with file upload
//.....
if (empty($error))
     $con->query('DELETE FROM `posts` WHERE `id` = "'.$postID.'" LIMIT 1'); //Delete post if file error
}else{
     $con->query('UPDATE `posts` SET `image` =".$imageID." WHERE `id` = "'.$postID.'" LIMIT 1'); //
}

根据您的用例,您可以在插入之前调用START TRANSACTION,成功时调用COMMIT,错误时调用ROLLBACK

正如Durbnpoisen所指出的,您应该检查您的查询是否存在SQL注入。

请参阅http://dev.mysql.com/doc/refman/5.6/en/commit.html以获取文档。

唯一的问题是,如果文件出现错误在帖子提交后上传,例如如果文件也是总的来说,该帖子仍将被提交。

是的,无论是否有错误,都会提交表格。这里更好的解决方案是把你的任务变成小任务。所以换句话说,一定要在表中写入一个图像路径,以防出现错误。

将这些单词转化为代码会产生这样的结果:

<?php
// If there were not errors during form submission
// As you might know 0 means there are absolutely no errors
if ($_FILES['field_name']['error']) == 0) {
  $db->insert(....);
  $id = $db->getLastId();
  $uploader->upload($_FILES, $id);
} else {
   // Just display errors and don't do anything here
}

通过这种方式,您可以绝对保证在绝对没有错误的情况下将您的东西插入到表中,这样就根本不需要其他查询了。