0
votes

Une valeur numérique mal formée rencontrée - panier panier

Le message suivant s'affiche lorsque les notifications sont activées:

Remarque: une valeur numérique non bien formée rencontrée

https://i.stack.imgur.com/lcI4P.png

<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
use App\Product;
use App\Cart;
use App\orders;
use DB;
use Auth;
class CartController extends Controller
{
    public function add(){
        $id = request('id');
        $product = Product::find($id);
    $oldCart = session()->has('cart') ? session()->get('cart') : null;
    $cart = new Cart($oldCart);
    $cart->add($product, $product->id);
    request()->session()->put('cart', $cart);
    return response()->json($cart->totalQty);
}
// public function add22(){
//     $id = request('id');
//     $product = Product::find($id);
//     $oldCart = session()->has('cart2') ? session()->get('cart2') : null;
//     $cart = new Cart($oldCart);
//     $cart->add($product, $product->id);
//     request()->session()->put('cart2', $cart);
//     return response()->json($cart->totalQty);
// }
public function add2($id) 
{
    $product = Product::find($id);      
    $oldCart = session()->has('cart') ? session()->get('cart') : null;
    $cart = new Cart($oldCart);
    $cart->add($product, $product->id);
    request()->session()->put('cart', $cart);       
    // dd(session()->get('cart'));

    return back();
}
public function index(){
    if(session()->has('cart'))
    {
        $products = session()->get('cart')->items;
    }
    // elseif(session()->has('cart2'))
    // {
    //     $products = session()->get('cart2')->items;
    // }
    else
    {
        $products = 'nothing';
    }
    $currency = DB::table('currency')->get();
    return view('basket', compact('products', 'currency'));
}
public function order(){
    if(session()->has('cart'))
    {
        $products = session()->get('cart')->items;
    }
    // elseif(session()->has('cart2'))
    // {
    //     $products = session()->get('cart2')->items;
    // }
    else
    {
        $products = 'nothing';
    }
    $currency = DB::table('currency')->get();
    return view('order', compact('products', 'currency'));
    // return view('order');
}
public function store(Request $request){
    $this ->validate(request(), [
        'name'=>'required',
        'address'=>'required',
        'auth'=>'required',
    ]);
    if(Auth::check())
    {
    $orders = orders::create([
        'name' => $request['name'],
        'description' => $request['address'],
        'auth' => $request['auth'],
    ]);
    }
    $cart = session()->get('cart');
    $message = "Имя: ".request('name')."\nАдрес:".request('address')."\nЗаказанные товары:";
    foreach($cart->items as $product) {
        $message .= $product['item']['name']." * ".$product['qty'].", Цена - ".$product['item']['entityprice']*$product['qty']."\n";
    }
    $message .= "\nИтого: ".$cart->totalPrice." тг\n";
    $subject = "Заказ товара";     
    $headers = 'From: info@hansolomed.kz' . "\r\n" .
        'Reply-To: info@hansolome.kz' . "\r\n".
        'X-Mailer: PHP/' . phpversion();
    mail('015@i-marketing.kz', $subject, $message, $headers);
    request()->session()->forget('cart');
}    
public function remove($id){
    $oldCart = session()->has('cart') ? session()->get('cart') : null;
    $cart = new Cart($oldCart);
    $cart->removeItem($id);
    if(count($cart->items) > 0){
        session()->put('cart', $cart);
    }else{
        session()->forget('cart', $cart);
    }
    return redirect()->back();
}    
public function redis($id){
    $oldCart = session()->has('cart') ? session()->get('cart') : null;
    $cart = new Cart($oldCart);
    $cart->reduceByOne($id);
    session()->put('cart', $cart);
    return redirect()->back();        
}

}


2 commentaires

Je suppose que $product contient des chaînes, pas des entiers, donc PHP doit les convertir en entiers pour faire le calcul. La conversion jette cet avis.


@ user3783243 La conversion émet un avis uniquement lorsque la chaîne n'est pas numérique.


3 Réponses :


0
votes

Je pense que user3783243 a raison. Utilisez floatval () ou intval (), puis vous pouvez les multiplier.

<?php echo e(number_format( floatval( session()->get(cart)->totalPrice, 0, ',',' ')* floatval($currency[0]->coefficient) ; ?>


2 commentaires

Cela peut masquer la notification mais ne pas corriger la racine du problème, ce qui rend le débogage difficile. C'est similaire au masquage des avis par l'opérateur @ . Quelque part, une chaîne semble contenir une valeur non numérique. Imaginez que c'est '50 '$50' et qu'il est traité comme 0


Je suppose que le contenu n'est que du mauvais type, «20» au lieu de 20. Bien sûr, floatval () n'est pas pour vérifier ou nettoyer les mauvaises entrées / valeurs comme «50 $».



0
votes

Vous calculez avec une chaîne number_format qui ne renvoie pas de nombre formaté valide.

echo e(number_format( session()->get(cart)->totalPrice * $currency[0]->coefficient , 2, ',', '' ));

imprime 1 001 .

'1 001' * 2 lance un avis et calcule 2 (1 * 2), pas 2001.90 comme prévu.

Votre format signifie 0 décimales, , comme point décimal et de l' espace en tant que groupe de séparateur de milliers. Utilisez les formats numériques uniquement pour la sortie, ne calculez pas avec des nombres formatés.

Vous voulez probablement:

echo number_format(1000.95, 0, ',', ' ');


0 commentaires

0
votes

Pour l'alternative https://github.com/bumbummen99/LaravelShoppingcart qui est le projet fourchu de https://github.com/Crinsane/LaravelShoppingcart et prend également en charge les dernières versions de Laravel.

Il existe une méthode appelée Cart::totalFloat() qui retournera votre valeur flottante pour le total du panier.

############### OU #################

Pour ce package, convertissez simplement le format des nombres en valeurs entières ou flottantes. Un exemple est montré ci-dessous

$ num = '1 200 998,255';

########## POUR LES VALEURS FLOTTEUR ##########################

echo filter_var($num, FILTER_SANITIZE_NUMBER_FLOAT, FILTER_FLAG_ALLOW_FRACTION);

# sortie: 1200998.255

########## POUR LES VALEURS ENTIÈRES ##########################

echo filter_var($num, FILTER_SANITIZE_NUMBER_INT);

# sortie: 1200998


0 commentaires