数据库没有足够的时间来保存记录

Database does not have enough time to save the record

我正在使用 CakePHP 2.4.4 开发一个项目。我面临以下问题:我的供应商上传 Class 调用了一个创建新图像的函数 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 给出的。因此,错误是数据库没有足够的时间来保存图像,当下一个到达时。这就是某些图像覆盖另一个图像的原因。我该如何解决?

尝试将文件名设置为唯一的名称,而不是仅使用 +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;

如果您这样做,您将不太可能在同一文件夹中拥有相同的文件名+数字组合。只需存储路径和文件名,就可以了。这将使单个文件夹不会有太多图片,以至于需要很长时间才能查看。

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

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

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