模型的 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
《L05 电商实战》
从零开发一个电商项目,功能包括电商后台、商品 & SKU 管理、购物车、订单管理、支付宝支付、微信支付、订单退款流程、优惠券等
《L04 微信小程序从零到发布》
从小程序个人账户申请开始,带你一步步进行开发一个微信小程序,直到提交微信控制台上线发布。
最佳答案

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

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

@longRoad 没有错误信息

5年前 评论

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

5年前 评论
htmboy

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

5年前 评论

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

5年前 评论

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