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

时间:2017-03-23 11:48:23

标签: php database cakephp cakephp-2.4

我正在开发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给出。因此,错误是数据库没有足够的时间来保存图像,当下一次到达时。这就是为什么一些图像会覆盖另一个图像的原因。我怎么能解决它?

2 个答案:

答案 0 :(得分: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;

如果你这样做,你很可能在同一个文件夹中拥有相同的文件名+数字组合。只需存储路径和文件名,就可以了。这将使单个文件夹不具有如此多的图像,以便永远查看它。

注意:我刚刚编写了这个代码 - 我没有验证它的语法等等,但它应该给你这个想法。

答案 1 :(得分:0)

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

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