如何限制用户使用PHP / MySQL在一个月内仅上传三个图像

时间:2018-09-25 06:46:00

标签: php html mysql date

我正在使用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>  

请帮助我分享最佳解决方案-用户一个月内可以上传三张图片。

3 个答案:

答案 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 |
+----+---------+------------+