Php 如何在mysql数据库中上传并保存路径之前重命名文件(唯一名称)

Php 如何在mysql数据库中上传并保存路径之前重命名文件(唯一名称),php,mysql,Php,Mysql,我是PHP新手,面临着很大的困难。 问题: 1.如何为要上载的文件指定唯一名称。 2.如何在数据库中保存路径 我上传文件并在数据库中保存一些信息的代码是: <?php $target = "images/"; $target = $target . basename( $_FILES['photo']['name']); $name=$_POST['name']; $email=$_POST['email']; $phone=$_POST['phone']

我是PHP新手,面临着很大的困难。 问题: 1.如何为要上载的文件指定唯一名称。 2.如何在数据库中保存路径

我上传文件并在数据库中保存一些信息的代码是:

<?php   
    $target = "images/";  $target = $target . basename( $_FILES['photo']['name']);   
    $name=$_POST['name'];  $email=$_POST['email'];  $phone=$_POST['phone'];  $pic=($_FILES['photo']['name']);   

    mysql_connect("localhost", "admin", "admin") or die(mysql_error()) ; 
    mysql_select_db ("database") or die(mysql_error()) ;   

    mysql_query("INSERT INTO `applicants` VALUES ('$name', '$email', '$phone', '$pic')") ;

    if(move_uploaded_file($_FILES['photo']['tmp_name'], $target))
    {   
        echo "Your application ". basename( $_FILES['uploadedfile']['name']). " has been uploaded, and your information has been saved";  
    }

    else {   
        echo "Sorry, there was a problem uploading your resume.";
    }
    ?>

生成随机数/字符串,然后使用廉价算法对其进行散列的技术是一种很好的做法,但您需要检查这是否确实是唯一的值:

首先生成一个随机的东西,并使用廉价算法对其进行散列,例如:
md5

$filename = md5(rand() . substr(str_shuffle("0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"), 0, 30) . rand());
尽管一开始这看起来完全是随机的,但MD5实际上并没有太大的碰撞率。因此,我建议确保此文件不存在。在这种情况下,循环可能是好的:

for ($i = 0; $i < 1000; $i++) {
    # Attempt to generate a unique filename
    $filename = md5(rand() . substr(str_shuffle("0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"), 0, 30) . rand());

    # We don't have to keep trying if this file does not exist
    if (!file_exists("files/$filename.txt")) break;
}
($i=0;$i<1000;$i++)的
{
#尝试生成唯一的文件名
$filename=md5(rand().substr(str_shuffle(“0123456789abcdefghijklmnopqrstuvxyzabcdefghijklmnopqrstuvxyz”)、0,30).rand();
#如果此文件不存在,我们不必继续尝试
如果(!file_存在(“files/$filename.txt”))中断;
}
现在,您可以继续执行任何需要的操作(例如:将此路径插入数据库)。

1)有许多不同的方法为文件指定唯一的名称。您可以生成一个看起来很糟糕的guid,或者可以使用Daan提到的类似此方法:
md5(microtime().date('d-m-Y H:i:s')。$\u FILES['file']['name'])


2) 只需将路径的值存储到变量中,并使用简单的sql插入将其放入数据库中即可。如果你想要更多的细节,你需要发布你的代码。

md5(microtime().date('d-m-Y H:i:s')。$\u文件['file']['name'])是唯一的。请花一分钟重新编写您的问题,包括代码并描述“给出唯一名称”的含义,这样我们就不会试图读懂您的想法。@Daan-它不是唯一的。此外,出于对其中任何内容的热爱,不要链接w3schools——这是最糟糕的在线资源,它只会教给人们错误的东西。@N.B.技术上是正确的。@voidmain不鼓励使用w3schools。尽管对初学者来说可能简单明了,但如果你将来的工作完全基于该网站的信息,这是不准确的,甚至是危险的。尽管你的答案会让大多数用户满意,但实现唯一性或随机性的方法并不是人们应该从你那里复制的。我们有一种生成唯一文件名的方法,称为
tempnam
,它将生成唯一的临时名称。无论采用何种方式,都可以对其进行进一步的散列,但使用md5和rand()不应作为生成看似随机的数据的最终答案。然而,我怀疑即使在高度并发的环境中,您的方法也会引起冲突。我现在遇到了一个新问题。我可以上传具有唯一名称的文件,但现在我无法在数据库中保存任何数据。我肯定我做错了什么事。你能帮我找出错误吗。