• 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

42 Warsaw Coding Academy
0 głosów
571 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 (290,090 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 (290,090 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 282 wizyt
pytanie zadane 16 maja 2019 w Java przez Paweł123 Nałogowiec (33,540 p.)
0 głosów
2 odpowiedzi 353 wizyt
pytanie zadane 30 sierpnia 2017 w PHP przez sc4rface Dyskutant (7,710 p.)
0 głosów
2 odpowiedzi 840 wizyt

93,379 zapytań

142,380 odpowiedzi

322,534 komentarzy

62,737 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

VMware Cloud PRO - przenieś swoją infrastrukturę IT do chmury
...