我的网站上有一个文件上传功能,它在帖子提交后立即执行。
唯一的问题是,如果在提交帖子后上传文件时出现错误,例如文件太大,那么帖子仍然会被提交。
目前,如果文件上传失败,我必须删除插入的帖子,但我认为可能有更好的解决方案。
代码看起来像这样:
$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
}
通过这种方式,您可以绝对保证在绝对没有错误的情况下将您的东西插入到表中,这样就根本不需要其他查询了。