0

我被分配了修复旧 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>
4

2 回答 2

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']

如果为您的数据库设置了权限,则删除您的整个表。关于如何正确执行此操作,还有很多其他答案。:)

于 2013-02-27T23:45:15.240 回答
0

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

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

于 2013-02-27T23:28:20.587 回答