Zagadnienie z mysql_query i echo

0
$username = "root";
$password = ".....";
$database = "test";
$connect = @mysql_connect($host, $username, $password) or die (@mysql_error());
$selectdb = @mysql_select_db($database, $connect) or die (@mysql_error());


if(isset($_POST['submit'])){
	$email = $_POST['email'];
	
if(mysql_query("SELECT email FROM newsletters WHERE email = '$email'")){	
	echo "Podany email ".$email." istnieje w newsleterze";
}
else{
	if(empty($email)){
		echo "Podaj swój adres email!";
		}
	else{
		
			@mysql_query("INSERT INTO newsletters SET 	email='$email'");
			echo "Dziękujemy za zapisanie się w newsletterze";			
		}
	}	
}

?>

Mam taki kodzik. Chciałem się dowiedzieć dokładnie jak działa mysql_query();
Przeszukałem manual itd. ,ale nadal nie wiem za bardzo.

Dokładnie chodzi o ten moment:

if(mysql_query("SELECT email FROM newsletters WHERE email = '$email'")){	
	echo "Podany email ".$email." istnieje w newsleterze";

Wszystko ładnie działa, ale zacząłem sobie testować i zamieniłem to na taki kod:

if(mysql_query("SELECT email FROM newsletters WHERE email = '$email'")){	
	echo mysql_query("SELECT email FROM newsletters WHERE email = '$email'"));

Jeśli tak zrobię to echo drukuje mi "Resource id #5"

Może mi ktoś wytłumaczyć dlaczego zwraca coś takiego i w takim razie jeśli to zwraca Resource id #5 to jak **if **na to reaguje, że zwraca **true ** i wykonuje blok instrukcji?

0

Może kurs poczytaj?

mysql_query zwraca Zasób - Resource (chyba, że zapytanie w ogóle się nie powiedzie - błąd składni/nazw tabel itd).
Dlatego Twój aktualny kod BŁĘDNIE zawsze będzie pisać, że się powiodło.

W takim zasobie, jeżeli wykonujesz zapytanie SELECT zawarte są wiersze pasujące do Twojego zapytania.
Kolejne wiersze możesz pobierać np. w ten sposób:

$result = mysql_query("SELECT email FROM newsletters WHERE email = '$email'"));
while ($row = mysql_fetch_assoc) {
  echo 'pasujący wiersz: '.$row['email']; // tutaj wstawiamy 'email', bo taką kolumnę wybierasz w SELECT
}

Spróbuj sobie dodać dwa takie same e-maile - powyższy kod zwróci Ci dwa kolejne wiersze. Spróbuj wybrać też inną kolumnę - np. ID (masz jakieś?) i wyświetlaj wraz z mailem.

Twój kod ma też wielką dziurę. Szukaj w Google: SQL Injection.

0

No tak, ale na jakiej zasadzie IF stwierdza, że mysql_query zwróciło true albo false. I wtedy odpowiednio wybiera blok instrukcji?

Jeśli SELECT znajdzie i wybierze maila w bazie danych to jest true tak?

I czym jest ten Zasób.

No i tak przy okazji. Gdzie jest poważna dziura?

0

mysql_query nie zwraca true.
mysql_query zwraca zasób, albo false.
if (zasób) przejdzie, czyli if (mysql_query('zapytanie')) - ZAWSZE przejdzie, jeżeli tylko zapytanie jest poprawne składniowo itp.

Generalnie z tego co widzę to nie bierz się za bazy danych jak nie rozumiesz składni samego języka.

Zasób ogólnie jest akurat bliżej nieokreślony, ale dostęp do danych z zasobu masz poprzez odpowiednie funkcje. W przypadku zapytań SELECT w MySQL zasób zawiera wiersze (czyli pojedynczy zestaw danych), które pasują do zapytania. Czyli np. listę e-maili dodanych do bazy w ostatnim tygodniu (jak ułożysz zapytanie odpowiednie). Te wiersze pobierasz POJEDYNCZO przy pomocy mysql_fetch_assoc()

Twój kod powinien mniej więcej wyglądać tak:

// coś przeciw SQL Injection
$sQuery = "SELECT COUNT(*) as cnt FROM newsletters WHERE email='$email'"; // pobiera ilość wierszy pasujących do warunku where i zapisuje je pod kluczem `cnt`
$rResource = mysql_query($sQuery);
if (!$rResource) { die(mysql_error()); } // jeżeli rResource jest false, czyli zapytanie się nie powiodło - przerwij działanie skryptu
$aRow = mysql_fetch_assoc($rResource);
if ($aRow['cnt']>0) {
  echo 'email jest w bazie danych';
}
else {
  echo 'emaila nie ma';
}

O dziurze - Używasz $_POST['email'] w zapytaniu.
Zapytanie wygląda tak (zamiast $_POST['email'] dla ułatwienia piszę $zmienna):
SELECT * FROM tabela WHERE email = '$zmienna';
Jeżeli użytkownik prześle Ci np. znak średnika, to Twoje zapytanie będzie wyglądać:
SELECT * FROM tabela WHERE email = `;
I skrypt się wysypie.
Może też wysłać: ' OR 1=1 --
Zapytanie będzie wyglądać:
SELECT * FROM tabela WHERE email = '' OR 1=1 --'
Takie zapytanie zawsze się powiedzie. Tutaj pewnie nie ma to dużego znaczenia, ale w przypadku logowania do panelu administracyjnego np. można takim sposobem zalogować się jako admin bez hasła!

Jak się przed tym zabezpieczać? Teoretycznie poprzez mysql_real_escape_string() [googluj]. Ale musisz pamiętać o magic_quotes [googluj], które czasem jest włączone na serwerach - czasem nie. Czyli dodatkowe warunki i sprawdzanie. W praktyce powinieneś używać biblioteki do MySQL, najlepiej dla Ciebie - PDO [googluj]. Tylko, że to są obiekty. O obiektach nie możesz mieć pojęcia, skoro nie wiesz jak działa if.

Ale generalnie to tak: książki Ci tu pisać nie będę. Nie rozumiesz podstaw, nie rozumiesz jak działa if, robisz kiepskie wcięcia uniemożliwiające płynny odczyt (przez człowieka) Twojego kodu, nie umiesz albo nie chcesz korzystać z Google (pisałem, żebyś poczytał o SQL Injection), nie umiesz korzystać z dokumentacji (tam masz przykłady jak korzystać z funkcji do MySQL, tam też znajdziesz czym jest Zasób) --- dlatego zamiast za forum, weź się za książkę. Postaraj się zrozumieć ją. Nie przeskakuj rozdziałów. Przykłady przepisuj, nie kopiuj i nie odpalaj i nie zapominaj o nich - to nie tak działa!

Co potrzebujesz:
DUŻO cierpliwości
Trochę samodzielności
Dużo chęci
Google
Dobrej książki

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