我是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;
}
一切正常,只是它会将重复的图像名称写入数据库。我希望图像名称不同。我也不想重命名图像(如果可能的话)。
您可以在img
表中的name
列上定义UNIQUE
索引,然后在db_addImg
函数中使用稍微修改过的INSERT
语句:
function db_addImg($url, $filename) {
//...
$query = "INSERT INGORE INTO img (`name`, `url`) VALUES(:filename, :url)";
//...
}
它将悄悄地取消任何UNIQUE
密钥冲突的插入,这将在img
表中以不同的文件名结束。
我会使用一个基于img
表主键的文件名,因为你可以保证它是唯一的。
否则,您需要通过某种类型的哈希猜测一个唯一的文件名,然后检查文件系统。所有这些都可能是昂贵的操作。
看起来您正在使用PDO,所以静态方法lastInsertId
将获得最后一个插入id(主键)。
例如:
// after your insert to img
$filename = 'img' . $db->lastInsertId() . $extension;
这将需要稍微更改img
表。但是,最好将元数据(文件类型、大小等)存储在这个表中,而不是文件位置(因为这可能会改变)。
我认为最好使用url
的hash
值作为primary key
。因为字符串搜索比int
慢得多。