Wątek przeniesiony 2016-11-15 20:10 z PHP przez dzek69.

Sklep internetowy - koszyk

0

Witam,
Mam problem ze skryptem koszyka sklepu internetowego. Mianowicie gdy wybieram produkt, który ma być dodany, pojawiają się komunikaty: "Fatal error: Uncaught Error: Cannot use object of type Towar as array in C:\wamp64\www\koszyk.php on line 23" oraz "Error: Cannot use object of type Towar as array in C:\wamp64\www\koszyk.php on line 23". Nie wiem jak to rozwiązać, czy ktoś ma jakieś sugestie?

Oto kod koszyka.php:

<html>
    <head>
        <meta charset="UTF-8">
        <title>Koszyk</title>
    </head>
    <body>
        <?php
        session_start();
        require 'polacz.php';
        require 'towar.php';
        if (isset($_GET['id'])) 
        {
            $wyn = mysqli_query($pol, 'SELECT * FROM produkty WHERE id='.$_GET['id']);
            $produkt = mysqli_fetch_object($wyn);
            $towar = new Towar();
            $towar->id = $produkt->id;
            $towar->nazwa = $produkt->nazwa;
            $towar->cena = $produkt->cena;
            $towar->sztuk = 1;
            $index = -1;
            $koszyk = unserialize(serialize($_SESSION['koszyk']));
            for($i = 0; $i < count($koszyk); $i++){  
                if ($koszyk[$i]->id==$_GET['id']) {
                    $index = $i;
                    break;
                }
            } // ok
            if ($index==-1){
                    $_SESSION['koszyk'][] = $towar;
                    
            } else {
                $koszyk->sztuk++;
                $_SESSION['koszyk'] = $koszyk;
                
            }
        }
        //usuń produkt
        if (isset($_GET['index'])){
            $koszyk[] = unserialize(serialize($_SESSION['koszyk']));
            unset($koszyk[$_GET['index']]);
            $koszyk = array_values($koszyk);
            $_SESSION['koszyk'] = $koszyk;
        }    
        ?>
        <table border="1" cellspacing="2" cellpadding="2">
            <thead>
                <tr>
                    <th>Opcje</th>
                    <th>ID</th>
                    <th>Nazwa</th>
                    <th>Cena</th>
                    <th>Sztuk</th>
                    <th>Całość</th>
                </tr>
            </thead>
            <tbody>
            <?php 
            $koszyk = unserialize(serialize($_SESSION['koszyk']));
            $s = 0;
            $index = 0;
            for($i=0;$i < count($koszyk);$i++)
            {
                $s += ($koszyk[$i]->cena * $koszyk[$i]->sztuk);
                echo '<tr>';
                echo '<td><a href="koszyk.php?index='.$index.' onclick="return confirm("Potwierdzasz?");">Usuń</a></td>';
                echo '<td>'.($koszyk[$i]->id).'</td>';
                echo '<td>'.($koszyk[$i]->nazwa).'</td>';
                echo '<td>'.($koszyk[$i]->cena).'</td>';
                echo '<td>'.($koszyk[$i]->sztuk).'</td>';
                echo '<td>'.($koszyk[$i]->cena * $koszyk[$i]->sztuk).'</td>';
                echo '</tr><br>';
                $index++;
            }
            
            ?>
                <tr>
                    <td colspan="4" align="right">Suma:</td>
                    <td align="left"><?php echo $s; ?></td>
                </tr>
            </tbody>
        </table>
        <br>
        <a href="index.php">Kontynułuj zakupy</a>
    </body>
</html>

Kod towar.php:

<?php
class Towar{
    var $id;
    var $nazwa;
    var $cena;
    var $sztuk;
    
}
?>
0

Po pierwsze to parzy -.-, skrypty -.- mógłbyś użyć jakiegoś micro frameworka a nie w html'u wrzucasz php -.-. Jakikolwiek mały framework albo nawet własny prosty by był lepszy XD.

Ale wracając do sprawy to masz błąd przecież w że w linii 23 chcesz korzystać z obiektu Towar jako taliby a twój obiekt nie ma ArrayAccess. Sprawdź co ci zwraca Koszyk w tym miejscu.

 
    $koszyk = unserialize(serialize($_SESSION['koszyk']));
    var_dump($koszyk);
    die();

Nie wiem czy to o tą linie chodzi na pewno ale w miejscu gdzie masz błąd sprawdź co ci zwraca(jaki typ zmiennej). Jak zwraca ci obiekt to logicznie nie możesz użyć go jako tablicy.

0

Zmień tutorial, bo var w php było chyba sto lat temu.

0

Problem tkwi w warunku if ($koszyk[$i]->id==$_GET['id']) w pierwszym for, a komunikat brzmi "Trying to get property of non-object", tylko dlaczego?

0

dlatego, że odwołujesz się do czegoś co nie jest obiektem.

  $koszyk = unserialize(serialize($_SESSION['koszyk']));
            for($i = 0; $i < count($koszyk); $i++){  
                if ($koszyk[$i]->id==$_GET['id']) {
                    $index = $i;
                    break;
                }

sprawdź sobie jaką strukturę ma zmienna koszyk i co próbujesz wywołać w pętli.

0

ok, rozumiem. Tylko jak z $koszyk zrobić obiekt, tak żeby pamiętał, też poprzednie wartości?

0

Ok, zmieniłem kod (wyłączyłem jedną komendę) i po drugim kliknięciu produkt jest dodany do koszyka. Ale potem znów są komunikaty, tak jakby chciał dodać produkt ale wartości są puste, gdzie jest błąd?

<?php
session_start();
require 'polacz.php';
require 'towar.php';
if (isset($_GET['id'])) {
    $wyn = mysqli_query($pol, 'SELECT * FROM produkty WHERE id=' . $_GET['id']);
    $produkt = mysqli_fetch_object($wyn);
    $towar = new Towar();
    $towar->id = $produkt->id;
    $towar->nazwa = $produkt->nazwa;
    $towar->cena = $produkt->cena;
    $towar->sztuk = 1;
    $index = -1;
    $koszyk = array_values(unserialize(serialize($_SESSION['koszyk'])));

    for ($i = 0; $i < count($koszyk); $i++) {
        if ($koszyk[$i]->id == $_GET['id']) {
            $index = $i;
            break;
        }
    }
    if ($index == -1) {
        $_SESSION['koszyk'][] = $towar;
    } /* else {
      $koszyk->sztuk++;
      $_SESSION['koszyk'][] = $koszyk;

      } */
}
//usuń produkt
if (isset($_GET['index'])) {
    $koszyk[] = unserialize(serialize($_SESSION['koszyk']));
    unset($koszyk[$_GET['index']]);
    $koszyk[] = array_values($koszyk);
    $_SESSION['koszyk'] = $koszyk;
}
?>
<table border="1" cellspacing="2" cellpadding="2">

    <thead>
        <tr>
            <th>Opcje</th>
            <th>ID</th>
            <th>Nazwa</th>
            <th>Cena</th>
            <th>Sztuk</th>
            <th>Całość</th>
        </tr>
    </thead>
    <tbody>
<?php
$koszyk[] = unserialize(serialize($_SESSION['koszyk']));
$s = 0;
$index = 0;
for ($i = 0; $i < count($koszyk); $i++) {
    $s += ($koszyk[$i]->cena * $koszyk[$i]->sztuk);
    echo '<tr>';
    echo '<td><a href="koszyk.php?index=' . $index . ' onclick="return confirm("Potwierdzasz?");">Usuń</a></td>';
    echo '<td>' . ($koszyk[$i]->id) . '</td>';
    echo '<td>' . ($koszyk[$i]->nazwa) . '</td>';
    echo '<td>' . ($koszyk[$i]->cena) . '</td>';
    echo '<td>' . ($koszyk[$i]->sztuk) . '</td>';
    echo '<td>' . ($koszyk[$i]->cena * $koszyk[$i]->sztuk) . '</td>';
    echo '</tr><br>';
    $index++;
}
?>
        <tr>
            <td colspan="4" align="right">Suma:</td>
            <td align="left"><?php echo $s; ?></td>
        </tr>
    </tbody>
</table>
<br>
<a href="index.php">Kontynułuj zakupy</a><br>

1 użytkowników online, w tym zalogowanych: 0, gości: 1