我正在使用PHP。我的问题是如何限制用户一个月只能上传三张图片。
My Mysql Database表-
CREATE TABLE `images` (
`id` int(40) NOT NULL,
`user_name` varchar(40) NOT NULL,
`mobile` varchar(30) NOT NULL,
`email` varchar(50) NOT NULL,
`name` longblob NOT NULL,
`position` int(40) NOT NULL,
`date` date NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
我希望用户一个月只能上传三张图片。
请帮助我使用PHP脚本。我是PHP的初学者。分享最佳解决方案..
我用这个-
<?php
include("admin/config.php");
if(isset($_POST["insert"]))
{
$mobile = $_POST['mobile'];
$email = $_POST['email'];
$user_name = $_POST['user_name'];
$fileinfo = @getimagesize($_FILES["image"]["tmp_name"]);
$width = $fileinfo[0];
$height = $fileinfo[1];
$allowed_image_extension = array(
"png",
"jpg",
"jpeg"
);
$file_extension = pathinfo($_FILES["image"]["name"], PATHINFO_EXTENSION);
$sql="select * from images where (name='$name');";
$count=mysqli_query($mysqli,$sql);
$count=count($_FILES['name']);
if($count>3)
{
echo "<font color='red'>3 image upload </font>";
} else{
$file_extension = pathinfo($_FILES["image"]["name"], PATHINFO_EXTENSION);
if (! file_exists($_FILES["image"]["tmp_name"])) {
$response = array(
"type" => "error",
"message" => "Choose image file to upload."
);
}
else if (! in_array($file_extension, $allowed_image_extension)) {
$response = array(
"type" => "error",
"message" => "<font color='red'>Upload valiid images. Only PNG and JPEG are allowed.</font>"
);
echo $result;
} // Validate image file size
else if (($_FILES["image"]["size"] > 2000000)) {
$response = array(
"type" => "error",
"message" => "Image size exceeds 2MB"
);
} // Validate image file dimension
else if ($width > "1250" || $height > "720") {
$response = array(
"type" => "error",
"message" => "<font color='red'>Image dimension should be within 1250X720</font>"
);
} else {
$target = '/image';
$target = "image/" . basename($_FILES["image"]["name"]);
$file = addslashes(file_get_contents($_FILES["image"]["tmp_name"]));
$query = mysqli_query($mysqli,"INSERT INTO images VALUES ('','$user_name','$mobile','$email','$file','',NOW())");
if (move_uploaded_file($_FILES["image"]["tmp_name"], $target)) {
$response = array(
"type" => "success",
"message" => '<font color="green">Image uploaded successfully </font>'
);
} else {
$response = array(
"type" => "error",
"message" => "<font color='red'>Problem in uploading image files.</font>"
);
}
}
// if(mysqli_query($connect, $query))
// {
// echo '<script>alert("Image Inserted into Database")</script>';
// }
}
}
?>
我的HTML表单-
<form method="post" id="frm-image-upload" action="my-account.php#parentHorizontalTab3" name='img'
method="post" enctype="multipart/form-data">
<div class="agileits_w3layouts_contact_left"style="margin-left:20%;">
<input type="hidden" name="user_name" value="<?php $space = " ";
echo $row["fname"].$space.$row["lname"]; ?>" id="user_name" Placeholder="Your Name" required />
<input type="hidden" name="mobile" value="<?php echo $row["mobile"]; ?>" id="mobile"Placeholder="Mobile" required />
<input type="hidden" name="email" value="<?php echo $row["email"]; ?>" id="email" Placeholder="Email" required/>
</div>
<center>
<input type="file" name="image" id="image" />
</center>
<br />
<center><input type="submit" name="insert" id="insert" value="Upload" class="btn btn-info" /> </center>
</form>
请帮助我分享最佳解决方案-用户一个月内可以上传三张图片。
答案 0 :(得分:2)
基本思想是计算给定用户在给定月份上传的所有图像,例如:
SELECT COUNT(*) FROM `images` WHERE `user_name` = ? GROUP BY MONTH(`date`);
如果以上查询返回3
,则可以阻止上传。
答案 1 :(得分:1)
@fabrik解决方案是最简单的方法,但是当处理大量图像/用户时,它会降低性能。
如果您不介意进一步研究该解决方案,建议您将image_upload_credit
字段添加到用户表中。每次用户上传图片时,您的功劳都会减少1。
由于上载时(或应该具有)访问User
对象的权限,因此插入的复杂度为O(1)
。
要完成该解决方案,您需要编写一个cron
(定期运行)任务,该任务在每月的第一天以image_upload_credit
重置UPDATE user SET image_upload_credit = 3 WHERE image_upload_credit <> 3;
答案 2 :(得分:0)
请考虑以下内容...
CREATE TABLE my_table
(id SERIAL PRIMARY KEY
,user_id INT NOT NULL
,date DATE NOT NULL
);
INSERT INTO my_table (user_id,date)
SELECT 1
, '2018-01-01'
FROM (SELECT 1) x
LEFT
JOIN (SELECT user_id
, DATE_FORMAT(date,'%Y-%m') ym
FROM my_table
GROUP
BY user_id
, ym
HAVING COUNT(*) >=3
) y
ON y.user_id = 1
AND y.ym = DATE_FORMAT('2018-01-01','%Y-%m')
WHERE y.user_id IS NULL;
LIMIT 1;
SELECT * FROM my_table;
+----+---------+------------+
| id | user_id | date |
+----+---------+------------+
| 1 | 1 | 2018-01-01 |
+----+---------+------------+
INSERT INTO my_table (user_id,date)
SELECT 1
, '2018-01-02'
FROM (SELECT 1) x
LEFT
JOIN (SELECT user_id
, DATE_FORMAT(date,'%Y-%m') ym
FROM my_table
GROUP
BY user_id
, ym
HAVING COUNT(*) >=3
) y
ON y.user_id = 1
AND y.ym = DATE_FORMAT('2018-01-02','%Y-%m')
WHERE y.user_id IS NULL
LIMIT 1;
SELECT * FROM my_table;
+----+---------+------------+
| id | user_id | date |
+----+---------+------------+
| 1 | 1 | 2018-01-01 |
| 2 | 1 | 2018-01-02 |
+----+---------+------------+
INSERT INTO my_table (user_id,date)
SELECT 1
, '2018-01-02'
FROM (SELECT 1) x
LEFT
JOIN (SELECT user_id
, DATE_FORMAT(date,'%Y-%m') ym
FROM my_table
GROUP
BY user_id
, ym
HAVING COUNT(*) >=3
) y
ON y.user_id = 1
AND y.ym = DATE_FORMAT('2018-01-02','%Y-%m')
WHERE y.user_id IS NULL
LIMIT 1;
Query OK, 1 row affected (0.00 sec)
SELECT * FROM my_table;
+----+---------+------------+
| id | user_id | date |
+----+---------+------------+
| 1 | 1 | 2018-01-01 |
| 2 | 1 | 2018-01-02 |
| 3 | 1 | 2018-01-02 |
+----+---------+------------+
INSERT INTO my_table (user_id,date)
SELECT 1
, '2018-01-03'
FROM (SELECT 1) x
LEFT
JOIN (SELECT user_id
, DATE_FORMAT(date,'%Y-%m') ym
FROM my_table
GROUP
BY user_id
, ym
HAVING COUNT(*) >=3
) y
ON y.user_id = 1
AND y.ym = DATE_FORMAT('2018-01-03','%Y-%m')
WHERE y.user_id IS NULL
LIMIT 1;
Query OK, 0 rows affected (0.00 sec)
SELECT * FROM my_table;
+----+---------+------------+
| id | user_id | date |
+----+---------+------------+
| 1 | 1 | 2018-01-01 |
| 2 | 1 | 2018-01-02 |
| 3 | 1 | 2018-01-02 |
+----+---------+------------+
INSERT INTO my_table (user_id,date)
SELECT 1
, '2018-02-03'
FROM (SELECT 1) x
LEFT
JOIN (SELECT user_id
, DATE_FORMAT(date,'%Y-%m') ym
FROM my_table
GROUP
BY user_id
, ym
HAVING COUNT(*) >=3
) y
ON y.user_id = 1
AND y.ym = DATE_FORMAT('2018-02-03','%Y-%m')
WHERE y.user_id IS NULL
LIMIT 1;
Query OK, 1 row affected (0.00 sec)
SELECT * FROM my_table;
+----+---------+------------+
| id | user_id | date |
+----+---------+------------+
| 1 | 1 | 2018-01-01 |
| 2 | 1 | 2018-01-02 |
| 3 | 1 | 2018-01-02 |
| 4 | 1 | 2018-02-03 |
+----+---------+------------+