我正在使用最简单的图像上传方式,我非常希望保持这种方式,只需要一些PHP。
代码看起来像这样
<form action="index.php" method="POST" enctype="multipart/form-data">
<input type="file" name="image">
<input type="submit" value="Upload image">
</form>
<?php
$image = addslashes(file_get_contents($_FILES['image'][tmp_name]));
mysql_query("INSERT INTO store_images VALUES ('','$image')");
?>
我选择一张图片,上传并点击刷新一次/两次。当我查看表“store_images”时,图像已上传两次/三次/等。
如何在不破坏上传其他图片的选项的情况下避免这种情况?
答案 0 :(得分:3)
首先:
请停止使用古老的mysql_*
函数编写新代码。它们已不再维护,社区已经开始deprecation process。相反,您应该了解prepared statements并使用PDO或MySQLi。如果您无法决定,this article将有助于选择。如果您想学习,here is a quite good PDO-related tutorial。
现在为您解决问题:
成功上传图片header('Location: http://example.com/the/address')
后,您应该进行重定向。这甚至可以是同一页面。因为您进行了重定向,所以数据不再出现在页面上,也不会再插入。
答案 1 :(得分:2)
使用表单生成随机数,散列或类似内容,并将其与图像一起插入数据库。在插入之前检查数据库是否存在现有哈希值。
答案 2 :(得分:0)
首先在db中检查$image
的值,仅当它不存在时,才能上传/插入
答案 3 :(得分:-1)
如果您希望表中没有文件重复(这是可取的),那么创建一个md5 hash of the file并将其存储在包含该文件的列中,并使md5列唯一。
如果您确实需要在表格中复制文件,那么请执行与上面完全相同的操作,只使md5列和文件名唯一。这应该允许不同的用户使用不同的名称再次插入相同的图片。
如果您希望允许具有相同名称的文件副本,请执行@jimpic建议的操作。这应该允许您或任何其他用户使用相同的文件名插入同一文件的副本,但仅限于您故意这样做。
每次插入后都不要重定向到其他页面。如果可以的话,最好不要制动正常的浏览器后退/前进功能。对于用户来说,感觉就像一个页面刷新,实际上对于浏览器他们会表现得像2并且烦人,因为后退按钮会询问“你想要重新发送表单数据”。