Zapytanie zwraca "Resource id #6" zamiast 1

0

Witajcie, postanowiłem na nowo przepisać mechanizm logowania, tak aby go skrócić, sprawić aby był bardziej czytelny i (co najważniejsze) móc go includować na każdej stronie.

Moja praca zatrzymała się na takim oto kodzie:

 <!--tymczasowy kontener na includa-->
<?php  
include 'includes\logowanie.php';
?>
<?php session_start(); ?>
<form action='<?php  echo $_SERVER['PHP_SELF'];?>' method='POST'>
	<input type="text" name='login'><br />
	<input type="text" name='haslo'><br />
	<input type="submit" value='Zaloguj' name='Zaloguj'>
</form>
<?php
//przypisujemy do nowych zmiennych wartości z tablicy POST która ma je z formularza na stronie login.php
if(!isset($_POST['Zaloguj'])) die('Witaj, zaloguj się');
if(empty($_POST['login'])) die('Witaj, nie podałeś loginu');
if(empty($_POST['haslo'])) die('Witaj, nie podałeś hasła');
$login = $_POST['login'];
$haslo = $_POST['haslo'];
include 'sqlLogin.php';

$zapytanie_login = mysql_query("SELECT 1 FROM `uzytkownik` WHERE login='$login'");
echo $zapytanie_login."<br>";
if ($zapytanie_login!=1) die('Nie ma takiego użytkownika');

		while ($rzad = mysql_fetch_array($zapytanie_login))
		{
			$dblogin = $rzad['1'];
			$dbhaslo = $rzad['2'];
			$dbtypkonta = $rzad['9'];
		}
		if ($login==$dblogin&&$haslo==$dbhaslo)
		{
			echo "sukces! zalogowany"; 
			$_SESSION['login']=$dblogin;
			$_SESSION['typkonta']=$dbtypkonta;
			$_SESSION['idUzytkownika']=$dbidUzytkownika;
		}
		else echo "Niepoprawne hasło";	
?> 

Gdy testuję formularz, zamiast otrzymać "1" otrzymuję "Resource id #6".

Szukałem w google i domyślam się że to przez includowanie, jednak nie znalazłem odpowiedzi jak to naprawić.

Na innym forum zablokowali mi temat i napisami, że to w każdym kursie znajdę i manualu, jednak ja szukałem i znalazłem na ten temat Jakieś teksty, jednak żaden nie omawiał mojego problemu.

Z góry dziękuję za pomoc

0
piotrek0 napisał(a)
$zapytanie_login = mysql_query("SELECT 1 FROM `uzytkownik` WHERE login='$login'");
echo $zapytanie_login."<br>";

Dostajesz dokładnie to, o co prosisz. :)

mysql_query() zgodnie z dokumentacją zwraca resource, a nie wynik zapytania.

Aby dostać wynik skorzystaj z mysql_fetch_array() lub innych funkcji z tej rodziny.

Na przykład:

$result = mysql_query("SELECT 1 FROM `uzytkownik` WHERE login='$login'");
$row = mysql_fetch_array( $result );
echo var_dump( $row );
0

Przyjrzyj się:

$zapytanie_login = mysql_query("SELECT 1 FROM `uzytkownik` WHERE login='$login'");
echo $zapytanie_login."<br>";
if ($zapytanie_login!=1) die('Nie ma takiego użytkownika');

Wykonujesz zapytanie MySQL (mysql_query), zwraca ono zasób (resource) lub FALSE jeśli zapytanie się nie powiodło. Domyślam się, że chciałeś pobrać numer dopasowanych rekordów, w takim razie warunek:

if ($zapytanie_login != 1)

Powinien wyglądać tak:

if (mysql_num_rows($zapytanie_login) != 1)

Czemu tak? A no właśnie dlatego, że $zapytanie_login zawiera resource. Gdyby owa zmienna była typu int i zawierała jedynkę, to potrzebny byłby cud, żeby funkcja mysql_fetch_array($zapytanie_login) wyciągnęła z tej jedynki wiersz tabeli.

0

Na początek chciałbym Wam podziękować, że odpowiedzieliście na tak głupie pytanie :)
Pisałem to w jakimś zaćmieniu.

Chodziło mi o to, aby dowiedzieć się czy taki rekord istnieje (login jest unikatowy). Jakby istniał dostałbym 1 jak nie to FALSE.

Wydaje mi się, że jak ułożę zapytanie "SELECT 1 FROM uzytkownik WHERE login='$login'" to otrzymam wartość int 1 jeżeli w bazie będzie login o który pytam, a jak nie będzie to otrzymam FALSE. Czy mam rację?

Mogę to zrobić inaczej, ale chciałbym aby kod był jak najkrótszy.

Wcześniej to wyglądało tak:

 <?php
session_start();
?>
<form action='glowna.php' method='POST'>
<input type="text" name='login'><br />
<input type="text" name='haslo'><br />
<input type="submit" value='Zaloguj' name='Zaloguj'>
</form>
<?php
//przypisujemy do nowych zmiennych wartości z tablicy POST która ma je z formularza na stronie login.php
if(!isset($_POST['Zaloguj'])) die('Witaj, zaloguj się');
	$login = $_POST['login'];
	$haslo = $_POST['haslo'];

//Sprawdzamy czy zmienne login i haslo nie są puste
if($login && $haslo)
{
//Jeżeli nie są to logujemy się do bazy
include 'sqlLogin.php';
//przypisujemy do zmiennej zapytanie zwracające wszystkie pola z rekordu który ma w polu login taki sam ciag znaków jak w zmiennej login czyli taki sam ciąg znaków jaki wprowadziliśmy do formularza na stronie login.php
$zapytanie_login = mysql_query("SELECT * FROM `uzytkownik` WHERE login='$login'");
echo $zapytanie_login;
//tworzymy zmienną, która zlicza ilość zwróconych rekordów, przez to że zapytanie ma warunek rekord powinien być jeden
$zliczanie_rekordów = mysql_num_rows($zapytanie_login);
//echo $zliczanie_rekordów.'<br />';

//jeżeli instrukcja warunkowa wykryje, że liczba rekordów nie równa się 0... (w tym momencie wiemy już że taki logi istnieje w bazie)
	if ($zliczanie_rekordów!=0)
	{
	//...to przypisze do zmiennych login i hasło użytkownika z bazy danych...
		while ($rzad = mysql_fetch_array($zapytanie_login))
		{
			$dblogin = $rzad['1'];
			$dbhaslo = $rzad['2'];
			$dbtypkonta = $rzad['9'];
			$dbidUzytkownika = $rzad['0'];
			echo $rzad['9'];
		}
		//...i jeżeli ten login i to hasło bedą taie same jak wprowadzone w formularzu...
		if ($login==$dblogin&&$haslo==$dbhaslo)
		{
		//...wtedy da link do strony i stworzy sesję z warością tablicową login równą loginowi pobranemu z bazy danych...
			echo "zalogowany<br /> <a href='uzytkownik.php'>;sassss<a>"; 
			$_SESSION['login']=$dblogin;
			$_SESSION['typkonta']=$dbtypkonta;
			$_SESSION['idUzytkownika']=$dbidUzytkownika;
			echo '<br />'.$dbidUzytkownika;
		}
		//...jeżeli jednak login lub hasło będą różne od tych w bazie wtedy wyświetli, że podałeś nieprawidłowe hasło
		else echo "Niepoprawne hasło";	
	 }
	 else echo "nie ma takiego użytkownika";
 }
 //jeśli jednak nie wprowadzimy loginu lub hasła wtedy zobaczymy informację:
else die("Wprowadź login i hasło!");
// jeżeli wprowadziliśmy poprawne hasło i login to mamy
?>
1

Na skróty nie polecisz. W przypadku zapytania SELECT 1 FROM ... WHERE ... i tak dostaniesz MySQL Resource który będzie zawierał jednoelementową tablicę array(1 => 1) jeśli jeden rekord się dopasował lub pusty resource (zero wierszy) jeśli nic się nie dopasowało. Najprościej więc po prostu użyć mysql_num_rows() zaraz po mysql_query(). Jeśli funkcja mysql_num_rows() zwróci więcej jeden, to znaczy że jest taki użytkownik, jeśli zero to nie ma takiego. Tak jak w moim poście wyżej.

0

No to trudno
Zrobiłem tak:

 <?php session_start(); ?>
<form action='<?php  echo $_SERVER['PHP_SELF'];?>' method='POST'>
	<input type="text" name='login'><br />
	<input type="text" name='haslo'><br />
	<input type="submit" value='Zaloguj' name='Zaloguj'>
</form>
<?php
//przypisujemy do nowych zmiennych wartości z tablicy POST która ma je z formularza na stronie login.php
if(!isset($_POST['Zaloguj'])) die('Witaj, zaloguj się');
if(empty($_POST['login'])) die('Witaj, nie podałeś loginu');
if(empty($_POST['haslo'])) die('Witaj, nie podałeś hasła');
$login = $_POST['login'];
$haslo = $_POST['haslo'];
include 'sqlLogin.php';

$zapytanie_login = mysql_query("SELECT 1 FROM `uzytkownik` WHERE login='$login'");

if (mysql_num_rows($zapytanie_login) != 1) die('Nie ma takiego użytkownika!!!');

$zapytanie_login_i_haslo = mysql_query("SELECT 1 FROM `uzytkownik` WHERE login='$login' AND haslo='$haslo'");
if (mysql_num_rows($zapytanie_login_i_haslo) != 1) die('Błędne hasło!!!');
echo "sukces! zalogowany"; 
while($rzad = mysql_fetch_array("SELECT * FROM `uzytkownik` WHERE login='$login")){
		$_SESSION['login']=$rzad['1'];
		$_SESSION['typkonta']=$rzad['9'];
		}
		echo $_SESSION['login'];
?>

Chyba lepiej niż to wyglądało kiedyś, a spełnia tę sama funkcję.
Co o tym myślicie?

Mam co prawda jeszcze problem z kodem od 24 linii, ale to już pikuś.

Dzięki wielkie, szczególnie Tobie Demonical Monk. Wypada się teraz zarejestrować :)

0

no i już sobie poradziłem:

 
<?php session_start(); ?>
<form action='<?php  echo $_SERVER['PHP_SELF'];?>' method='POST'>
	<input type="text" name='login'><br />
	<input type="text" name='haslo'><br />
	<input type="submit" value='Zaloguj' name='Zaloguj'>
</form>
<?php
if(!isset($_POST['Zaloguj'])) die('Witaj, zaloguj się');
if(empty($_POST['login'])) die('Witaj, nie podałeś loginu');
if(empty($_POST['haslo'])) die('Witaj, nie podałeś hasła');
$login = $_POST['login'];
$haslo = $_POST['haslo'];
include 'sqlLogin.php';

$zapytanie_login = mysql_query("SELECT * FROM `uzytkownik` WHERE login='$login'");

if (mysql_num_rows($zapytanie_login) != 1) die('Nie ma takiego użytkownika!!!');

$zapytanie_login_i_haslo = mysql_query("SELECT 1 FROM `uzytkownik` WHERE login='$login' AND haslo='$haslo'");
if (mysql_num_rows($zapytanie_login_i_haslo) != 1) die('Błędne hasło!!!');
echo "sukces! zalogowany"; 

while($rzad = mysql_fetch_array($zapytanie_login))
{
	$_SESSION['login']=$rzad['1'];
	$_SESSION['typkonta']=$rzad['9'];
}
?>
0

Miałem podobny problem - cięzko było znaleźć odpowiedź w necie.

Sam sobie poradziłem - chciałem uzyskać liczbę ostatniego rekordu w tabeli poprzez:
$odpowiedz = mysql_query("SELECT max(idzamowienia) FROM ".$nazwa_tabeli."_zamowienia");
Otrzymany wynik - resorce #9 zamiast konkretnej liczby.

Użyłem następnie:

if ($odpowiedz){
while ($txt = mysql_fetch_assoc($odpowiedz)){
$ret [] = $txt;
}

return $ret;
}

Funckja zwróciła tablicę. Aby wydobyć interesujący wynik należy użyć numery konkretnych komórek w tablicy:

$numer[0]['max(idzamowienia)']

0

Zalecam przepisać to na PDO.

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