• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Wyświetla się tylko jeden wynik z tablicy

VPS Starter Arubacloud
0 głosów
283 wizyt
pytanie zadane 9 lutego 2017 w PHP przez Muhin Gaduła (4,120 p.)

Witam,

Oto kod z którym mam problem:

$item = $connect->query("SELECT * FROM shopping WHERE id_user = '$user_id'");	
if (!$item) throw new Exception($connect->error);
$nr_rows = $item->num_rows;
if($nr_rows>0){
    echo '<center>Lista przedmiotów w koszyku:<form action="" method="post"><table border="3"><tr><td>ID:</td><td>Nazwa:</td><td>Cena</td><td>Usuń:</td></tr>';
    if ($item){
	while ($buy = $item->fetch_assoc()){
		global $tablica;
	        $tablica = array('id'=>$buy['id_item']);
		echo '<tr><td>'.$buy['id'].'</td><td><a href="shop.php?id='.$buy['id_item'].'">'.$buy['name'].'</a></td><td>'.$buy['price'].' zł</td><td><input type="checkbox" name="delete" value="'.$buy['id'].'" ></td></tr>';									
	}
}else{
    echo '<div class="error">Błąd!</div>';
}



for($i=0;$i<$nr_rows;$i++){
$tablicaid = $tablica['id'];
 if ($connect->query("INSERT INTO user_buy VALUES (NULL, '$user_id', 'Zakup', '$tablicaid', 'Zakup', 'Niezweryfikowane')")){
											
}else{
	throw new Exception($connect->error);
}

Problem polega na tym, że podczas wrzucania rekordów do bazy z tablicy jest wyciągane tylko jedno id i powielane, a w tablicy te ID są różne.

ID w tablicy są różne. Sprawdzałem.

Czy ktoś wie o co tu może chodzić?

1 odpowiedź

+1 głos
odpowiedź 9 lutego 2017 przez ck Obywatel (1,780 p.)
edycja 9 lutego 2017 przez ck
powinno byc $tablica .= array ...
edit: myliłem się, poprawna odpowiedz w komentarzach
komentarz 9 lutego 2017 przez Muhin Gaduła (4,120 p.)

Kiedy wstawię w tą pętle:

echo $tablica;

wyświetla mi sie:

38393939393939

Więc id jest dodawane na 100%.

W ogóle nie za bardzo wiem po co robisz tą dodatkową tablicę. Nie prościej od razu w tej pętli, która wyświetla dane z bazy, zrobić dodawanie rekordów?

Jeśli dobrze Cię rozumiem, to muszę to mieć w tablicy, bo każdy przedmiot ma inne ID, a jak mam przedmiotów kilaka, to gdzieś to ID muszę trzymać

Edit:

właśnie się zorientowałem, że rzeczywiście jest tak jak mówisz. Tam jest tylko jeden rekord. Nie zorientowałem się, że jak dam echo w pętli to mi się będzie nadpisywać. W takim wypadku co mam zrobić, żeby wszystkie te rekordy tam siedziały?

1
komentarz 9 lutego 2017 przez Arkadiusz Waluk Ekspert (287,550 p.)

Ja bym to zrobił bardziej w ten sposób:

<?php
$result = $connect->query("SELECT * FROM shopping WHERE id_user = '$user_id'");    
$items = $result->fetch_all(MYSQLI_ASSOC);
if (!empty($items)) {
    echo '<center>Lista przedmiotów w koszyku:<form action="" method="post"><table border="3"><tr><td>ID:</td><td>Nazwa:</td><td>Cena</td><td>Usuń:</td></tr>';
    foreach ($items as $item) {
        echo '<tr><td>'.$item['id'].'</td><td><a href="shop.php?id='.$item['id_item'].'">'.$item['name'].'</a></td><td>'.$item['price'].' zł</td><td><input type="checkbox" name="delete" value="'.$item['id'].'" ></td></tr>';                                                              
        $connect->query("INSERT INTO user_buy VALUES (NULL, '$user_id', 'Zakup', $item['id'], 'Zakup', 'Niezweryfikowane')");
    }
}

A jeśli już musisz z jakiegoś powodu dzielić na dwie pętle to coś tego typu:

<?php
$itemIds = [];
$result = $connect->query("SELECT * FROM shopping WHERE id_user = '$user_id'");    
$items = $result->fetch_all(MYSQLI_ASSOC);
if (!empty($items)) {
    echo '<center>Lista przedmiotów w koszyku:<form action="" method="post"><table border="3"><tr><td>ID:</td><td>Nazwa:</td><td>Cena</td><td>Usuń:</td></tr>';
    foreach ($items as $item) {
        echo '<tr><td>'.$item['id'].'</td><td><a href="shop.php?id='.$item['id_item'].'">'.$item['name'].'</a></td><td>'.$item['price'].' zł</td><td><input type="checkbox" name="delete" value="'.$item['id'].'" ></td></tr>';                                                               $itemIds[] = $item['id'];
    }
}

 
foreach ($itemIds as $id) {
    $connect->query("INSERT INTO user_buy VALUES (NULL, '$user_id', 'Zakup', '$id', 'Zakup', 'Niezweryfikowane')");
}

W zasadzie to jakby jeszcze pokombinować mógłbyś w jednym zapytaniu dodać wszystkie id. Poza tym lepiej byłoby bindować parametry do zapytań.

To taka poprawka na szybko, pisane bez testowania. Chciałem Cię tylko trochę naprowadzić jak to zrobić, a nie dać gotowca.

komentarz 9 lutego 2017 przez Muhin Gaduła (4,120 p.)
Dzięki za pomoc, nigdy bym się chyba nie domyślił, że w taki sposób trzeba to zrobić. :/
komentarz 9 lutego 2017 przez Arkadiusz Waluk Ekspert (287,550 p.)
Nie trzeba koniecznie w taki, można równie dobrze zamiast fetch_all() fetchować każdy rekord po kolei w pętli, tylko po co. Tak jak pokazałem wydaje mi się łatwiej, ale no sposobów na zrobienie tego może być kilka ;)
1
komentarz 9 lutego 2017 przez Muhin Gaduła (4,120 p.)
Szczerze Ci powiem, że tablicami w PHP nie zajmowałem się wcześniej stąd mój brak wiedzy, nawet nie umiem sobie wyobrazić jakby wyglądało to z fetchowaniem każdego rekordu po kolei. Dopiero po Twoim przykładzie trochę to ogarnąłem.

Podobne pytania

0 głosów
2 odpowiedzi 151 wizyt
pytanie zadane 16 maja 2019 w Java przez Paweł123 Nałogowiec (33,500 p.)
0 głosów
2 odpowiedzi 272 wizyt
pytanie zadane 30 sierpnia 2017 w PHP przez sc4rface Dyskutant (7,710 p.)
0 głosów
2 odpowiedzi 388 wizyt

92,453 zapytań

141,262 odpowiedzi

319,088 komentarzy

61,854 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Akademia Sekuraka 2024 zapewnia dostęp do minimum 15 szkoleń online z bezpieczeństwa IT oraz dostęp także do materiałów z edycji Sekurak Academy z roku 2023!

Przy zakupie możecie skorzystać z kodu: pasja-akademia - użyjcie go w koszyku, a uzyskacie rabat -30% na bilety w wersji "Standard"! Więcej informacji na temat akademii 2024 znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...