I am trying to pass along updated pricing to my orders table but am getting an error:
SQLSTATE[23000]: Integrity constraint violation: 1048 Column 'price' cannot be null (SQL: update `orders` set `status` = paid, `price` = ? where `order_id` = 66)
In my controller I have this:
public function showPayment() { $cart = Session::get('cart'); $payment_info = Session::get('payment_info'); $total_weight = $cart->totalWeight; if($total_weight <= 16.00 ) { $sales_tax = $cart->totalPrice * .085 ; $payment_total = $cart->totalPrice + $sales_tax + 5; return view('cart.payments', ['payment_info' => $payment_info, 'cartItems' => $cart, 'sales_tax' => $sales_tax, 'total_weight'=>$total_weight, 'payment_total' => $payment_total] ); }else{ $total_weight = $cart->totalWeight; $sales_tax = $cart->totalPrice * .085 ; $payment_total = $cart->totalPrice + $sales_tax + 10; return view('cart.payments', ['payment_info' => $payment_info, 'cartItems' => $cart, 'sales_tax' => $sales_tax, 'total_weight'=>$total_weight, 'payment_total' => $payment_total] ); } $newPaymentTotal = $payment_total; $request->session()->put('newPaymentTotal', $newPaymentTotal); } private function storePaymentInfo($paypalPaymentID, $paypalPayerID){ $payment_info = Session::get('payment_info'); $order_id = $payment_info['order_id']; $status = $payment_info['status']; $paypal_payment_id = $paypalPaymentID; $paypal_payer_id = $paypalPayerID; $newPaymentTotal = Session::get('newPaymentTotal'); if($status == 'on_hold'){ //create (issue) a new payment row in payments table $date = date('Y-m-d H:i:s'); $newPaymentArray = array("order_id"=>$order_id,"date"=>$date,"amount"=>$payment_info['price'], "paypal_payment_id"=>$paypal_payment_id, "paypal_payer_id" => $paypal_payer_id); $created_order = DB::table("payments")->insert($newPaymentArray); //update payment status in orders table to "paid" DB::table('orders')->where('order_id', $order_id)->update(array('status' => 'paid', 'price' => $newPaymentTotal)); } }
The error is coming from the $newPaymentTotal that I want use to update the price that was in there before. That column is set up as a decimal as well.
Advertisement
Answer
Your line $request->session()->put('newPaymentTotal', $newPaymentTotal);
never gets hit due to this issue:
public function showPayment() { //... if($total_weight <= 16.00 ) { //... return view('cart.payments', ['payment_info' => $payment_info, 'cartItems' => $cart, 'sales_tax' => $sales_tax, 'total_weight'=>$total_weight, 'payment_total' => $payment_total] ); } else{ //... return view('cart.payments', ['payment_info' => $payment_info, 'cartItems' => $cart, 'sales_tax' => $sales_tax, 'total_weight'=>$total_weight, 'payment_total' => $payment_total] ); } $newPaymentTotal = $payment_total; // note, this is a bit redundant $request->session()->put('newPaymentTotal', $newPaymentTotal); // this needs to happen BEFORE you return, at this point, its too late, this never gets called }
In either case, you return a value before setting the session variable. You’ll need to move that to be before you call return
NOTE: Thats gonna cause a new error becuase $request
isnt defined, you probably want request()->session()->put(....
there
That said, the whole method could be simplified using a ternary statement to something like:
public function showPayment() { $cart = Session::get('cart'); $payment_info = Session::get('payment_info'); $total_weight = $cart->totalWeight; $addend = $total_weight <= 16.00 ? 5 : 10; $sales_tax = $cart->totalPrice * .085 ; $payment_total = $cart->totalPrice + $sales_tax + $addend; request()->session()->put('newPaymentTotal', $payment_total); return view('cart.payments', [ 'payment_info' => $payment_info, 'cartItems' => $cart, 'sales_tax' => $sales_tax, 'total_weight' => $total_weight, 'payment_total' => $payment_total ] ); }
On a related but off topic note:
Be very careful doing math with floating point numbers in PHP. And by careful, I really mean DONT do it. You WILL run into issues that cause very difficult to understand and trace back bugs. Instead, I ALWAYS do math by first converting all floats to an integer value, doing all the math needed with those integers, then converting back to a float for display purposes at the end.
$totalPrice = 124.25; $addend = 10; $taxRate = .085; $intTotalPrice = $totalPrice * 1000; // 1000 becuase our tax rate goes to 3 places, our multiplier needs to have the same number of (or more) 0s as the max number of places our floats have $intAddend = $addend * 1000; $intTaxRate = $taxRate * 1000; $intPrice1 = $price1 * 100; $intPrice2 = $price2 * 100; $total = ($intTotalPrice + $intAddend + $intTaxRate) / 1000; // add all the numbers, then divide by the same number we multiplied by to get back to a float $displayTotal = '$'.number_format ($total, 2); var_dump($displayTotal);