Problem z zapytaniem i wyświetlaniem wyników

0

witam
Pisze aplikacje. Ma rezerwować pokoje w pensjonacie. Baze mam gotowa i zapytanie sprawdzające dostępnosc pokoi w zadanym terminie również. Zapytanie w phpmyadmin działa bez zarzutu. przepisalem je na php i teraz chce wyświetlić wyniki na stronie i tutaj zonk. Nie wiem czy dobrze to zrobiłem - ja już nie mam pomysłu

Dostaje bład: Fatal error: Call to a member function fetch_assoc() on a non-object in C:\wamp\www\hotel\sprawdz.php on line 105

ponizej daje kod który to robi - nie wiem gdzie jest błąd - może komuś sie uda coś wyniuchać. Dajcie znać

<?php
 
 
		$przyjazd = $_POST['przyjazd'];
		$odjazd = $_POST['odjazd'];
 
		$stmt = "SELECT numer_pokoju, cena,
						IF (
		mid( group_concat( data_od ORDER BY data_od DESC separator ' ' ) , 1, 10 ) < '$przyjazd', 
		mid( group_concat( data_do ORDER BY data_od DESC separator ' ' ) , 1, 10 ) ,
		mid( group_concat( data_do ORDER BY data_do DESC separator ' ' ) , 12, 10 )) AS wolna_data_od,
		IF (
		mid( group_concat( data_od ORDER BY data_od DESC separator ' ' ) , 1, 10 ) < '$odjazd', '~', 
		mid( group_concat( data_od ORDER BY data_od DESC separator ' ' ) , 1, 10 )) AS wolna_data_do
		FROM pokoje LEFT JOIN rezerwacje USING ( id_pokoju )
		WHERE data_od < '$przyjazd' or data_do >= '$odjazd' OR data_do is null
								GROUP BY numer_pokoju
							)";
			$result = $db_handle->query($stmt);
 			echo '<table border="1"><tr><td>Pokój nr</td> <td>Cena</td> <td>Przyjazd</td>    <td>Odjazd</td><td>Rezerwuj</td></tr>';  
   			while ($row = $result->fetch_assoc()) { 
      			$numer_pokoju = $row['numer_pokoju']; 
       			$cena = $row['cena']; 
     			echo '<tr><td>'. $numer_pokoju .'</td><td>'. $cena .'</td><td>'. $przyjazd .'</td><td>'. $odjazd .'</td><td><a href="rezerwacja.php?pokoj='. $row['id_pokoju'] .'?przyjazd='. $przyjazd .'?odjazd='. $odjazd. '"><img src="images/rezerwacja.jpg"></a></td></tr>'; 
					} 
    			echo '</table>';
 
 
				?>

Sprawdzcie to prosze i pomóżcie co jest w tym źle??

0

Call to a member function fetch_assoc() on a non-object

wywołanie funkcji klasy jest poprawne, ale musisz mieć prawidłowy obiekt.

$result = $db_handle->query($stmt);

To wyżej powinno zwrócić obiekt, czyli $result powinno być obiektem, a nie jest

$result->fetch_assoc()

Skorzystaj z funkcji print_r($result); i zobacz co tam jest w tym $result.

Tak na marginesie...
Nie należy zakładać, że w $_POST coś jest, lepiej pisać

if( isset($_POST['przyjazd']) ){
    $przyjazd = $_POST['przyjazd'];
}else{
    $przyjazd = 'twoja wartość domyślna';
}

Dodatkowo nie należy zakładać, że $_POST zawiera to co chcesz. Zobacz sql injection

0
LX napisał(a)

Call to a member function fetch_assoc() on a non-object

wywołanie funkcji klasy jest poprawne, ale musisz mieć prawidłowy obiekt.

$result = $db_handle->query($stmt);

Jak sprawdzic czy jest prawidłowy??

To wyżej powinno zwrócić obiekt, czyli $result powinno być obiektem, a nie jest

$result->fetch_assoc()

Skorzystaj z funkcji print_r($result); i zobacz co tam jest w tym $result.

Tak na marginesie...
Nie należy zakładać, że w $_POST coś jest, lepiej pisać

if( isset($_POST['przyjazd']) ){
    $przyjazd = $_POST['przyjazd'];
}else{
    $przyjazd = 'twoja wartość domyślna';
}

Dodatkowo nie należy zakładać, że $_POST zawiera to co chcesz. Zobacz sql injection

Niestety mi nie działa a po uzyciu finkcji print_r($result); niestety nic nie pokazuje.
moze zapytanie w sql nie dziala? moze zle je przepisalem na php.
Podaje kod sql jaki wpisuje w phpmyadmin:

SELECT numer_pokoju, cena,
IF (
mid( group_concat( data_od ORDER BY data_od DESC separator ' ' ) , 1, 10 ) < '2010-02-11', 
mid( group_concat( data_do ORDER BY data_od DESC separator ' ' ) , 1, 10 ) ,
mid( group_concat( data_do ORDER BY data_do DESC separator ' ' ) , 12, 10 )) AS wolna_data_od,
IF (
mid( group_concat( data_od ORDER BY data_od DESC separator ' ' ) , 1, 10 ) < '2010-02-11', '~', 
mid( group_concat( data_od ORDER BY data_od DESC separator ' ' ) , 1, 10 )) AS wolna_data_do
FROM pokoje LEFT JOIN rezerwacje USING ( id_pokoju )
WHERE data_od < '2010-02-11' or data_do >= '2010-02-11' OR data_do is null
group by numer_pokoju

Moze cos dopatrzycie

0
$stmt = "SELECT numer_pokoju, cena,
                                                IF (
                mid( group_concat( data_od ORDER BY data_od DESC separator ' ' ) , 1, 10 ) < '$przyjazd',
                mid( group_concat( data_do ORDER BY data_od DESC separator ' ' ) , 1, 10 ) ,
                mid( group_concat( data_do ORDER BY data_do DESC separator ' ' ) , 12, 10 )) AS wolna_data_od,
                IF (
                mid( group_concat( data_od ORDER BY data_od DESC separator ' ' ) , 1, 10 ) < '$odjazd', '~',
                mid( group_concat( data_od ORDER BY data_od DESC separator ' ' ) , 1, 10 )) AS wolna_data_do
                FROM pokoje LEFT JOIN rezerwacje USING ( id_pokoju )
                WHERE data_od < '$przyjazd' or data_do >= '$odjazd' OR data_do is null
                                                                GROUP BY numer_pokoju
                                                        )";
?>

Chodzi mi o linijki:

"mid( group_concat( data_od ORDER BY data_od DESC separator ' ' ) , 1, 10 ) < '$przyjazd',
mid( group_concat( data_od ORDER BY data_od DESC separator ' ' ) , 1, 10 ) < '$odjazd', '~',
WHERE data_od < '$przyjazd' or data_do >= '$odjazd' OR data_do is null"

Jeśli wstawiasz do zapytania zmienne nie mogą one być wewnątrz stringa. Nie zostaną wyłapane prawdziwe wartości. Poprawny zapis powinien wyglądać tak:

$stmt = "SELECT numer_pokoju, cena,
                                                IF (
                mid( group_concat( data_od ORDER BY data_od DESC separator ' ' ) , 1, 10 ) < '".$przyjazd."',
                mid( group_concat( data_do ORDER BY data_od DESC separator ' ' ) , 1, 10 ) ,
                mid( group_concat( data_do ORDER BY data_do DESC separator ' ' ) , 12, 10 )) AS wolna_data_od,
                IF (
                mid( group_concat( data_od ORDER BY data_od DESC separator ' ' ) , 1, 10 ) < '".$odjazd."', '~',
                mid( group_concat( data_od ORDER BY data_od DESC separator ' ' ) , 1, 10 )) AS wolna_data_do
                FROM pokoje LEFT JOIN rezerwacje USING ( id_pokoju )
                WHERE data_od < '".$przyjazd."' or data_do >= '".$odjazd."' OR data_do is null
                                                                GROUP BY numer_pokoju
                                                        )";
?>
0

Jak sprawdzic czy jest prawidłowy??

funkcja is_object()

w sql zapytaj o cokolwiek innego i sprawdź co otrzymujesz Np SELECT * FROM jakas tabela

Żeby rozwiązać problem musisz dowiedzieć się co zwraca funkcja klasy obsługującej bazę danych $db_handle->query(). Nawet jak zapytanie nic nie zwraca to wszystko powinno śmigać tak czy siak.
Jeśli $db_handle->query() zwraca np false to nie ma sensu $result->fetch_assoc(). Innymi słowy musisz wiedzieć co zwraca $db_handle->query() w różnych przypadkach, np błąd, brak rekordów.

Xingu Nie wiem o co ci chodzi, że nie można używać czegoś takiego "zmienna x: $x"? To jest ok.

0

Męczycie się zamiast sprawdzić:

$db->error()
$db->last_error()

Czy jak to się tam nazywa

0

Chodzi mi o linijki:

"mid( group_concat( data_od ORDER BY data_od DESC separator ' ' ) , 1, 10 ) < '$przyjazd',
mid( group_concat( data_od ORDER BY data_od DESC separator ' ' ) , 1, 10 ) < '$odjazd', '~',
WHERE data_od < '$przyjazd' or data_do >= '$odjazd' OR data_do is null"

Jeśli wstawiasz do zapytania zmienne nie mogą one być wewnątrz stringa. Nie zostaną wyłapane prawdziwe wartości. (...)

A to niby dlaczego? Taka jest już właściwość języka PHP, że stringi określane w podwójnych cudzysłowiach są przetwarzane i wstawiane są tam wartości zmiennych. Zapis jak najbardziej poprawny!*

*) oczywiście, jeżeli przemilczymy zagrożenie związane z SQL Injection.

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