图像上传PHP的问题

时间:2015-03-05 14:11:39

标签: php mysql mysqli

我正在尝试创建一个表单,用户可以在其中选择图像并设置其个人资料图片。在此之后,我想获取这些特定信息并在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数据库到达头像元素时,我总是得到相同的数字,即:2147483647(但在用户文件夹中一切正常)。因此,插入数据库的值存在问题。有什么建议可以解决这个问题吗?

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

就是这一行:

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

2 个答案:

答案 0 :(得分:0)

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

对于PHP,您告诉它不要使用srand()

从同一个地方开始

答案 1 :(得分:0)

你的号码很大。而且不是很随机。

$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);