Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [MySQL][PHP]Sprawdzanie zajętych miejsc
Forum PHP.pl > Forum > Przedszkole
dymek3r
Witam.
Pisze skrypt rezerwacji w kinie i stanąłem w miejscu gdzie sprawdzam zajęte miejsca.
Przeszukuję bazę
  1. $result = mysql_query("SELECT * FROM `rezerwacje` WHERE dzien='$dzien' and godzina='$godzina' and film='$tytul' ORDER BY `ID`");

W bazie mam wpisane w kolumnie "miejsce" wartosci (numery miejsc) takie jak: A1, A4, A5 itd
A to jest mój kod dla wyświetlania jednego rzędu
  1. <?
  2. $i=1;
  3. $row = mysql_fetch_assoc($result) ;
  4.  
  5. while ($i <=20) {
  6.  
  7.  
  8. if ($row['miejsce'] === 'A'.$i.'') {
  9. echo '<div class="zajete"><p>A'.$i.'</p></div>';
  10. } else {
  11. echo '<a href="kino.php?dzen='.$dzien.'&tytul='.$tytul.'&godzina='.$godzina.'&miejsce=A'.$i.'"><div class="wolne"><p>A'.$i.'</p></div></a>';
  12. }
  13. $i++;
  14. }
  15. ?>
  16.  

Problem w tym, że zwraca mi tylko jedno miejsce, nawet jeśli jest ich kilka.
Myślałem nad tym, żeby wpisywało dane do tablicy i wtedy skorzystać z funkcji in_array().

Co o tym myślicie?
emstawicki
mysql_fetch_assoc
Zwraca wiersz. W manualu przykład zastosowania mysql_fetch_assoc oraz pętli while.

Proponuję przechowywać w bazie również miejsce rezezerwacji.
IAmBoskiM
Po pierwsze, rozszerzenie mysql jest zdeprecjonowane przez specyfikację PHP 5 i usunięte w PHP 7. Zalecam korzystanie albo z mysqli, albo z PDO.

Do tej pętli co zrobiłeś o wiele lepiej użyć pętli for.

  1. <?php
  2. $conn = mysqli_connect($host, $dbuser, $userpwd, $dbname); // skoro zacząłeś z rozszerzeniem mysql to nie będę się bawił w PDO
  3. $qry = mysqli_query($conn, $sql); // nie chce mi się przepisywać ani kopiować tego sqla
  4. $ile = mysqli_affected_rows($conn);
  5. $result = mysqli_fetch_all($qry, MYSQLI_ASSOC);
  6. for ($i = 0; $i < $ile; $i++) {
  7. if ($result['miejsce'] === 'A'.$i.'') {
  8. echo '<div class="zajete"><p>A'.$i.'</p></div>';
  9. } else {
  10. echo '<a href="kino.php?dzen='.$dzien.'&tytul='.$tytul.'&godzina='.$godzina.'&miejsce=A'.$i.'"><div class="wolne"><p>A'.$i.'</p></div></a>'; // z tego co się domyślam te zmienne zostały już zdefiniowane przed połączeniem z bazą danych
  11. }
  12. }
dymek3r
Mimo dodania pętli for zamiast while wyświetla mi tylko jedno miejsce...
Jest to program na zaliczenie więc chyba nie ma to większego znaczenia, ale na przyszłość będę używał php 7:) Poza tym pewnie musiałbym pisać wszystko od nowa a trochę mi sie śpieszy.

Jeśli chodzi o miejsca w bazie danych to są wpisane tylko te zarezerwowane więc z tym liczeniem ilości miejsc przez zmienną $ile nie wyjdzie.

Znalazłem coś takiego jak SELECT SQL_CALC_FOUND_ROWS SQL_NO_CACHE i wyświetla mi wszystkie:

  1. $result= mysql_query("SELECT SQL_CALC_FOUND_ROWS SQL_NO_CACHE * FROM rezerwacje WHERE dzien='$dzien' and godzina='$godzina' and film='$tytul' ORDER BY ID;");


Bo za pomocą tego wyświetla mi tylko jedno miejsce:
  1. $result = mysql_query("SELECT * FROM `rezerwacje` WHERE dzien='$dzien' and godzina='$godzina' and film='$tytul' ORDER BY `ID`");


Teraz musze jakoś połączyć to z if'em i pętlą for. czyli mam kod który wypisuje mi tylko miejsca zarezerwowane (np. A7, A8):
  1. while ($row= mysql_fetch_array($result, MYSQL_ASSOC)) {
  2.  
  3. echo $row["miejsce"];
  4.  
  5. }



I kod który po kolei sprawdza miejsca (czy A1 jest w bazie, czy A2 jest w bazie) i wyświetla odpowiednią klase w css.(tutaj wyświetla mi tylko jedno miejsce):
  1. for ($i = 1; $i <= 20; $i++) {
  2.  
  3. if ($row['miejsce'] === 'A'.$i.'') {
  4. echo '<div class="zajete"><p>A'.$i.'</p></div>';
  5. } else {
  6. echo '<a href="kino.php?dzen='.$dzien.'&tytul='.$tytul.'&godzina='.$godzina.'&miejsce=A'.$i.'"><div class="wolne"><p>A'.$i.'</p></div></a>';
  7.  
  8. }
  9.  
  10. }


Nie rozumiem dlaczego gdy użyje tego kodu
  1. while ($row2 = mysql_fetch_array($result2, MYSQL_ASSOC)) {
  2.  
  3. echo $row2["miejsce"];
  4.  
  5. }

to wypisze mi wszystkie miejsca

A jak użyje

  1. for ($i = 1; $i <= 20; $i++) {
  2.  
  3. if ($row['miejsce'] === 'A'.$i.'') {
  4. echo '<div class="zajete"><p>A'.$i.'</p></div>';
  5. } else {
  6. echo '<a href="kino.php?dzen='.$dzien.'&tytul='.$tytul.'&godzina='.$godzina.'&miejsce=A'.$i.'"><div class="wolne"><p>A'.$i.'</p></div></a>';
  7.  
  8. }
  9.  
  10. }


To wyświetla mi tylko jedno...


IAmBoskiM
Popełniłem błąd. Już widzę gdzie. Poprawiony kod:
  1. <?php
  2. $conn = mysqli_connect($host, $dbuser, $userpwd, $dbname); // skoro zacząłeś z rozszerzeniem mysql to nie będę się bawił w PDO
  3. $qry = mysqli_query($conn, $sql); // nie chce mi się przepisywać ani kopiować tego sqla
  4. $result = mysqli_fetch_all($qry, MYSQLI_ASSOC);
  5. for ($i = 1; $i < 20; $i++) {
  6. if ($result[$i - 1]['miejsce'] === 'A'.$i.'') { // zapomniałem, że mysqli_fetch_all tworzy tablicę dwuwymiarową
  7. echo '<div class="zajete"><p>A'.$i.'</p></div>';
  8. } else {
  9. echo '<a href="kino.php?dzen='.$dzien.'&tytul='.$tytul.'&godzina='.$godzina.'&miejsce=A'.$i.'"><div class="wolne"><p>A'.$i.'</p></div></a>'; // z tego co się domyślam te zmienne zostały już zdefiniowane przed połączeniem z bazą danych
  10. }
  11. }
  12. ?>


Sorrka.

Przy okazji, jeżeli potrzebujesz tylko sprawdzenia czy miejsce jest zajęte czy nie to nie pobieraj wszystkiego z bazy danych, tylko samą kolumnę miejsce.

I ogólnie to, czy użyjesz while czy for nie robi różnicy, tylko w tym wypadku pętla for bardziej się do tego nadawała.
dymek3r
A dałbyś rade przekształcić to w PHP 5?

Co do lini z if'em, czy nie jest tak, że operator "===" sprawdza tylko pierwszy wynik w tablicy i dlatego reszte miejsc mi pomija?
IAmBoskiM
MySQLi można śmiało używać w PHP 5. Reszta kodu też dostępna w PHP 5.

Co do === to dopiero teraz to zauważyłem haha.gif. Ogółem ten operator nijak wpływa na ilość powtórzeń czy coś. On sprawdza tylko czy dwie wartości są identyczne; ten sam rodzaj (czyli np. czy obie wartości to string) oraz czy mają taką samą wartość. Czyli np.:

  1. 'string' === 'string2'; // zwróci false
  2. 1 === 1; // true
  3. 1 == '1'; // true; wartości są te same
  4. 1 === '1'; // false albowiem pierwsza jedynka to int, a druga to string, a zatem nie są identyczne


Ogółem możesz to zamienić na ==, efekt będzie najprawdopodobniej ten sam.

Tfuuuuuuuuu ja widzę same błędy robię. Nie stosuj tego kodu. Zauważyłem, że mysqli_fetch_all() w tym wypadku jest złą ideą. Zastosuj to:
  1. while ($row = mysqli_fetch_assoc($qry)) {
  2. for ($i = 1; $i <= 20; $i++) {
  3. if ($row['miejsce'] == 'A'.$i) {
  4. echo '<div class="zajete"><p>A'.$i.'</p></div>';
  5. } else {
  6. echo '<a href="kino.php?dzen='.$dzien.'&tytul='.$tytul.'&godzina='.$godzina.'&miejsce=A'.$i.'"><div class="wolne"><p>A'.$i.'</p></div></a>'; // z tego co się domyślam te zmienne zostały już zdefiniowane przed połączeniem z bazą danych
  7. }
  8. }
  9. }
dymek3r
Nie wiem czemu ale wyskakuje mi błąd, że funkcja mysqli_fetch_assoc jest niezdefiniowana.
Użyłem mysql_fetch_array tyle, że pokazało mi się to w dwóch liniach. Jedno miejsce zajęte w jednej lini, a drugie zajęte w drugiej lini. Akurat dwa miejsca są w bazie.
Pewnie przez pętle while...


Dobra poradziłem sobie ale innym sposobem. biggrin.gif
Użyłem mysql_num_rows do sprawdzenia czy dany numer jest w bazie
Coś takiego:
  1. for ($i = 1; $i <= 20; $i++) {
  2. $nr = 'A'.$i.'';
  3. $query ="SELECT 'miejsce' FROM `rezerwacje` WHERE dzien='$dzien' and godzina='$godzina' and film='$tytul' AND `miejsce` = '$nr' ";
  4. $result3 = mysql_query($query);
  5. if(mysql_num_rows($result3) > 0) {
  6. echo '<div class="zajete"><p>A'.$i.'</p></div>';
  7. } else {
  8. echo '<a href="kino.php?dzen='.$dzien.'&tytul='.$tytul.'&godzina='.$godzina.'&miejsce=A'.$i.'"><div class="wolne"><p>A'.$i.'</p></div></a>'; // z tego co się domyślam te zmienne zostały już zdefiniowane przed połączeniem z bazą danych
  9. }
  10.  
  11. }

Ale dzięki za pomoc!
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.