我被分配了修复旧版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();">
<input type="button" value="Cancel" onClick="location.href='/memonly.php?action=edit_record<?php echo "&id=$id&memberid=$memberid"; ?>';">
</form>
答案 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'])。您应该检查此输入是否实际设置和数字。