【问题标题】:Database does not have enough time to save the record数据库没有足够的时间保存记录
【发布时间】:2017-08-15 22:55:54
【问题描述】:

我正在开发一个关于 CakePHP 2.4.4 的项目。我面临以下问题:我的供应商上传类调用一个函数newImage 创建一个新图像。例如,当我上传多张图片五次时,此函数会连续五次被调用。该函数包含如下代码:

...    
...initializing Uploader class
...
//creating image
$this->Orderimage->create();
    $data = array(
    'order_id' => $order_id,
    'filename' => $filename,
    'date' => date('Y-m-d'),
    'extension' => $result['ext'],
);
$this->Orderimage->save($data);

但这是我遇到问题的地方。当我尝试上传超过 4 张图片时,这意味着我连续调用此函数超过 4 次,有些图片没有上传,而是上传了之前的图片。原因是这些图像获得了相同的文件名。但文件名由最后创建的图像+1 给出。因此错误是数据库没有足够的时间来保存图像,当下一个到达时。这就是某些图像覆盖另一个图像的原因。我该如何解决?

【问题讨论】:

  • 您没有分享您的文件上传代码,请分享更多代码以了解问题
  • @tarikul05,Uploader 的工作原理是,它连续几次调用这个函数newImage。就是这样。
  • 我猜没有代码,没有帮助。
  • 有时您只需要解释即可回答。并不总是需要代码示例(如本例所示)。

标签: php database cakephp cakephp-2.4


【解决方案1】:

尝试将文件名设置为唯一的,而不是只使用+1

例如:

$filename = CakeText::uuid() . '.jpg'; // or try String::uuid()

这样您就不必担心意外使用相同的文件名。

https://book.cakephp.org/2.0/en/core-utility-libraries/string.html#CakeText::uuid

旁注:如果您要将大量文件上传到一个目录中,最好将它们放在嵌套目录中(3 深很常见)。例如:

$filename = rand(0,99) . DS . rand(0,99) . DS . rand(0,99) . $file;

如果您这样做了,那么您在同一个文件夹中就不太可能拥有相同的文件名+编号组合。只需存储路径和文件名,就可以了。这样可以防止单个文件夹中包含太多图像,以至于需要很长时间才能查看。

注意:我只是在脑海中写下了这段代码 - 我没有验证它的语法......等等,但它应该会给你这个想法。

【讨论】:

    【解决方案2】:

    Daves 解决方案应该可以解决您的问题,但如果您坚持使用您的文件名约定,请获取最后插入的 id 并使用$lastInsertedId + $counter 在循环中创建所有图像,然后再保存它们。之后将孔图像数组写入您的数据库。

    注意:仅当您没有同时写入请求时才应使用此解决方案!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-02-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多