【问题标题】:Best practice: Upload a picture for non existing Task最佳实践:为不存在的任务上传图片
【发布时间】:2016-03-17 09:40:58
【问题描述】:

我正在编写一个 CRM(客户关系管理),员工可以在其中添加任务并将其分配给其他员工(使用 PHP)。

还要求员工应该能够上传任务的图像(例如,当有错误时,他们制作打印屏幕并将它们添加到任务中)

现在我的问题是,您将如何在图像和数据库中的任务之间建立关联?在员工在 GUI 中输入“创建任务表单”时,数据库中还没有“任务”条目,因此我无法将上传的图片分配给“task_id”。所以我的逻辑目前要求在你可以上传图片之前在数据库中创建“任务”条目。为什么? => 因为当你有一个表“task”的条目时,你有一个“task_id”,这是在“task_image”中创建条目(对于外键)所必需的。

我已经考虑过通过 GUID 创建 task_id 而不是使用自动增量功能的选项,但由于其他要求,这是不可能的。

【问题讨论】:

  • 我还是不明白自动增量功能的问题。

标签: php mysql database


【解决方案1】:

如果确实无法在将图片的详细信息存储在图片表中之前将任务输入到任务表中,则可以简单地为 taskID 使用任意值并使用隐藏字段将其传递给表单,直到您将任务存储在表中,然后只需运行更新查询,将 taskID 更改为正确的值,而不是最后的任意值。

类似:

INSERT INTO pictures (picID, taskID, ...) VALUES (NULL, 'arbitrary', ...);
//perform remaining operations related to task
//insert task into task table
UPDATE pictures SET taskID = $correcttaskid WHERE taskID = 'arbitrary';

【讨论】:

    【解决方案2】:

    有几个选项。 “最佳实践”是一个非常主观的术语,这完全取决于这里的上下文。

    第一个选项是您在用户上传图像时创建“任务”条目,并在上传完成时将其作为参数传递回您的主“任务”表单。例如,您可以将其存储在当前会话中;然后,当您完成“任务”条目时,您检查会话以查看是否设置了“任务 ID”,并更新该任务 ID,而不是创建一个。

    <pseudo_code>
    taskID = imageUpload (image)
    session.store("taskID", taskID)
    ....
    taskbutton.submitButton
      if (session.taskID)
        updateTask(taskID, formFields.name, formfields.description, ...)
      else
        createTask(formFields.name, formfields.description,....)
      end if
    end
    
    </pseudo_code>
    

    这需要在您的表单中使用一些 JavaScript,但它既简单又好用;缺点是您最终可能会在数据库中完成不完整的任务(例如,如果用户放弃表单)。

    另一种选择是您上传图片,但在您知道 taskID 之前不要填​​充外键。这比看起来更难——你必须在会话中携带所有的 imageID,这样你就可以在创建任务时更新它们。如果会话超时,或者用户放弃表单,您最终会得到孤立的图像。

    【讨论】:

      【解决方案3】:

      在不知道代码结构的情况下很难给出具体建议,但我了解您希望在提交任务表单之前通过单独的渠道(例如一些 JavaScript 代码)接受文件上传,就像 Gmail 一样。

      您可以将文件存储在 Web 根目录之外的临时目录中,使用难以猜测的长随机名称:

      /home/foo/site/files/pending/5baa61e4c9b93f3f0682250b6cf8331b7ee68fd8
      
      <input type="hidden" name="file" value="5baa61e4c9b93f3f0682250b6cf8331b7ee68fd8">
      

      ... 并将此类名称添加到隐藏的表单字段中。稍后,当您创建任务并获得任务 ID 后,您可以读取相应的文件并将其移动到其最终位置。考虑到:

      • 永远不要将原始原始 ID 作为路径处理,例如:

        file_get_contents($_POST['file']);
        
      • 设计一个流程,使未使用的文件在给定时间后过期(即被删除)

      如果您特别担心安全性,您可以将不同用户的文件分开,或者为每个用户创建一个目录,或者为文件名添加前缀:

      /home/foo/site/files/pending/1234-5baa61e4c9b93f3f0682250b6cf8331b7ee68fd8
      
      <input type="hidden" name="file" value="5baa61e4c9b93f3f0682250b6cf8331b7ee68fd8">
      
      if (preg_match('/^[a-f0-9]+$/', $_POST['file'])) {
          $file = sprintf('/home/foo/site/files/pending/%d-%s', $_SESSION['user_id'], $_POST['file']);
      }
      

      【讨论】:

      • 你正确理解了这个问题!如果我必须上传超过 1 张图片怎么办?输入名称在哪里?像 file-1 file-2 等?以及如何在 PHP 中访问它们?
      猜你喜欢
      • 1970-01-01
      • 2019-03-04
      • 1970-01-01
      • 2013-06-26
      • 2023-02-19
      • 1970-01-01
      • 2012-05-16
      • 1970-01-01
      • 2016-06-28
      相关资源
      最近更新 更多