Avatar billede Mad Mester
05. januar 2020 - 14:29 Der 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

https://ibuyit.dk/saelg/iPhone+XS/64GB
Avatar billede Slater Ekspert
05. januar 2020 - 14:43 #1
Læs responsebody'en på det JSON kald. Det er en PHP-fejl i stedet for JSON, så det er klart det ikke kan læses som JSON.

Hvis det er en side du ejer, så skal fejlen findes i PHP. Hvis det ikke er din, er der ikke noget du kan gøre, andet end at kontakte ejeren.
Avatar billede Mad Mester
05. januar 2020 - 14:52 #2
hvor er phpfejlen linken linje jeg kan ikke se nogen responsebody?
Avatar billede Mad Mester
05. januar 2020 - 14:54 #3
Ups undskyld stavefejl, hvad siger den php fejlen er? kan du kopiere det til mig
Avatar billede Slater Ekspert
05. januar 2020 - 15:27 #4
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":""}
Avatar billede ejvindh Ekspert
06. januar 2020 - 08:20 #5
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:

if (count((array)$variabel)) { something }
Avatar billede Mad Mester
06. januar 2020 - 08:37 #6
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'])
        ];
    }

    echo json_encode(['price' => "$price", 'error' => '']);
}
Avatar billede tomsommer Juniormester
06. januar 2020 - 08:59 #7
$_SESSION['cart'] er tom, derfor kan du ikke køre count() på den.

if ( !$_SESSION['cart'] ) {
$_SESSION['cart'] = [];
}
Avatar billede Mad Mester
06. januar 2020 - 09:11 #8
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();

        $_SESSION['cart'][] = [
            'ProductID' => $id,
            'Quality' => $qual,
            'RAM' => $ram,
            'Price' => $price,
            'SessionID' => count($_SESSION['cart'])
        ];
    }

    echo json_encode(['price' => "$price", 'error' => '']);
}
Avatar billede tomsommer Juniormester
06. januar 2020 - 09:43 #9
<?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();

if ( !$_SESSION['cart'] ) {
$_SESSION['cart'] = [];
}

        $_SESSION['cart'][] = [
            'ProductID' => $id,
            'Quality' => $qual,
            'RAM' => $ram,
            'Price' => $price,
            'SessionID' => count($_SESSION['cart'])
        ];
    }

    echo json_encode(['price' => "$price", 'error' => '']);
}
Avatar billede Mad Mester
06. januar 2020 - 09:57 #10
Det virkede tak..
Avatar billede Mad Mester
06. januar 2020 - 10:00 #11
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";
    }

    $err_list_html .= "</ul>\n\n";
    $err_msg = $err_list_html;
}

echo <<< HTML
Avatar billede tomsommer Juniormester
06. januar 2020 - 10:10 #12
if (count($errors) > 0) {

->

if ($errors && count($errors) > 0) {
Avatar billede ejvindh Ekspert
06. januar 2020 - 10:47 #13
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.
Avatar billede Slater Ekspert
06. januar 2020 - 11:43 #14
Eller i netop dette tilfælde, hvor man bare vil vide om der er noget i array'et: bruge empty() i stedet. Den virker på alt.
Avatar billede ejvindh Ekspert
06. januar 2020 - 13:00 #15
#14: Men ville den løsning ikke fejle, hvis man andetsteds i koden var kommet til at definere (fx) $error som en streng eller et tal?
Avatar billede Slater Ekspert
06. januar 2020 - 13:06 #16
#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.
Avatar billede ejvindh Ekspert
06. januar 2020 - 13:14 #17
#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.
Avatar billede Slater Ekspert
06. januar 2020 - 13:24 #18
#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.
Avatar billede ejvindh Ekspert
06. januar 2020 - 13:30 #19
#19: Aarh ja -- nu forstår jeg. Og er helt enig :)
Avatar billede Ny bruger Nybegynder

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.

Loading billede Opret Preview
Kategori
Vi tilbyder markedets bedste kurser inden for webudvikling

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester