PHP MySQL nie dodaje rekordów do bazy

0

Dobry wieczór,mam problem,pewnie błachy ale jednak a mianowicie INSERT nie dodaje mi rekordów bo bazy, chciałbym żeby to robił po naciśnięciu przycisku złóż zamówienie który defacto pojawia się tylko dla zalogowanych jednak gdy go nacisnę przechodzi mi do order.php ale w bazie nic nie zostaje dodane.Połączenie jest bo sprawdzałem. A 2 chciałbym żeby dodawało mi do bazy tyle rekordów ile jest wybranych produktów ale z tym samym id zamówienia albo chociaż klienta żebym później mogł dane zamówienie wyciągnać z tej bazy, na stornie wyswietla mi się to w osobnych linijkach jednak gdy chcę wyciągnąć wartości z $key to jest tam wartość tylko ostatniego wybranego produktu. oto mój kod koszyka i screen jak wygląda koszyk z kilkoma produktami ```

<?php 
 session_start();
	echo '<a href="powrot.php">Powrot do strony glownej</a></p>';
	print_r($_SESSION);
	print_r($_SESSION ['cena']);
	print_r($_SESSION['nazwa_czesci']);
	$_SESSION['sztuk']=$_POST['sztuk'];
	print_r($_SESSION ['sztuk']);
//session_destroy();
	echo "<html><head><meta http-equiv='content-type' content='text/html; charset=utf-8' /></head><body>";
	 
	 
	//require('szablon_koszyk.php');
 
?>
<div id="TRESC">
<?php
require_once"connect.php";

	if(!isset($_SESSION['koszyk'])) $_SESSION['koszyk']=array();        //sprawdzam czy jest koszyk
	 
	 
		echo 'Twoje wybrane produkty: '.'<br>';
	 
	if(isset($_SESSION['czesc'])){
	$tmp=array('nazwa'=>$_SESSION['nazwa_czesci'],'cena'=>$_SESSION['cena'],'ilosc'=>$_SESSION['sztuk'], );
	 
	 
	if(array_key_exists($_SESSION['czesc'], $_SESSION['koszyk'])) echo 'Istnieje już w koszyku część o podanym id'.'<br>';
	else $_SESSION['koszyk'][$_SESSION['czesc']]=$tmp;
	}
		
	 
		echo '<form action="usun.php" method="POST">';
		foreach ($_SESSION['koszyk'] as $sub => $key)
		echo 'nazwa czesci: '.$key['nazwa'].' ilosc sztuk: '.$key['ilosc'].'<font color="red">'.' cena za sztukę='.'</font>'.$key['cena'].' <input type="submit" name="" value="usuń"<br /><hr />';
		 
		echo '</form>';
		
		
	 
	 
	//zliczam ile zostało produktów w koszyku
	foreach ($_SESSION['koszyk'] as $sub => $key){
		$iloscproduktow++;
	}
	 
	// obliczam sumę produktów
	$suma=0;
	foreach ($_SESSION['koszyk'] as $sub => $key) $suma+=$key['cena']*$key['ilosc'];
		echo 'Łączna suma do zapłaty: ';
	$format_suma = number_format($suma, 2, '.', '');
		echo $format_suma.'<br>';
		echo 'Ilość produktów w koszyku: ';
	 
	 
	 
	if($iloscproduktow==0){
		echo 'brak produktów'.'<br>';
	$_SESSION['sztuk']=$iloscproduktow;}
		else{
			echo $iloscproduktow;
	$_SESSION['sztuk']=$iloscproduktow;}
	require_once"connect.php";
			$polaczenie = new mysqli($host,$db_user,$db_password,$db_name);
			$zapytanie = "INSERT INTO zamowienia (`idzamowienia`, `idCzesci`, `liczba_sztuk`, `kwota`) VALUES ('', '$_SESSION[czesc]', '$key[ilosc]', '$key[cena]')";
	
?>
</div>
<?php
	echo '<a href="czyszczenie.php">Wyczyść koszyk</a></p>';
	if(isset($_SESSION['zalogowany']))
	{
		require_once"connect.php";
			$polaczenie = new mysqli($host,$db_user,$db_password,$db_name);
			$zapytanie = "INSERT INTO zamowienia (idzamowienia, idCzesci, liczba_sztuk, kwota, numer_faktury, rodzaj_zaplaty, data_transakcji, zaplacono) VALUES ('1', '$_SESSION[czesc]', '$_SESSION[sztuk]', '$_SESSION[cena]','1234','przelew','1997-01-02','tak')";
		echo '<a href="order.php">Złóż zamówienie</a></p>';
	}else{
		echo "Aby złóżyc zamówienie zaloguj się</a></p>";
		echo "Jeśli nie masz konta załóż je. Kliknij tuatj => ";
		echo '<a href="rejestracja.php">Rejestracja - załóż darmowe konto!</a>';
	}
	

	

?>

screenshot-20190411224848.png

0

a w którym miejscy wg Ciebie się te zapytania wykonują (wskaż konkretną linijkę)

0

Wykonuje mi się wszystko oprócz linijek 55 - 57 i 65-68, kod wysyłania tam wstawiłem dwa razy, żeby zobaczyć czy to nie przez ifa gdzieś blokuje ale kicha, próbowałem tego inserta przerabiać na x sposobów, wkładać gdzie indziej ale nic z tego, chciałbym żeby był w tych linijkach 65-68,w ifie tak żeby wysyłał się tylko po naciśnięciu przycisku bo ten przycisk jest dostępny tylko dla zalogowanych, żeby mi nie wysyłało się dla każdego i nie zasmiecalo bazy. Wyświetlanie produktów jeden pod drugim to linie 30-34. Dane z tego chciałbym sobie jakoś gromadzić lub zapisywać żeby potem tyle ile jest wyników (wierszy) z produktami tyle dodawało rekordów bo bazy z jednakowym idZamowienia najlepiej albo jednakowym idKlienta. Bo po złożeniu zamówienia chciałbym dane z tabeli usunąć i zapisać w innej

0

Pomieszanie z poplątaniem...
Popraw przede wszystkim czytelność kodu. Pomijam już trzykrotne podpięcie connect.php itp.
Zapytanie z 66 linii wykona się za każdym przeładowaniem strony, gdy użytkownik będzie zalogowany, a to z 58 nawet gdy nie jest zalogowany.
Co do samego zapytania - Sprawdź przede wszystkim error.log, popraw quote'owanie zmiennych, wywal idzamowienia.
Można by długo pisać... Nigdy, absolutnie przenigdy nie wkładaj do bazy danych bezpośrednio z POSTa. Poczytaj o Post/Redirect/Get (https://en.wikipedia.org/wiki/Post/Redirect/Get)

0

Dobrze by było gdyby to z 66 się wykonywało chociaż raz, problem w tym że właśnie tego nie robi, do 58 jest włożone tylko chwilowo, żeby sprawdzić czy tam nie zadziała, to nie jest jeszcze gotowy kod, poprawki mogę wprowadzać jak mi zacznie to działać dopiero. Chcę aby insert był w ifie tj w 66 linijce i wykonywał się tylko po naciśnięciu przycisku złóż zamówienie.

0

Widzę, że to ślepy zaułek ;-)
Po linijce z zapytaniem wstaw

mysqli_query($polaczenie, $zapytanie);
0

dodałem,próbowałem też $rezultat = $polaczenie->query($zapytanie); ale nie działa ani to ani to

0

VICTORY!!! Jest sukces ale połowiczny,dodaje mi rekordy do bazy tyle że jest jeszcze taki mały problem a mianowicie dodaje po każdym odswieżeniu strony dla zalogowanego użytkowinka nowe rekordy. Jak mam zrobić aby dodawało tylko raz,po naciśnięciu przycisku złóż zamówienie??? Co dziwne dodaje mi 2 razy mniej rekordów ile jest wybranych sztuk,dla 2 sztuk dodaje 2 rekordy po 1 sztuce ale dla 4 sztuk dodaje już 2 rekordy po 2 sztuki,nie wiem dlaczego.Jest jeszcze 1 mały problem który odkryłem po kilku próbach, a mianowicie nie dodaje mi do bazy po tych odswieżeniach wszystkich produktów a wyłącznie ostatni wybrany.

0

Prześledziłem,udało mi się jak dotąd zrobić tyle ze już dodaje tylko 1 rekord z prawidłową ilością sztuk ale nadal to jest tylko rekord ostatniego wybranego produktu,tych które wcześniej wylądowały w koszyku nie uwzględnia tj nie pamięta. Chciałbym je jakoś zapamiętać i dodawać tyle rekordów ile produktów jest w koszyku i ile linijek widzę na stronie tylko nie mam pojęcia jak to zrobić

0

Czyli źle prześledziłeś algorytm. Zakomentuj sobie linię z wsadem do bazy. Podejrzyj zawartość zmiennych, które tam chcesz umieścić.
Wyświetlasz zawartość koszyka w pętli. Czemu nie zrobisz tego dla mysqli_query?

0

A co mi da zapetlenie mysqli_query skoro w zmiennych mam tylko ostatnie wybrane cechy produktu jak ilosc, cena itp? Nie mam ich nigdzie zapamietanych, a chciałbym właśnie jakoś mieć, dla każdego produktu jego cechy, wtedy już włożenie chyba by się powiodło no chyba że źle myślę. Chciałbym żeby one jakoś gdzieś się zapisywaly, żebym potem mógł je wyciągnąć, tak jak się wyświetlają na stronie, wtedy każda linia na stronie to byłby nowy rekord w bazie. Jednak najbardziej istotne w tej chwili jest dla mnie to aby wartości nie dodawały się po każdym odświeżeniu strony.

0

Sorka za opieszałość ale ja na razie mało wiem,to mój 1 program,pierwszy raz ma styczność z programowaniem. Włączyłem pokazywanie tego co siedzi w sesjach bo defacto tam są wszystkie wartości które uzywam w zapyatnie,tyle ze ilość jest nazwane jako sztuk.na 1 screenie wartość po wybraniu produktu,na drugim po odświeżeniu strony.Nie wiem czy to o to chodziło
screenshot-20190412172752.png

screenshot-20190412172803.png

usunałem żeby przesyłało do usun.php POST'a i teraz jak wyświetliłem $_SESSION['koszyk']; to dostałem coś takiego,to wygląda jak to co jest mi potrzebne,dla każdego produktu inne wartości tylko jak to umieścić w insercie żeby wsystko szło tam gdzie powinno??

screenshot-20190412174001.png

0

Ujmuj print_r w znaczniki <pre></pre>, Będzie to o niebo czytelniejsze.

kamil21 napisał(a):

tylko jak to umieścić w insercie żeby wsystko szło tam gdzie powinno??

Np. tak jak pisałem wcześniej: W PĘTLI

$polaczenie = new mysqli($host,$db_user,$db_password,$db_name);
foreach ($_SESSION['koszyk'] AS $koszyk) {
   $zapytanie = "INSERT INTO zamowienia (`idCzesci`, `liczba_sztuk`, `kwota`) VALUES ('{$koszyk['nazwa']}', '{$koszyk['ilosc']}', '{$koszyk['cena']}')";
   $polaczenie->query($zapytanie);
}

I ogarniaj nazewnictwo zmiennych. Nawet przy tak mało skomplikowanej strukturze już można się pogubić. Najlepiej od początku stosuj wszędzie angielskiej nazwy.

0

No już prawie prawie jesteśmy w domu,teraz jeśli dodam kilka produktów w koszyku i wtedy się dopiero zaloguję to jest ok ale przy dodawaniu kolejnego produktu do koszyka od nowa wpisuje rekordy+ ten nowy ustawiony. Jeśli od poczatku się jest zalogowanym to dla jednego produktu jest jeden rekord,przy dodaniu drugiego są już 3 bo 1+2,przy dodaniu trzeciego jest ich już 6 bo 1+2+3 itd. No i po odświeżeniu dodaje dalej od nowa tyle ile jest części no ale tego się spodziewałem o nic nie było działane przy odświeżaniu.

0
kamil21 napisał(a):

No już prawie prawie jesteśmy w domu,teraz jeśli dodam kilka produktów w koszyku i wtedy się dopiero zaloguję to jest ok ale przy dodawaniu kolejnego produktu do koszyka od nowa wpisuje rekordy+ ten nowy ustawiony. Jeśli od poczatku się jest zalogowanym to dla jednego produktu jest jeden rekord,przy dodaniu drugiego są już 3 bo 1+2,przy dodaniu trzeciego jest ich już 6 bo 1+2+3 itd. No i po odświeżeniu dodaje dalej od nowa tyle ile jest części no ale tego się spodziewałem o nic nie było działane przy odświeżaniu.

Brakuje ifów. No i podstawa: po dodaniu zamówienia do bazy unset($_SESSION['koszyk']);

0

A w którym miejscu mają być te ify? Unset sobie dam w następnym pliku tj.w order php bo tam mi może być jeszcze koszyk potrzebny

0

Mam teraz inny problem, posiadam tabele która ma 4 kolumny, w każdej kolumnie jest klucz obcy z innej tabeli, czy jest jakiś sposób abym w kodzie php mógł wstawiać do tej tabeli jedną wartość przekopiowana automatycznie z innej tabeli a do reszty kolumn dane które są zapisane w sesji? Nie mogę dać insert into tabelazkluczamiobcymi select * from tabela1 bo mi wywala błąd że reszta kolumn także musi być uzupełniona. Czy jakiś JOIN lub coś takiego pomoże w tej sytuacji? Mogłoby też być tak że to jedno pole wypełniało by się liczbami, z każdym dodaniem rekordu liczba o 1 większa bo się pokryja z tymi które są w drugiej tabeli jednak gdy nic nie wpisuje w insercie w tamtą wartość to nie dodaje 1,2,3 itd tylko zostawia puste pole. Domyślam się że to przez to że jest tam klucz obcy

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