美好的一天,在这里,我有一个页面存储数据,其中包含一些图像,确切地说是3个图像,
<?php
$brg = $_POST['id'];
$nama = $_POST['nm'];
$img = $_FILES['img']['name'];
$tmp = $_FILES['img']['tmp_name'];
$img1 = $_FILES['img1']['name'];
$tmp1 = $_FILES['img1']['tmp_name'];
$img2 = $_FILES['img2']['name'];
$tmp2 = $_FILES['img2']['tmp_name'];
$temp = explode(".", $img);
$temp1 = explode(".", $img1);
$temp2 = explode(".", $img2);
$new = round(microtime(true)) . '.' . end($temp);
$new1 = round(microtime(true)) . '.' . end($temp1);
$new2 = round(microtime(true)) . '.' . end($temp2);
$path = "img/photo/".$new;
$path1 = "img/photo/".$new1;
$path2 = "img/photo/".$new2;
move_uploaded_file($tmp, $path);
move_uploaded_file($tmp1, $path1);
move_uploaded_file($tmp2, $path2);
$c = "insert into imgstuff values('$brg','$nama','$new','$new1','$new2');";
$ins=mysqli_query($con,$c);
if($ins){
header('location: test.php?success='.base64_encode('success'));
} else {
header('location: test.php?error='.base64_encode('failed'));
}
?>
上面的代码工作得很完美但是你可以看到它最终非常丑陋并且为三张图片生成相同的文件名,
我的问题,有没有办法让我的代码更清洁,更容易维护我的命名文件方法有什么问题?
答案 0 :(得分:1)
也许
round(microtime(true)) . '.' . end($temp);
返回相同的东西,因为它几乎在同一时间完成。你可以试试像uuid甚至是简单的功能,如
function getUniqFileName($end) {
$token = md5(sha1(rand()));
return sprintf($token%s, $end);
}
然后在你的代码中
$new = getUniqFileName(end($temp));
那会很快给你一点名字吗?
(编辑:删除了在这种情况下无用的回合)
答案 1 :(得分:0)
我很想使用一个循环,这样你就不会不必要地重复代码,并且明确地使用prepared statements
来避免来自sql injection attacks
对于new image
名称 - 有许多方法可以实现一个新的,唯一的名称 - 这里的方法不一定是唯一的,但它至少包含原始文件名,所以他们应该是三个独特的图像。以下都没有经过测试,但它可能会给你一些想法。
<?php
if( isset( $_POST['id'], $_POST['nm'] ){
$files=array();
$sql='insert into `imgstuff` values (?,?,?,?,?)';
$stmt=$con->prepare( $sql );
if( $stmt ){
for( $i=0; $i < 3; $i++ ){
$obj = $i==0 ? (object)$_FILES[ 'img' ] : (object)$_FILES[ 'img' . $i ];
$tmp=$obj->tmp_name;
$name=$obj->name;
$ext = pathinfo( $name,PATHINFO_EXTENSION );
$new = round( microtime( true ) ) . '_' . $name . '.' . $ext;
$path = "img/photo/$new";
$status = is_uploaded_file( $tmp ) & move_uploaded_file( $tmp, $path );
if( $status ) $files[] = $path;
}
if( count( $files )==count( $imgs ) ){
$brg = $_POST['id'];
$nama = $_POST['nm'];
$stmt->bind_param( 'issss', $brg, $nama, $files[0], $files[1], $files[2] );
$stmt->execute();
$rows=$stmt->affected_rows;
$message=$rows!=0 ? 'success' : 'failed';
header('location: test.php?success=' . base64_encode( $message ) );
}
}
}
?>