图片上传PHP的问题


Issue with image uploading PHP

我正在尝试创建一个表单,用户可以在其中选择图像并设置他们的个人资料图片。在这之后,我想得到这个特定的信息,并在HTML中显示它。

我在profile.php中有以下代码;

if(isset($_POST['submit']) ){
    $fileName = $_FILES["avatar"]["name"];
    $fileTmpLoc = $_FILES["avatar"]["tmp_name"];
    $fileType = $_FILES["avatar"]["type"];
    $fileSize = $_FILES["avatar"]["size"];
    $fileErrorMsg = $_FILES["avatar"]["error"];
    $mysql->setUserAvatar($fileName, $fileTmpLoc, $fileType, $fileSize, $fileErrorMsg, $s_email);
}


我在mysql.php中有以下代码(此代码在一个类名mysql中):

function setUserAvatar($fileName, $fileTmpLoc, $fileType, $fileSize, $fileErrorMsg, $s_email){
    $kaboom = explode(".", $fileName);
    $fileExt = end($kaboom);
    list($width, $height) = getimagesize($fileTmpLoc);
    if($width < 10 || $height < 10){
        echo "Image is too small";
        exit(); 
    }
    $db_file_name = rand(100000000000,999999999999) . "." . $fileExt;
    echo $db_file_name;
    if($fileSize > 1048576) {
        echo "Image can't be larger than 1MB";
        exit(); 
    } else if (!preg_match("/'.(gif|jpg|png)$/i", $fileName) ) {
        echo "The file extension should be .gif, .jpg or .png";
        exit();
    } else if ($fileErrorMsg == 1) {
        echo "An unknown error occurred";
        exit();
    }
    $sql = "SELECT avatar FROM users WHERE email='$s_email' LIMIT 1";
    $query = mysqli_query($this->db, $sql);
    $row = mysqli_fetch_row($query);
    $avatar = $row[0];
    if($avatar != ""){
        $picurl = "../user/$s_email/$avatar"; 
        if (file_exists($picurl)) { unlink($picurl); }
    } 
    $moveResult = move_uploaded_file($fileTmpLoc, SITE_ROOT . "/../user/$s_email/". $db_file_name);
    if ($moveResult != true) {
        echo "File upload failed";
        exit();
    }
    $sql = "UPDATE users SET avatar='$db_file_name' WHERE email='$s_email' LIMIT 1";
    $query = mysqli_query($this->db, $sql);
}

完成后,我想做一些类似的事情:

<img src="user/" . $s_email . "/" . $data['avatar'] . " />

然而,当我试图从MySQL数据库访问avatar元素时,我总是得到相同的数字,即:2147483647(但在用户文件夹中,一切都很顺利)。因此,插入数据库的值出现了问题。有什么建议吗?这个问题可能是什么?

编辑:我已经通过减少随机数的长度来解决这个问题。然而,问题仍然是数据库中的值没有接收到扩展?avatar的列数据类型为VARCHAR

是这条线:

$db_file_name = rand(100000,999999) . "." . $fileExt;

是的,大多数随机数生成器的一个好特性是,除非你告诉他们不要这样做,否则它们会产生可重复的结果。

在PHP的情况下,您告诉它不要使用srand()在同一个位置启动

您的数字太大了。并且不是很随机。

$db_file_name = rand(100000000000,999999999999) 

您的最小值和最大值非常接近/顺序错误,而且非常大,因为您获得的2147483647 = 2^30 -1数字很可能是您决定用于名称的列输入类型的大小限制。

rand文档http://php.net/manual/en/function.rand.php

将您的列类型更改为类似varchar(40)的类型

我还建议不要使用大于php的有符号32位整数rand(0,2147483647); 的随机数