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

question-closed odc. #3 Kursu PHP - nie działa wpisywanie danych z formularza do bazy danych.

Object Storage Arubacloud
0 głosów
363 wizyt
pytanie zadane 17 marca 2016 w PHP przez KamQiX Dyskutant (9,090 p.)
zamknięte 17 marca 2016 przez KamQiX

Witam.

Zabrałem się z stworzenie rejestracji za pomocą kursu Pana Zelenta :) Wszystko śmiga ładnie z wyjątkiem jednej małej, ale jakże istotnej rzeczy - formularz rejestracji nie wpisuje danych do bazy danych.

Mój kod PHP:

<?php
	session_start();
	
	if ((isset($_SESSION['zalogowany'])) && ($_SESSION['zalogowany']==true))
	{
		header('Location: uzytkownik.php');
		exit();
	}
	
	if (isset($_POST['email']))
	{
		// Załóżmy, że udana walidacja
		$wszystko_OK=true;
		
		// Sprawdz nick
		$nick = $_POST['nick'];
		
		// Sprawdzenie dlugosci nicka
		if ((strlen($nick)< 3 || (strlen($nick)>20)))
		{
			$wszystko_OK=false;
			$_SESSION['e_nick']="Nazwa użytkownika musi mieć od 3 do 20 znaków!";
		}
		
		if (ctype_alnum($nick)==false)
		{
			$wszystko_OK=false;
			$_SESSION['e_nick']="Nazwa użytkownika zawiera niedozwolone znaki!";
		}
		
		// Sprawdzenie poprawnosci e-mail
		$email = $_POST['email'];
		$emailB = filter_var($email, FILTER_SANITIZE_EMAIL);
		
		if ((filter_var($emailB, FILTER_VALIDATE_EMAIL)==false) || ($email!=$emailB))
		{
			$wszystko_OK=false;
			$_SESSION['e_email']="Musisz podać poprawny adres e-mail!";
		}
		

		
		// Sprawdzanie poprawnosci hasla
		$haslo = $_POST['haslo'];
		$powtorzhaslo = $_POST['powtorzhaslo'];
		
		if ((strlen($haslo)< 8))
		{
			$wszystko_OK=false;
			$_SESSION['e_haslo']="Hasło jest za krótkie! (min. 8 znaków)";
		}
		
		if ((strlen($haslo)> 20))
		{
			$wszystko_OK=false;
			$_SESSION['e_haslo']="Hasło jest zbyt długie! (max. 20 znaków)";
		}
		
		if ($haslo!=$powtorzhaslo)
		{
			$wszystko_OK=false;
			$_SESSION['e_powtorzhaslo']="Hasła nie są takie same!";
		}
		
		$haslo_hash = password_hash($haslo, PASSWORD_DEFAULT);
		
		// Zaakceptowano regulamin?
		if (!isset($_POST['regulamin']))
		{
			$wszystko_OK=false;
			$_SESSION['e_regulamin']="Musisz akceptować regulamin, aby się zarejestrować!";			
		}
		
		// Lokalizacja
				
		$lokalizacja = $_POST['lokalizacja'];
		

		
		require_once "connect.php";
		mysqli_report(MYSQLI_REPORT_STRICT);
		
		try
		{
			$polaczenie = new mysqli($host, $db_user, $db_password, $db_name);
			if ($polaczenie->connect_errno!=0)
			{
				throw new Exception(mysqli_connect_errno());
			}
			else
			{
				// Czy email istnieje w bazie?
				$rezultat = $polaczenie->query("SELECT id FROM uzytkownicy WHERE email='$email'");
				
				if (!$rezultat) throw new Exception($polaczenie->error);
				
				$ile_takich_maili = $rezultat->num_rows;
				if ($ile_takich_maili>0)
				{
					$wszystko_OK=false;
					$_SESSION['e_email']="Taki e-mail jest już zajęty!";
				}
				
				
				
				// Czy nickname istnieje w bazie?
				$rezultat = $polaczenie->query("SELECT id FROM uzytkownicy WHERE user='$nick'");
				
				if (!$rezultat) throw new Exception($polaczenie->error);
				
				$ile_takich_nickow = $rezultat->num_rows;
				if ($ile_takich_nickow>0)
				{
					$wszystko_OK=false;
					$_SESSION['e_nick']="Taki użytkownik już istnieje!";
				}
				
				if ($wszystko_OK==true)
				{
					// Udało się utworzyć konto
					if ($polaczenie->query("INSERT INTO uzytkownicy VALUES (NULL, '$nick', '$haslo_hash', '$email', '$lokalizacja', male)"))
					{
						$_SESSION['udanarejestracja']=true;
						header('Location: witamy.php');
					}
					else
					{
						throw new Exception($polaczenie->error);
					}
				}
				
				$polaczenie->close();
			}
		}
		catch(Exception $e)
		{
			echo "<div class='bladserwera'><span style='color: #ffffff; font-size: 13px; font-weight: 600;'>Błąd serwera. Przepraszamy za utrudnienia</span></div>";
			//echo '<br>Info: '.$e;
		}

	}
?>

 

Wycięty fragment z poprzedniego kodu w który prawdopodobnie jest błąd:

<?php
				if ($wszystko_OK==true)
				{
					// Udało się utworzyć konto
					if ($polaczenie->query("INSERT INTO uzytkownicy VALUES (NULL, '$nick', '$haslo_hash', '$email', '$lokalizacja', male)"))
					{
						$_SESSION['udanarejestracja']=true;
						header('Location: witamy.php');
					}
					else
					{
						throw new Exception($polaczenie->error);
					}
				}
				
				$polaczenie->close();
			}
?>

Zamiast ifa wykonuje się else i wyskakuje mi informacja o błędzie połączenia z bazą danych. Ktoś wie dlaczego tak się dzieje? 

Z góry dziękuję za odpowiedź.

komentarz zamknięcia: Problem rozwiązany, wszystko działa jak należy.

3 odpowiedzi

+2 głosów
odpowiedź 17 marca 2016 przez Arkadiusz Waluk Ekspert (287,950 p.)
wybrane 17 marca 2016 przez KamQiX
 
Najlepsza
if ($polaczenie->query("INSERT INTO uzytkownicy VALUES (NULL, '$nick', '$haslo_hash', '$email', '$lokalizacja', male)"))

Co to jest to "male" na końcu? Bo ni to zmienna, ni to wartość do wstawienia, pewnie przez to zapytanie się nie wykonuje.

komentarz 17 marca 2016 przez CzlowiekSkrypt Nałogowiec (26,340 p.)
Wiedziałem że jak za długo będę myślał to ktoś mnie uprzedzi :D
komentarz 17 marca 2016 przez Arkadiusz Waluk Ekspert (287,950 p.)
Tu nie było nad czym myśleć, widać od razu że nie wiadomo co to jest :D

Ale też tak zawsze mam, ja odpowiadam, a kilka sekund wcześniej odpowiedź Comandeera, także wiem co czujesz :P
komentarz 17 marca 2016 przez KamQiX Dyskutant (9,090 p.)

To miała być domyślna wartość do wstawienia do pola kolumny "Płeć". W formularzu ustawiłem pole wyboru w którym jest do wyboru: "male" i "female", ale nie wiem jeszcze jak to zrobić by z formularza poprawnie się to dodawało do bazy danych, więc chciałem użyć domyślnej wartości tylko po to by sprawdzić czy skrypt rejestracji działa. Dopiero od 2 tygodni bawie się w programowanie webowe także podstaw z podstaw jeszcze nie znam :D Jakby komuś się zechciało i powiedział jak to mam zrobić to byłbym wdzięczny.

Konkretnie formularz rejestracji wygląda w taki sposób:

​<form method="post">
			
<input type="text" placeholder="Nazwa użytkownika*" name="nick" />
				
<?php
if (isset($_SESSION['e_nick']))
	{
		echo '<br><div style="margin-top: -10px; color:red; font-size: 11px;">'.$_SESSION['e_nick'].'</div>';
						unset($_SESSION['e_nick']);
	}
?>
	<input type="password" placeholder="Podaj swoje hasło*" name="haslo"/>
<?php
	if (isset($_SESSION['e_haslo']))
	{
	echo '<br><div style="margin-top: -10px; color:red; font-size: 11px;">'.$_SESSION['e_haslo'].'</div>';
	unset($_SESSION['e_haslo']);
	}
?>
	<input type="password" placeholder="Powtórz hasło*" name="powtorzhaslo"/>
<?php
	if (isset($_SESSION['e_powtorzhaslo']))
	{
	echo '<br><div style="margin-top: -10px; color:red; font-size: 11px;">'.$_SESSION['e_powtorzhaslo'].'</div>';
	unset($_SESSION['e_powtorzhaslo']);
	}
?>
	<input type="email" placeholder="Podaj adres e-mail*" name="email"/>
				
<?php
	if (isset($_SESSION['e_email']))
	{
	echo '<br><div style="margin-top: -10px; color:red; font-size: 11px;">'.$_SESSION['e_email'].'</div>';
	unset($_SESSION['e_email']);
	}
?>
	<input type="text" placeholder="Lokalizacja" name="lokalizacja"/>
	<select name="plec">
		<option selected="selected" value="wybierzplec">Wybierz płeć</option>
		<option value="female">Female</option>
		<option value="male">Male</option>
	</select><br><br>
		<label>
		<input type="checkbox" name="regulamin" /> <span class="p">Przeczytałem i akceptuję regulamin</span>
		</label>
<?php
	if (isset($_SESSION['e_regulamin']))
	{
	echo '<br><div style="color:red; font-size: 11px;">'.$_SESSION['e_regulamin'].'</div>';
	unset($_SESSION['e_regulamin']);
	}
?>
				
	<input type="submit" value="Zarejestruj" />
			
</form>
komentarz 17 marca 2016 przez saliwan22 Gaduła (3,110 p.)
Czy u was powyższy komentarz również się rozleciał>?
komentarz 17 marca 2016 przez CzlowiekSkrypt Nałogowiec (26,340 p.)
Rozsypał się jak Zachodnia Europa od napływu imigrantów :P
komentarz 17 marca 2016 przez KamQiX Dyskutant (9,090 p.)
Faktycznie. Najśmieszniejsze, że nie mam możliwości edycji tego komentarza. Problemem może być również to, że w formularzu jest właśnie to pole wyboru "plec" i skrypt nie wie gdzie ma go wpisać do bazy?
komentarz 17 marca 2016 przez saliwan22 Gaduła (3,110 p.)
To chyba po wczorajszych (i częściowo dzisiejszych) pracach...
komentarz 17 marca 2016 przez Arkadiusz Waluk Ekspert (287,950 p.)
Co? Jakich pracach? Problem z tymi komentarzami powstał po dodaniu głosów w górę przy komentarzach, prawdopodobnie wtedy wszystko przesunęło się w prawo i komentarze z np. kodem przestały się mieścić. Zgłaszałem to MZ w temacie o zmianach, ale niestety nic nie zostało zrobione.

KamQIX, możesz edytować komentarz tylko musisz pobawić się badaniem elementów strony z narzędzi przeglądarki i... np. ustawić szerokość diva o klasie qa-c-item-buttons na 300px. Wtedy guziczki będą znów widoczne :D Inna opcja - gdy napiszesz komentarz pod tym postem to nie odświeżaj strony - wtedy cała lista komentarzy pobiera się od nowa, ale bez głosów w górę i wszystko jest w porządku. Wiem, dziwaczne sposoby, ale cóż zrobić że mamy taki skrypt forum. Edycja jednak nic tu nie da, kod i tak będzie wychodził poza komentarz.

A co do Twojego problemu - wartość domyślną ustawia się w bazie, jeśli robisz tu wybór płci (pewnie na jakiś checkboxach) to sprawdź który został zaznaczony i wpisz odpowiednią wartość do bazy - podstaw normalnie jak pozostałe zmienne. Nie widzę sensu używania tu jakiejś wartości domyślnej.
komentarz 17 marca 2016 przez KamQiX Dyskutant (9,090 p.)

Właśnie nie są to checkboxy tylko takie pole wyboru:

<select name="plec">
	<option selected="selected" value="wybierzplec">Wybierz płeć</option>
	<option value="female">Female</option>
	<option value="male">Male</option>
</select>

 

Prawdopodobnie jeszcze źle zrobione, bo wydaje mi się, że wartość domyślna ("Wybierz płeć") nie powinna być w znaczniku option i nie powinna być w ogóle jako opcja do wyboru, ale jak mówiłem dopiero zaczynam i zrobiłem to w taki sposób. No i nie mam pojęcia jak takie pole wyboru wpisać do bazy.

komentarz 17 marca 2016 przez Arkadiusz Waluk Ekspert (287,950 p.)

Nie jest źle, jeśli chcesz tak to może być tak. Wystarczy tylko odczytać wartość selecta w PHP po name i będziesz miał to co wybrał użytkownik.

echo $_POST['plec'];

I już to masz - zwróci to co wybrana przez użytkownika opcja ma w value czyli albo "wybierzplec" albo "female" albo "male". Teraz wystarczy sobie sprawdzić ifem czy jest to co oczekujesz czyli female lub male. Jeśli nie to wyrzucić error że nie została wybrana płeć czy coś takiego. No a dalej to wystarczy przypisać to do jakiejś zmiennej i wrzucić do zapytania - jeśli masz kolumnę typu tekstowego. Jeśli nie, to możesz albo pozmieniać value tych opcji albo w PHP sobie to zamienić.

+2 głosów
odpowiedź 17 marca 2016 przez CzlowiekSkrypt Nałogowiec (26,340 p.)

Co to jest na końcu kwerendy za dziwadło -> , male)" 

Nie powinno być coś jak '$male' albo 'male' w apostrofach ? 

0 głosów
odpowiedź 17 marca 2016 przez KamQiX Dyskutant (9,090 p.)

Ok, dla testu zrobiłem teraz tak, że pole tekst jest zwykłym polem tekstowym.

Teraz wygląda to tak:

				if ($wszystko_OK==true)
				{
					// Udało się utworzyć konto
					if ($polaczenie->query("INSERT INTO uzytkownicy VALUES (NULL, '$nick', '$haslo_hash', '$email', '$lokalizacja' '$plec')"))
					{
						$_SESSION['udanarejestracja']=true;
						header('Location: witamy.php');
					}
					else
					{
						throw new Exception($polaczenie->error);
					}
				}

A wyżej dodałem: taką linijkę

$plec = $_POST['plec'];

Formularz w html wygląda tak:

<form method="post">
			
				<input type="text" placeholder="Nazwa użytkownika*" name="nick" />
				
				<?php
					if (isset($_SESSION['e_nick']))
					{
						echo '<br><div style="margin-top: -10px; color:red; font-size: 11px;">'.$_SESSION['e_nick'].'</div>';
						unset($_SESSION['e_nick']);
					}
				?>
				<input type="password" placeholder="Podaj swoje hasło*" name="haslo"/>
				<?php
					if (isset($_SESSION['e_haslo']))
					{
						echo '<br><div style="margin-top: -10px; color:red; font-size: 11px;">'.$_SESSION['e_haslo'].'</div>';
						unset($_SESSION['e_haslo']);
					}
				?>
				<input type="password" placeholder="Powtórz hasło*" name="powtorzhaslo"/>
				<?php
					if (isset($_SESSION['e_powtorzhaslo']))
					{
						echo '<br><div style="margin-top: -10px; color:red; font-size: 11px;">'.$_SESSION['e_powtorzhaslo'].'</div>';
						unset($_SESSION['e_powtorzhaslo']);
					}
				?>
				<input type="email" placeholder="Podaj adres e-mail*" name="email"/>
				
				<?php
					if (isset($_SESSION['e_email']))
					{
						echo '<br><div style="margin-top: -10px; color:red; font-size: 11px;">'.$_SESSION['e_email'].'</div>';
						unset($_SESSION['e_email']);
					}
				?>
				<input type="text" placeholder="Lokalizacja" name="lokalizacja"/>
				<input type="text" placeholder="Płeć" name="plec" /><br>
				<!--<select name="plec">
					<option selected="selected" value="wybierzplec">Wybierz płeć</option>
					<option value="female">Female</option>
					<option value="male">Male</option>
				</select><br><br>
				-->
				<label>
				<input type="checkbox" name="regulamin" /> <span class="p">Przeczytałem i akceptuję regulamin</span>
				</label>
				<?php
					if (isset($_SESSION['e_regulamin']))
					{
						echo '<br><div style="color:red; font-size: 11px;">'.$_SESSION['e_regulamin'].'</div>';
						unset($_SESSION['e_regulamin']);
					}
				?>
				
				<input type="submit" value="Zarejestruj" />
			
			</form>

Nadal nie działa :(

komentarz 17 marca 2016 przez Arkadiusz Waluk Ekspert (287,950 p.)

Wyżej napisałem Ci w komentarzu jak pobrać wartość z selecta bo pole tekstowe dla płci to raczej średnia opcja. A tutaj nie działa bo

if ($polaczenie->query("INSERT INTO uzytkownicy VALUES (NULL, '$nick', '$haslo_hash', '$email', '$lokalizacja' '$plec')"))

Brakuje Ci przecinka między '$lokalizacja' a '$plec'.

I oczywiście mam nadzieję, że kolumna w bazie jest typu tekstowego, inaczej jeśli w pole wpiszesz tekst to wiadomo że nie przejdzie.

komentarz 17 marca 2016 przez CzlowiekSkrypt Nałogowiec (26,340 p.)
A dlaczego cały select w formularzu jest zakomentowany ?
komentarz 17 marca 2016 przez KamQiX Dyskutant (9,090 p.)
Już wszystko świetnie działa. Faktycznie brakowało już tylko tego przecinka i zmieniłem na pole wyboru tak jak było wcześniej i wszystko śmiga jak należy. Dziękuję bardzo za pomoc. Sam pewnie bym tego jeszcze długo nie ogarnął.
komentarz 17 marca 2016 przez Arkadiusz Waluk Ekspert (287,950 p.)

@CzlowiekSkrypt 

Ok, dla testu zrobiłem teraz tak, że pole tekst jest zwykłym polem tekstowym

@KamQIX no to dobrze, cieszę się ;) 

komentarz 17 marca 2016 przez KamQiX Dyskutant (9,090 p.)
Ponieważ na moment chciałem go schować i przetestować formularz z polem tekstowym :)
komentarz 17 marca 2016 przez CzlowiekSkrypt Nałogowiec (26,340 p.)
Aha :P dobrze że już śmiga :P Błędy typu : brakujące przecinki i literówki to największe udręki, ileż ja czasu straciłem na takich głupotach :)

Podobne pytania

0 głosów
1 odpowiedź 500 wizyt
pytanie zadane 13 lutego 2020 w C i C++ przez kasialke Nowicjusz (230 p.)
0 głosów
2 odpowiedzi 1,760 wizyt
pytanie zadane 4 października 2016 w C i C++ przez Tymek Nowicjusz (160 p.)
0 głosów
1 odpowiedź 1,544 wizyt

92,576 zapytań

141,426 odpowiedzi

319,652 komentarzy

61,961 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

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy 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!

...