PHP - 检查文件上传时的不同文件名

时间:2013-12-13 20:18:48

标签: php html mysql

我是PHP的新手。我不想提问,因为我确信这是在某处记录的,但在看了一会后,我似乎无法把两个和两个放在一起。

我有一个程序可以将多个图像上传到数据库中的项目。基本上,对于数据库中的每个项目,可能会有多个图像上传。

实施例:

  • 项目:Xbox 360


图像:

  • Xbox360.jpg
  • side.jpg
  • front.jpg

图像和项目信息都存储在数据库(MySQL)中,但图像存储在文件系统中,数据库指向文件系统中图像的URL。

我遇到的问题是一切都按预期工作,除了它允许将重复的图像名称写入数据库。它不允许将重复的图像写入文件系统,我很满意。我想确保图像的名称只添加一次到数据库。如果映像名称与另一个映像名称重复,则不需要写入数据库。

add_db.php:

$uniqueDir = uniqid();
$directory = "img/$uniqueDir/";

db_addItem($id_category, $name, $cost, $description, $qty, $directory); //Adds to the `items` table

foreach ($_FILES['i_file']['name'] as $filename) { 
    if ($filename != '' && $filename != 'No file chosen') {
        //I think above is where I check for unique image names
        $url = "img/$uniqueDir/$filename";
        db_addImg($url, $filename); //Adds to the `img` table
        $item_picsID = get_item_PicsID($filename, $url);
        $itemID = get_itemID($directory);
        db_insertImg($itemID, $item_picsID);
    }
}
addFilesystem($directory); //Writes image(s) to filesystem

function db_addImg($url, $filename) {
    include 'mysql_login_pdo.php';

    // Create the SQL query
    $query = "INSERT INTO img (`name`, `url`) VALUES(:filename, :url)";

    $stmt = $db->prepare($query);
    $stmt->execute(array(
        ':filename' => $filename,
        ':url' => $url
    ));
}

function db_insertImg($itemID, $item_picsID) {
    include 'mysql_login_pdo.php';

    // Create the SQL query
    $query = "INSERT INTO `item_pics` (`item_id`, `img_id`) VALUES(:itemID, :item_picsID)";

    $stmt = $db->prepare($query);
    $stmt->execute(array(
        ':itemID' => $itemID,
        ':item_picsID' => $item_picsID
    ));
    $db = null;
    return;
}

一切正常,但它会将重复的图像名称写入数据库。我希望图像名称是不同的。我也不想重命名图像(如果可能的话)。

3 个答案:

答案 0 :(得分:0)

我会根据img表中的主键使用文件名,因为你保证它是唯一的。

否则,您需要使用某种类型的散列猜测一个唯一的文件名,然后检查文件系统。所有这些都可能是昂贵的操作。

看起来您正在使用PDO,因此静态方法lastInsertId将获取最后一个插入ID(主键)。

例如:

// after your insert to img
$filename = 'img' . $db->lastInsertId() . $extension;

这需要稍微更改img表。但是你最好在这个表中存储元数据(文件类型,大小等)而不是文件位置(因为它可以改变)。

答案 1 :(得分:0)

我认为最好使用hash的{​​{1}}值作为url。因为字符串搜索比primary key要慢得多。

答案 2 :(得分:0)

您可以在UNIQUE表的name列中定义img索引,然后在INSERT函数中使用稍加修改的db_addImg语句:< / p>

function db_addImg($url, $filename) {
    //...
    $query = "INSERT INGORE INTO img (`name`, `url`) VALUES(:filename, :url)";
    //...
}

它将悄然取消任何UNIQUE密钥冲突的插入,这将在img表中以不同的文件名结束。