pętla w php nie widzi obiektów z sesii

1

Witam. Mam problem z pętlą,chcę aktualizować wartości w tabeli jednak mi to nie wychodzi taki kod ```

$polaczenie = new mysqli($host,$db_user,$db_password,$db_name);
			foreach ($_SESSION['koszyk'] AS $koszyk) {
			$zapytanie = "UPDATE `zamowienia_has_czesci` SET idCzesci='{$koszyk['czesc']}', idKategorii ='{$koszyk['kategoria']}', idMarki ='{$koszyk['marka']}' WHERE idZamowienia = (SELECT MAX(idZamowienia) FROM zamowienia)";
			mysqli_query($polaczenie, $zapytanie);
			}

wstawia mi owszem do bazy kilka rekordów zależnie od tego ile mam produktów natomiast widzi tak jakby tylko ostatnie wartośći ze zmiennej $koszyk[czesc] itd
na 1 screenie pokazane jest które wartosci są wstawiane
a za to taki kod ```

$polaczenie = new mysqli($host,$db_user,$db_password,$db_name);
			foreach ($_SESSION['koszyk'] AS $koszyk) {
			$zapytanie = "INSERT INTO `zamowienia_has_czesci`(`idZamowienia`, `idCzesci`, `idKategorii`, `idMarki`) VALUES ('', '{$koszyk['czesc']}', '{$koszyk['kategoria']}', '{$koszyk['marka']}')";
			mysqli_query($polaczenie, $zapytanie);
			}```

wstawia to co jest zaznaczone na 2 screenie czyli dokładnie to co mi potrzeba jednak zamiast wstawiania muszę robić aktualizację bo wczesniej są wstawiane wartosci do innej kolumny w tej tabeli.
Jak zrobić zeby ten kod z update wstawiał mi tak samo wartosci bo bazy jak insert czyli żeby widział poprzednie wartośći wyciągane z $koszyk a nie tylko przypisane do ostatniego produktu??

1

najpierw formatowanie posta.

1
[mr_jaro ]:

zrobione

1
 WHERE idZamowienia = (SELECT MAX(idZamowienia) FROM zamowienia)

Robisz update zawsze na ostatnim rekordzie w bazie. Obojętnie ile masz elementów w koszyku, to zawsze będzie Ci ostatni z bazy zmieniać. Powinieneś w sesji trzymać ID elementu z koszyka jeszcze i to ID powinno być użyte w where.

1

Właśnie nie na ostatnim bo np jak mam 3 rekordy w bazie zamowienia_has_czesci to mi zmienia wartość we wszystkich 3, to max(idZamowienia) from zamowienia to jest żeby mi brało ostatni rekord z tabeli zamówienia i tylko przy kolumnach z tym największym id zmieniało wartości. Mam w sesji id produktu zapisane jako id części co widać na screenach

1

Ok, nie zauważyłem, że update robisz na innej tabelce niż tej użytej w where. Ale problem i tak jest podobny. Cały czas nadpisujesz sobie dane, dlatego widzisz tylko dane z ostatniej części. Musisz w where jeszcze dodać sobie ID elementu z koszyka.

1

Dopisałem AND idCzesci='{$koszyk[' czesc']} ' i nie działa wgl

1

Kurcze pomysł trochę, to co ja piszę nie jest pewnie całkowicie poprawne xD

Aktualnie tyle razy ile masz zamówień w koszyku (w sesji), tyle razy nadpisujesz sobie dane. Musisz w where przy robieniu update dać taki warunek, by zidentyfikować dokładnie rekord, który chcesz zmienić.

I nie kumam tego zdania:

Jak zrobić zeby ten kod z update wstawiał mi tak samo wartosci bo bazy jak insert czyli żeby widział poprzednie wartośći wyciągane z $koszyk a nie tylko przypisane do ostatniego produktu??

1

Zamówienie mam jedno, tylko ilość produktów może być większa. Wstawiam do bazy tyle rekordow ile jest produktów ale każdy rekord ma to samo idZamowienia. Chodzi mi w tym o to że jeżeli te wartości wstawiłem za pomocą insert to wszystko działało, w każdym wierszu dopisywalo mi inną wartość w każdej kolumnie a gdy zmieniłem insert na update to do każdego wiersza wstawia dane tylko ostatniego produktu. Przy insert dla 3 produktów wstawialo w 3 wierszach inne wartości do kolumn idCzesci, idKategorii i idMarki. Dla update i 3 produktów w każdym wierszu pojawiaja się dane w kolumnach idCzesci, idKategorii i idMarki takie same-przypisane do ostatniego produktu z koszyka, tak jakby pętla nie działała wgl

1

Przecież Ci tłumaczę, że sobie nadpisujesz dane, gdy robisz update.

  1. Robisz insertem 3 wpisy.
  2. Za pierwszym przejściem w update update'ujesz wszystkie 3 wpisy.
  3. Za pierwszym przejściem w update update'ujesz wszystkie 3 wpisy.
  4. Za pierwszym przejściem w update update'ujesz wszystkie 3 wpisy.
  5. Więc na końcu masz dane tylko z ostatniego produktu we wszystkich 3 wpisach.

Musisz w jakiś sposób połączyć unikalny wpis z tabeli zamowienia_has_czesci z jej odpowiednikiem w koszyku. Np. za pomocą ID z zamowienia_has_czesci.

1

Ok, teraz już rozumiem, tylko nie mam pomysłu jak to zrobić. Jest to mój pierwszy program i pierwsza w życiu styczność z php dlatego mało ogarniam.

1

Na początek, to po zrobieniu każdego insert możesz sobie do sesji wpisać dodatkowo ID z zamowienia_has_czesci. Potem tego użyjesz przy update.

1

Tylko ze u mnie dla danego zamówienia id w tabeli zamowienia_has_czesci jest takie samo w zależności od ilości produktów, może być nawet 100 z tym samym idZamowienia

1

Ale ja nie mówię od IdZamówienia, tylko o unikalnym ID dla rekordu w zamowienia_has_czesci

1

Id w tabeli zamowienia_has_czesci bez problemu mogę zrobić i ustawiać przy insercie unikalne wartości tylko co później, jak wpisze we where AND id=MAX(id) FROM zamowienia_has_czesci to mi i tak zmieni tylko ostatni rekord więc będzie to samo, musiałbym jakoś zaczynać np od 10 i do 13 update'owac jeśli będą 3 nowe rekordy dodane wcześniej insertem, nie wiem jak dać jeszcze ten warunek żeby pętla wykonała się tyle razy ile jest produktów w koszyku i zaczynała od rekordu np o 3 mniejszego niż ostatni i szła do ostatniego.

1

Chyba że jest możliwość do tego inserta ```

 $polaczenie = new mysqli($host,$db_user,$db_password,$db_name);
			foreach ($_SESSION['koszyk'] AS $koszyk) {
			$zapytanie = "INSERT INTO `zamowienia_has_czesci`(idZamowienia) SELECT idZamowienia FROM zamowienia ORDER BY idZamowienia DESC LIMIT 1";
			mysqli_query($polaczenie, $zapytanie);
			} ```

wkleić jakoś te dane idCzesci='{$koszyk['czesc']}', idKategorii ='{$koszyk['kategoria']}', idMarki ='{$koszyk['marka']}' żeby mi od razu wstawiało wszystko bo bazy,wtedy UPDATE by mi już nie był potrzebny. Ale chyba nie skoro w tym insercie kopiuje już wartości z tabeli zamowienia

1

Ale czemu robisz id=MAX(id) FROM zamowienia_has_czesci?? To jest bez sensu. Masz tam przypisać ID, które pobierzesz do produktu w koszyku po odpaleniu insert. Wstawiasz je do sesji, a potem przypisujesz w where.

foreach ($_SESSION['koszyk'] AS $koszyk) {
     $zapytanie = "UPDATE `zamowienia_has_czesci` SET idCzesci='{$koszyk['czesc']}', idKategorii ='{$koszyk['kategoria']}', idMarki ='{$koszyk['marka']}' WHERE id = '{$koszyk['id']}'";
     mysqli_query($polaczenie, $zapytanie);
}
0

A o coś takiego chodziło, teraz to ma sens przyznaję, ale mam jeszcze jedno pytanie, insert robię w innym pliku php niż mam tworzone zmienne w koszyku. Zamówienie jest wysyłane później, gdy już wszystkie zmienne w koszyku są ustawione. Więc jak pobrać to id z bazy i wrzucić do zmiennych w koszyku skoro ten plik nie ma podglądu do pliku w którym tworzę koszyk?

0

A i jeszcze pozostaje problem taki ze musiałbym jakoś zaliczać ile rekordów dodaje do bazy insertem i tyle samo potem pobierać i wrzucać do sesji

0

Okej, udało mi się coś takiego zrobić, dodałem w tabeli zamowienia_has_czesci kolumnę gdzie każdy wiersz ma swoje unikalne id, stworzyłem także zapytanie które mi pokazuje te wiersze, tyle ile razy były dodane więc już blisko sukcesu, pozostało teraz tylko stworzyć kod który mi to pobierze z bazy i wstawi do zmiennych sesyjnych ale nie potrafię tego zrobić. Mógłby mi ktoś pomóc stworzyć taki KOD razem z pętla , będę bardzo wdzięczny, moje zapytanie które pobiera odpowiednie rekordy jest takie SELECT Id FROM zamowienia_has_czesci WHERE idZamowienia=(SELECT MAX(idZamowienia) FROM zamowienia_has_czesci) ;. Dla ułatwienia zrobił bym to w osobnym pliku PHP i przeniósł do niego ten kod z UPDATE.

0

tyle udało mi się samemu zrobić,prosiłbym o pomoc w dokończeniu```

<?php
session_start();
print_r($_SESSION);

require_once"connect.php";
$polaczenie = new mysqli($host,$db_user,$db_password,$db_name);
			foreach ($_SESSION['koszyk2'] AS $koszyk) {
			$zapytanie = "Select id FROM zamowienia_has_czesci WHERE idZamowienia=(SELECT MAX(idZamowienia) FROM zamowienia_has_czesci)";
			mysqli_query($polaczenie, $zapytanie);
			}
	
		if(!isset($_SESSION['koszyk2'])) $_SESSION['koszyk2']=array();
		if(isset($_SESSION['koszyk2'])) echo 'Istnieje już koszyk2'.'<br>';
		//$tmp=array('idproduktu'=>$_SESSION['idprodukru']);
			//else $_SESSION['koszyk2']=$tmp;

		echo '<form action="" method="POST">';
		foreach ($_SESSION['koszyk2'] as $sub => $key)
		echo 'idproduktu: '.$key['idproduktu'];
		
		foreach ($_SESSION['koszyk2'] as $sub => $key)
		'idproduktu: '.$key['idproduktu'];
		 
		echo '</form>';
		
		
		$polaczenie = new mysqli($host,$db_user,$db_password,$db_name);
			foreach ($_SESSION['koszyk'] AS $koszyk) {
			$zapytanie = "UPDATE `zamowienia_has_czesci` SET idCzesci='{$koszyk['czesc']}', idKategorii ='{$koszyk['kategoria']}', idMarki ='{$koszyk['marka']}' WHERE id = '{$koszyk2['idproduktu']}'";
			mysqli_query($polaczenie, $zapytanie);
		}

?>
0

A i jeszcze pozostaje problem taki ze musiałbym jakoś zaliczać ile rekordów dodaje do bazy insertem i tyle samo potem pobierać i wrzucać do sesji

Eee, ale po co? Przecież po zrobieniu inserta nadal sesja istnieje. Przestanie istnieć dopiero później, gdy sama wygaśnie. A jeśli chcesz koszyk mieć pomiędzy sesjami, to wtedy raczej nie trzyma się go w sesji, tylko w bazie.

To na początek, już o tym wspominałem, ale jeszcze raz:

$zapytanie = "Select id FROM zamowienia_has_czesci WHERE idZamowienia=(SELECT MAX(idZamowienia) FROM zamowienia_has_czesci)";

Nie rób SELECT MAX(idZamowienia) FROM zamowienia_has_czesci). Powoduje to, że jeśli będziesz mieć kilku userów, to każdy dostanie ten sam wynik!

0

Wpisałem sobie w kod ten select który tu podałeś, jednak nie potrafię w dalszym ciągu włożyć tych pobranych danych do sesji, maksymalnie co udało mi się zrobić to tak żeby mi wyswiatlalo te pobrane dane w liście rozwijanej ale to nic mi nie daje.

0

Tak to wygląda

0

jest światełko w tunelu, zrobiłem tablice która mi pobiera odpowiednie dane z bazy i przetrzymuje,teraz tylko pozostało je jakoś wrzucić do sesji i update'ować odpowiednie wiersze,kod jest taki

session_start();
require_once"connect.php";
$link = mysqli_connect('localhost','root','','konfigurator2');
if(mysqli_connect_errno()){
	printf('nie udalo sie polaczyc:%s',mysqli_connect_error());
	exit();
}
if ($wynik = mysqli_query($link, "SELECT id FROM zamowienia_has_czesci WHERE idZamowienia=(SELECT MAX(idZamowienia) FROM zamowienia_has_czesci);"))
{
	$iloscRekordow = mysqli_num_rows($wynik);
echo "zapytanie zwróciło $iloscRekordow rekordow.";
}
while ($rekord = mysqli_fetch_array($wynik))
//{
	//echo 'Kategoria o nazwie: ' .$wynik["id"] . '<br/>';

print_r($rekord);

a wynik na screenie

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