我正在尝试创建一个表单,用户可以在其中选择图像并设置其个人资料图片。在此之后,我想获取这些特定信息并在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;
答案 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);