05. januar 2020 - 14:29Der er
17 kommentarer og 2 løsninger
Javascript fejl
Status 'parseerror' Error: 'SyntaxError: Unexpected token in JSON at position 0'Første gang man prøver og tilføje noget til kurv kommer denne besked frem, noget der ved og vil hjælpe med hvad problemet er
Warning: count(): Parameter must be an array or an object that implements Countable in /var/www/ibuyit.dk/public_html/FindPrice.php on line 32 {"price":"4500","error":""}
Ligesom i dit forrige spm handler det om, at webhotellet er opgraderet, og count nu melder fejl, hvis variablen ikke er array eller objekt. Det kan fx være hvis den ikke er defineret endnu.
Du kan fixe det ved enten at teste med is_array eller ved at tilføje "(array)" inde i din count:
Det Unoeuro er kun ballade hehe jeg har her linjerne 27-37 hvor også er kan du se hvad der går galt $_SESSION['cart'][] = [ 'ProductID' => $id, 'Quality' => $qual, 'RAM' => $ram, 'Price' => $price, 'SessionID' => count($_SESSION['cart']) ]; }
Du får lige hele koden, jeg har prøvet det der du sagde det hjalp ikke fejlen blev bare ved så nu i stedet for at gå væk efter anden gang man klikker
<?php
require 'lib/Database.php';
// Retrieve and secure GET data $id = (int)($_GET['id'] ?: 0); $qual = (int)($_GET['quality'] ?: 0); $add = (int)($_GET['add'] ?: 0);
if ($id == 0 || !isset($_GET['ram'])) { die; }
// Identify price based on data $ram = addslashes($_GET['ram']); $db = new \Application\Model\Database(); $price = $db->GetProductPrice($id, $qual, $ram);
if ($price == null) { echo json_encode(['price' => '0', 'error' => 'Produktet blev ikke fundet og er muligvis udsolgt. Kontakt venligst Repkom for nærmere besked.']); } else { // If add == true, add file to cart if ($add === 1) { session_start();
// Retrieve and secure GET data $id = (int)($_GET['id'] ?: 0); $qual = (int)($_GET['quality'] ?: 0); $add = (int)($_GET['add'] ?: 0);
if ($id == 0 || !isset($_GET['ram'])) { die; }
// Identify price based on data $ram = addslashes($_GET['ram']); $db = new \Application\Model\Database(); $price = $db->GetProductPrice($id, $qual, $ram);
if ($price == null) { echo json_encode(['price' => '0', 'error' => 'Produktet blev ikke fundet og er muligvis udsolgt. Kontakt venligst Repkom for nærmere besked.']); } else { // If add == true, add file to cart if ($add === 1) { session_start();
if ( !$_SESSION['cart'] ) { $_SESSION['cart'] = []; }
Kan du se hvad der står galt her på checkout siden også? Warning: count(): Parameter must be an array or an object that implements Countable in /var/www/ibuyit.dk/public_html/CheckOut.php on line 149
linje 144 til 160
// general form check $err_msg = (isset($form_valid) && !$form_valid) ? '<p class="error">Alle felter, undtagen <i>kommentar</i>, skal udfyldes.</p><hr>' : '';
// individual check done only if general check yielded nothing $err_list_html = ''; if (count($errors) > 0) { $err_list_html = "\n<ul>\n";
foreach ($errors as $e) { $err_list_html .= "<li class=\"error\">$e</li>\n"; }
De foreslåede løsninger vil givetvis virker i 99.9% af tilfældene. Men i en kompleks kode ville jeg nu nok normalt ikke nøjes med at teste for om $_SESSION['cart'] og $errors er sat, men også om de er arrays eller et objekter.
#15: Nej, empty() virker på alle typer. På en streng tester den om den er tom, på et tal om det er 0, på et array om det ikke har nogle indices, osv. Den virker endda på en variabel man helt har glemt at definere, hvilket er unikt for empty() - så vidt jeg husker alle andre brug af en udefineret variabel resulterer i en fejl.
#16: Ja, det er jeg med på. Men problemet er jo, at (fx) empty($errors) bliver true, hvis man andetsteds har sat $errors = "eksempel"; --> Men alligevel vil count jo så give en fejlmelding, hvis du prøver på at lave en count() på den.
Derfor vil jeg mene, at vil man undgå den fejlmelding 100% skal man enten teste for is_array() og/eller is_object() i forbindelse med en count() -- eller også skal man indsætte præciseringen (array) inde i count parentesen.
#17: Men min pointe var, at der ikke er nogen grund til at køre count() på den overhovedet. Du erstatter count() med !empty()
Altså i stedet for if ($errors && count($errors) > 0)
bare if (!empty($errors))
Så ved du om den indeholder noget. Selvfølgelig kan du stadig ikke derefter behandle den som et array og udskrive fejlene, hvis den ikke er et - men der vil jeg også mene det er vigtigere at opdage, at man har kommet til at sætte $errors til en streng hvor den ikke bør være det, hvilket man bliver gjort tydeligt opmærksom på, når man forsøger at foreach'e den.
Men det virker ikke i alle situationer, det er klart. Og det er klart bedre praksis i et større system at tjekke typen.
#19: Aarh ja -- nu forstår jeg. Og er helt enig :)
Synes godt om
1 synes godt om dette
Ny brugerNybegynder
Din løsning...
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.