php文件上传无法正常工作

时间:2013-02-27 23:21:50

标签: php file-upload

我被分配了修复旧版php网站的任务,因为它已被移动到更新的服务器。它现在所使用的服务器不允许全局化变量,而且几乎所有这个站点都在运行。在尝试上传图片时,我的sql语句显示的是除了我要添加图片的列表的ID之外的所有内容。我希望有人可以帮我解决这个问题。

这是我的上传功能:

function upload(){
global $imagefolder, $id;
global $tbl_units;

include "globalizePOSTGET.php";

// $uid = uuid();
$minsize = 5000;            // 5kb
$maxsize = 3000000;     // 3mb
$ext = explode('.',basename($_FILES['userfile']['name']));
$ext = $ext[count($ext)-1];
$ext = strtolower($ext);

if ($ext != "jpg" && $ext != "jpeg" && $ext != "png") {
    echo "<script> alert('Image is not a png or jpeg format'); </script>";
    return false;
}

$imagename = $_POST['id']."_img".$_FILES['img'].".$ext";
$imagename2 = "X_".$imagename;
$uploadfile = $imagefolder . $imagename;
$uploadfile2 = $imagefolder . $imagename2;
$uploadthumb = $imagefolder . "tn_" . $imagename;

if (file_exists($uploadfile)) unlink($uploadfile);
if (file_exists($uploadthumb)) unlink($uploadthumb);

if (file_exists($uploadfile)) { 
    echo "<script> alert('Image already exists!'); </script>";
}
else
{
    if(is_uploaded_file($_FILES['userfile']['tmp_name'])) {
        // check the file is less than the maximum file size
        if($_FILES['userfile']['size'] < $maxsize) {
            $imgData = addslashes(file_get_contents($_FILES['userfile']['tmp_name']));      // prepare the image for insertion
            $size = getimagesize($_FILES['userfile']['tmp_name']);          // get the image info..
            if (move_uploaded_file($_FILES['userfile']['tmp_name'], $uploadfile2)) {
                $Image = @imagecreatefromjpeg($uploadfile2);
                if ($Image) {
                 $img_height = imagesy($Image);
                 $img_width = imagesx($Image);
                 imagedestroy($Image);
                }

                if ($img_height > $img_width) {         // portrait  
                    $tempMultiplier = 150 / $img_height;
                    $tempMultiplierFull = 600 / $img_height;
                } else {
                    $tempMultiplier = 150 / $img_width;
                    $tempMultiplierFull = 600 / $img_width;
                }

                $imageHeight = $img_height * $tempMultiplier;
                $imageWidth = $img_width * $tempMultiplier;
                $fullimageHeight = $img_height * $tempMultiplierFull;
                $fullimageWidth = $img_width * $tempMultiplierFull;
                createthumb($imagename2,"tn_".$imagename,$imageWidth,$imageHeight);

                if($_FILES['userfile']['size'] > $minsize) {
                    createthumb($imagename2,$imagename,$fullimageWidth,$fullimageHeight);
                    if (file_exists($uploadfile2)) unlink($uploadfile2);
                } else {
                    rename($uploadfile2, $uploadfile);
                }

                $sql = "UPDATE $tbl_units SET photo".$_FILES['img']." = \"" . $imagename . "\" WHERE id = " . $_POST['id'];
                echo $sql;
                if(!mysql_query($sql)) {
                    echo "<script> alert('Unable to upload file'); </script>";
                } else {
                    ?> <script>location.replace('memonly.php?action=edit_record&id=<?php echo $id; ?>');</script> <?php
                }
            }
        }   else {
            // if the file is not less than the maximum allowed, print an error
            $file_n = basename($_FILES['userfile']['name']);
            $file_s = $_FILES['userfile']['size'];
            ?>
            <script> alert("File exceeds the maximum limit of <?php echo $maxsize; ?>\nFile <?php echo $file_n; ?> is <?php echo $file_s; ?>");</script>
            <?php
        }
    }
}
}
我认为,我正在回应正在给我错误的行上的sql语句。点击提交后,页面告诉我Unable to upload file'. Which is why I echoed the sql there. I end up with a sql statement looking like this: UPDATE member_units SET photo =“_ img.jpg”WHERE id =`

有人请帮帮我!我对PHP很缺乏经验,我不知道该怎么做。

以下是进行上传的表单:

<form enctype="multipart/form-data" action="<?php echo $_SERVER['PHP_SELF']?>" method="post">
<input type="hidden" name="_submit_check" value="1" /> 
<input type="hidden" name="id" value="<?php echo $id; ?>" />
<input type="hidden" name="img" value="<?php echo $img; ?>" />
Image URL: <input type="file" name="userfile" value=""  style="font-size: 10px; width: 100%;">
<input type="submit" value="Submit" onClick="return validate();">&nbsp;
<input type="button" value="Cancel" onClick="location.href='/memonly.php?action=edit_record<?php echo "&id=$id&memberid=$memberid"; ?>';">
</form>

2 个答案:

答案 0 :(得分:2)

你需要做的第一件事就是解决问题似乎正在发生的地方。所以请接受你的回应......

  

UPDATE member_units SET photo =“_ img.jpg”WHERE id =`

这对应于......

UPDATE $tbl_units SET photo".$_FILES['img']." = \"" . $imagename . "\" WHERE id = " . $_POST['id'];

我们可以通过比较看出,很明显$ _FILES ['img']是空变量,只要将其转换为字符串即可。对于$ _POST ['id']也是如此,而$ imagename给出了一个简短的 _img.jpg 文件名。

追溯您可以看到$ imagename来自......

$_POST['id']."_img".$_FILES['img'].".$ext";

这是 photo =“_ img.jpg”的来源。同样,$ _FILES ['img']和$ _POST ['id']

你到达echo语句的事实意味着上传了一些东西,但它是通过$ _FILES ['userfile']数组,包含所有相关的变量,例如$ _FILES ['userfile'] [ 'name'],它会为您提供正在上传的图像的文件名。

接下来你需要问自己的是你期望$ _POST ['id']来自哪里,因为它缺失或为空,HTML表单中的哪个字段提供了该变量。然后你需要问问自己你想用命名系统实现什么。例如,如果您希望图像文件看起来像:1_imgLolCat.jpg那么您的变量将需要看起来更像

$imagename = $_POST['id']."_img".$_FILES['userfile']['name'];

然而,下面我的答案的最后部分让我想到,你要找的不是文件名,而是实际上是一个POST变量,表示一个类别或类型的图像,在这种情况下你可能希望从...

$imagename = $_POST['id']."_img".$_POST['img'].".$ext";

...如果存在名为“img”的HTML字段!

最后看一下你的SQL语句......

SET photo".$_FILES['img']." = \"" . $imagename . "\"

并仔细检查您的表格,因为您似乎要尝试做的是在表格中设置一个独特的变量,该变量取决于从表单传递的内容。我可能在这里错了,但我认为(如上所述)你想要$ _POST ['img']。

警告,你需要...... 需要来清理这些变量,然后再将它们输入到这样的SQL语句中。有人可以轻松拿走

SET photo".$_POST['img']

如果为数据库设置了权限,则删除整个表。关于如何正确地做到这一点,还有很多其他答案。 :)

答案 1 :(得分:0)

似乎'id'字段未在HTML表单中发送。我想它应该是一个隐藏的输入?

注意,您的脚本可以成为SQL注入的目标:您在SQL查询中直接使用用户输入($ _POST ['id'])。您应该检查此输入是否实际设置和数字。