将数据库中的图像重命名为md5,但保留扩展名

时间:2012-11-10 01:37:44

标签: php mysql

正如标题所说我想要将存储在数据库中的图像名称更改为md5但是保留图像扩展名,我已经使用了下面的代码,但它失败了(可能是因为我没有我知道我在做什么)...关于如何实现目标的任何想法?

function get_file_extension($file_name) {
  return substr(strrchr($file_name,'.'),1);
}

$query  = "SELECT img FROM post";
$result = mysql_query($query);

 while($row = mysql_fetch_array($result)) {

   $name   = substr($row['img'], -4, 4);
   $ext    = get_file_extension($row['img']);
   $notmd5 = $row['img'];
   $md5img = md5($name).'.'.$ext;

 $q = "UPDATE post SET img='$md5img' WHERE img='{$notmd5}'";
 $r = mysql_query($q) or die(mysql_error());

}

............................................... ...........

更新

答案:

同时重命名目录/文件夹和数据库名称中的文件:

function get_file_extension($file_name) {
  return substr(strrchr($file_name,'.'),1);
}

//path to directory to scan
$directory = "thumbs/";
 $directory2 = "md5/";
//get all image files with a .jpg extension.
$images = glob($directory . "*.*");

//print each file name
foreach($images as $image)
{
$imag = str_replace($directory, '', $image);
$ex   = get_file_extension($imag);

$new = md5($imag).'.'.$ex;

rename($image, $directory2.$new);

 $q = "UPDATE post SET img='$new' WHERE img='{$imag}'";
 $r = mysql_query($q) or die(mysql_error());
}

当我最初问我的问题时,我已经在dir /文件夹中重命名了这些图像,但是我对它们进行了备份,因此将它们混合在一起并实现了我的目标:)

2 个答案:

答案 0 :(得分:0)

首先,我建议使用纯SQL来完成这样的批量更新,特别是如果业务逻辑就像这样简单,它可以在MySQL本地完成。

无论如何..,弹出的一件事是substr调用来获取文件的$name,它被硬编码只能获得4个字符而实际上它的扩展名不是名字。

请改为尝试:

$ext = get_file_extension($row['img']);  // get ext first

// use length of $row['img'] - length of file extension to extract name
substr($row['img'], 0, strlen($row['img']) - strlen($ext) - 1);

答案 1 :(得分:0)

只需在纯SQL中执行:

UPDATE post SET img = CONCAT_WS('.',
  MD5(TRIM(TRAILING CONCAT('.', SUBSTRING_INDEX(img, '.', -1)) FROM img)),
  SUBSTRING_INDEX(img, '.', -1)
)