模型的 save () 和 update () 出现偶尔存不了值的情况?

环境:
腾讯云
cpu:1核
内存: 2 GB
操作系统: CentOS 7.4 64位
当前使用带宽: 1Mbps
php 7.26
mysql 8.0.11
laravel 5.4
数据库配置文件 严谨模式 true 变 false
代码:
控制器方法:

public function orderUpload(Request $request){
    if(!$request->session()->has('username'))
        return redirect('timeOut')->with('error', '请先登录');
    if($request->isMethod('post')){
        // 验证是否已提交, 避免重复提交
        $order_temp = new Order();
        $temp = $order_temp->find($request->input('id'));
        if($temp->order_status == 15 || $temp->order_status == 21 || $temp->order_status == 82)
            return redirect('orderList')->with('error', '你的请求已提交, 请勿再此提交');
        $arr = $request->input();
        $order_obj = new Order();
        $order = $order_obj->find($request->input('id'));
        if($order->order_status == 14)
            $res = $order_obj->saveStatus($request->input('id'),15);
        elseif($order->order_status == 31)
            $res = $order_obj->saveStatus($request->input('id'),32);
        elseif($order->order_status == 34)
            $res = $order_obj->saveStatus($request->input('id'),21);
        elseif($order->order_status == 82)
            $res = $order_obj->saveStatus($request->input('id'),71);
        $file = $request->file('image');
        if($file->isValid()){
            $ext = $file->getClientOriginalExtension();
            $path = $request->file('image')->storeAs('', date('Y',time()).'/'.$request->session()->get('code').date('YmdH').mt_rand(10, 99).'.'.$ext);
            $arr['name'] = $path;
            $image_obj = new OrderImage();
            $image_res = $image_obj->add($arr);
            // $res = $order->save();
            if($res)
                return redirect('orderList')->with('success', '图片上传成功!');
        }else
            return redirect('orderList')->with('error', '执行失败!');
    }
}

模型:

public function saveStatus($id, $value){
    return DB::table('order_main')->where('or_id', $id)->update(['order_status' => $value]);
}

现象:
用save()方法的时候
win7电脑提交, 图片和状态值都能修改并保存,
但是xp系统提交, 图片能上传, 状态值没有改变, 再次上传时, 状态值才改变. 换了360, 谷歌, 搜狗浏览器都是一样. 于是帮这台电脑换了win10系统. 问题一样存在
之后换update()
用update方法, 之前xp换win10的电脑, 图片能上传, 状态值能改, 测试之后这电脑的问题解决了
可是呢, 问题出现在win7系统的问题上. 图片能上传, 状态值偶尔有修改不成功的情况, 问题移到了其他地方
查看日志文件, 也没有出现错误信息
这问题怎么破啊.......
有哪位大神指点一下

2018/09/08
加了验证

public function orderUpload(Request $request){
        if(!$request->session()->has('username'))
            return redirect('timeOut')->with('error', '请先登录');
        if($request->isMethod('post')){
            // 验证是否已提交, 避免重复提交
            $order_temp = new Order();
            $temp = $order_temp->find($request->input('id'));

            if($temp->order_status == 15 || $temp->order_status == 21 || $temp->order_status == 82)
                return redirect('orderList')->with('error', '你的请求已提交, 请勿再此提交');
            $arr = $request->input();

            $order_obj = new Order();
            $order = $order_obj->find($request->input('id'));
            if($order->order_status == 14 || $order->order_status == '14')
                $res = DB::update('update order_main set order_status= ? where or_id= ? ',[15,$request->input('id')]);
            elseif($order->order_status == 31 || $order->order_status == '31')
                $res = DB::update('update order_main set order_status= ? where or_id= ? ',[32,$request->input('id')]);
            elseif($order->order_status == 34 || $order->order_status == '34')
                $res = DB::update('update order_main set order_status= ? where or_id= ? ',[21,$request->input('id')]);
            elseif($order->order_status == 82 || $order->order_status == '82')
                $res = DB::update('update order_main set order_status= ? where or_id= ? ',[71,$request->input('id')]);
            $file = $request->file('image');
            if($file->isValid()){
                // $res = $order->save();
                $ext = $file->getClientOriginalExtension();
                $path = $request->file('image')->storeAs('', date('Y',time()).'/'.$request->session()->get('code').date('YmdH').mt_rand(10, 99).'.'.$ext);
                $arr['name'] = $path;
                $image_obj = new OrderImage();
                $order_res = DB::table('order_main')->where('or_id', [$request->input('id')])->first();
                if($order_res->order_status == 15 || $order_res->order_status == 32 || $order_res->order_status == 71 || $order_res->order_status == '15' || $order_res->order_status == '32' || $order_res->order_status == '71')
                    $image_res = $image_obj->add($arr);
                else
                    $image_res = false;
                if($image_res)
                    return redirect('orderList')->with('success', '图片上传成功!');
                else
                    return redirect('orderList')->with('error', '网络不通畅, 请重新再试!');
            }else
                return redirect('orderList')->with('error', '执行失败!');
        }
    }

又发现一个问题, 前一天的更改的状态值是由14更变到15, 第二天早上都是正常, 中午又变回14, 什么鬼情况.
并不是所有记录是这样, 是偶尔一两条数据是这样....

2018/09/12
将代码改成

public function orderUpload21(Request $request){
        if(!$request->session()->has('username'))
            return redirect('timeOut')->with('error', '请先登录');

        if($request->isMethod('post')){
            // 验证是否已提交, 避免重复提交
            $arr = $request->input();
            $file = $request->file('image');
            if($file->isValid()){
                $ext = $file->getClientOriginalExtension();
                $path = $request->file('image')->storeAs('', date('Y',time()).'/'.$request->session()->get('code').date('YmdH').mt_rand(10, 99).'.'.$ext);
                $arr['name'] = $path;
                $image_obj = new OrderImage();

                $order_obj = new Order();
                $order = $order_obj->find($request->input('id'));
                $order->order_status = 21;
                $res = $order->save();
                if(DB::table('order_main')->where('or_id', [$request->input('id')])->first()->order_status == 21)
                    $image_res = $image_obj->add($arr);
                if($res)
                    return redirect('orderList')->with('success', '图片上传成功!');
                else{
                    return redirect('orderList')->with('error', '网络部通畅, 请重新再试!');
                }
            }else
                return redirect('orderList')->with('error', '执行失败!');   
        }
    }

问题依然存在,
奇怪的是其他方法也有类似的逻辑, 就是这个方法会自动跳回修改之前的值

下面这段代码就没问题

public function delieryUpload(Request $request){
        if(!$request->session()->has('username'))
            return redirect('timeOut')->with('error', '请先登录');
        if($request->isMethod('post')){
            $file = $request->file('image');
            if($file->isValid()){
                $ext = $file->getClientOriginalExtension();
                $path = $request->file('image')->storeAs('', date('Y',time()).'/'.$request->session()->get('code').date('YmdH').mt_rand(10, 99).'.'.$ext);
                $arr = $request->input();
                $arr['name'] = $path;
                $image_obj = new OrderImage();
                $res = $image_obj->add($arr);
                $order_obj = new Order();
                $order = $order_obj->find($arr['id']);
                $deliery_obj = new OrderDeliery();
                $deliery_obj->add($arr);
                $order->order_status = 23;
                $res = $order->save();
                if($res)
                    return redirect('orderList')->with('success', '执行成功!');
                else
                    return redirect('orderList')->with('error', '执行失败!');
            }else{
                return redirect('orderList')->with('error', '图片没有上传!');
            }
        }
    }

困了我一个多月了.
百思不得其解
我猜会不会跟mysql 8.0有关, 修改了配置文件的严谨模式, 会不会跟这个有关

2018/09/21
换了阿里云
cpu:1核
内存: 2 GB
操作系统: CentOS 7.4 64位
当前使用带宽: 5Mbps
php 7.2
mysql 7.0
数据库配置文件修改回了严谨
其他不变

还是有跳回状态值14的情况, 但是明显少了很多, 现在预测也许是 new 了太多对象, 与php-fpm线程也有点关系
因为做了验证, 如果值没变是不允许添加图片名入数据库的,
如果是因为网络问题, 那图片是不可能上传的. 所有, 可以判断是添加了图片, 改了状态值15. 之后, 因内存或是框架的问题残留了之前的数据, 状态值被残留的数据还原了. 这也仅仅是猜测

htmboy
《L01 基础入门》
我们将带你从零开发一个项目并部署到线上,本课程教授 Web 开发中专业、实用的技能,如 Git 工作流、Laravel Mix 前端工作流等。
《L02 从零构建论坛系统》
以构建论坛项目 LaraBBS 为线索,展开对 Laravel 框架的全面学习。应用程序架构思路贴近 Laravel 框架的设计哲学。
最佳答案

这个问题后面找到原因了,不更新是因为和$fillable字段有关,更新一定要加上ID字段,因为要创建对象,那不然$exists字段就会为false,也就会导致数据库未更新。问题是奇葩就在这里啊,返回结果为ture,也就是sql执行成功了,结果数据库没改变,这谁会想到是这个字段导致的呢。

5年前 评论
讨论数量: 7
htmboy

@longRoad 没有错误信息

5年前 评论

建议用断点调试,定位问题点吧。

5年前 评论
htmboy

@dreamfish 试过了, 断点调试都通过. 见鬼了, 最怕这种一会行一会不行的, 而且还不报错的问题. 靠, 实在不行换tp框架写

5年前 评论

这个问题后面找到原因了,不更新是因为和$fillable字段有关,更新一定要加上ID字段,因为要创建对象,那不然$exists字段就会为false,也就会导致数据库未更新。问题是奇葩就在这里啊,返回结果为ture,也就是sql执行成功了,结果数据库没改变,这谁会想到是这个字段导致的呢。

5年前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!