Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP][SQL] Przeszukiwanie bazy danych. Wyciaganie ze zmiennej jej czesci.
Forum PHP.pl > Forum > Bazy danych > MySQL
Gallar
Witam serdecznie.
Od dłuższego czasu głowie się stworzeniem wyszukiwarki.

Problem - który próbowałem ugryźć na kilkanaście sposobów - wygląda następująco:
Posiadam dwie bazy danych MySQL 'mieszkaniac5' i 'mieszkaniac6'.
W bazach interesują nas kolumny:
'bud' - przybiera wartości dla mieszkaniac5 1-2, dla mieszkaniac6 3-5;
'nr';
'pietro';
'pow_uzyt';
'taras';
'ogródek';
'ilosc_pokoi';
'price'

podejście numer 1:
index.html
  1. <?php [codebox]<html>
  2. <script typ="text/javascript" src="grid.js"></script>
  3. <link href="grid.css" type="text/css" rel="sytlesheet"/>
  4. </head>
  5. <body onlaod="init();">
  6. <align="center">
  7. <form action="grid.php" method="post">
  8. Cena:<br>
  9. Od: <input type="text" name="AA" /> do <input type="text" name="AB" />
  10. <br>
  11. Wielkość w m2:<br>
  12. Od: <input type="text" name="BA" /> do <input type="text" name="BB" />
  13. <br>
  14. Ilość pokoi:<br>
  15. Od: <input type="text" name="CA" /> do <input type="text" name="CB" />
  16. <br>
  17. Piętro:<br>
  18. Od: <input type="text" name="EA" /> do <input type="text" name="EB" />
  19. <br>
  20. Nr. mieszkania: <input type="text" name="FA" />
  21. <br>
  22. <br>
  23. <input type="submit" value="Szukaj!" />
  24. </form>
  25. </align>
  26. </body>
  27. </html>[/codebox]
  28. ?>

grid.php
  1. CODE
    <?php
  2. // program wyszukiwarki - grid.php
  3. // wyświetlenie nagłówka
  4. echo'<h2>Wyniki wyszukiwania</h2>';
  5. // usunięcie niepotrzebnych białych znaków
  6. $_post['AA']=trim($_post['AA']);
  7. $_post['AB']=trim($_post['AB']);
  8. $_post['BA']=trim($_post['BA']);
  9. $_post['BB']=trim($_post['BB']);
  10. $_post['CA']=trim($_post['CA']);
  11. $_post['CB']=trim($_post['CB']);
  12. $_post['EA']=trim($_post['EA']);
  13. $_post['EB']=trim($_post['EB']);
  14. $_post['F']=trim($_post['F']);
  15.  
  16. $AA = $_post['AA'];
  17. $AB = $_post['AB'];
  18. $BA = $_post['BA'];
  19. $BB = $_post['BB'];
  20. $CA = $_post['CA'];
  21. $CB = $_post['CB'];
  22. $EA = $_post['EA'];
  23. $EB = $_post['EB'];
  24. $F = $_post['F'];
  25.  
  26. require_once ('error_handler.php');
  27. require_once ('config.php');
  28. $mysqli=mysqli_connect ('xxx', 'xxx', 'xxx', 'xxx');
  29. $query="SELECT 'bud', 'nr', 'pietro', 'pow_uzyt', 'taras', 'ogrodek', 'ilosc_pokoi', 'price' FROM mieszkaniac5 WHERE pietro BETWEEN '{$EA}' AND '{$EB}' OR pow_uzyt BETWEEN '{$BA}' AND '{$BB}' OR ilosc_pokoi BETWEEN '{$CA}' AND '{$CB}' OR price BETWEEN '{$AA}' AND '{$AB}' OR nr='{$F}'" ;
  30. $results=$mysqli->query($query) or die( mysql_error ()) ;
  31. // ustalenie ilości wyszukanych obiektów
  32. if(empty($results))
  33. // jeśli nie, to wyświetl komunikat i zakończ działanie skryptu
  34. {
  35. die('Formularz wypełniony niepoprawnie! Nie można wyświetlić wyników wyszukiwania!');
  36. }
  37. // jeśli jednak dane są wpisane poprawnie
  38. else
  39. {
  40. $obAmount=mysql_num_rows($results); // TU WYSTĘPUJE BŁĄD
  41. // wyswietlenie iloœci wyszukanych obiektów
  42. echo'Znaleziono: '.$obAmount.'<br /><br />';
  43.  
  44. for($x=0;$x<$obAmount;$x++)
  45. {
  46. // przekształcenie danych na tablicę
  47. $row=mysql_fetch_assoc($results);
  48. // wyœwietlenie numeru identyfikacyjnego
  49. echo $x+1;
  50. echo '. ';
  51. // wyœwietlenie nazwy produktu
  52. echo $row['pr_name'];
  53. echo'<br />';
  54. }
  55. }
  56. // zamknięcie połączenia
  57. mysqli_close($mysqli);
  58. // koniec aplikacji
  59.  
  60. ?>


Niestety występuję błąd - jakby zmienne były permanentnie puste...
Pomijam w tym momencie problem dwóch tabel w bazie...

Podejście numer dwa:
index wygląda tak samo
za to w grid:
  1. CODE
    <?php
  2. // program wyszukiwarki - grid.php
  3. // wyświetlenie nagłówka
  4. echo'<h2>Wyniki wyszukiwania</h2>';
  5. // usunięcie niepotrzebnych białych znaków
  6. $_post['AA']=trim($_post['AA']);
  7. $_post['AB']=trim($_post['AB']);
  8. $_post['BA']=trim($_post['BA']);
  9. $_post['BB']=trim($_post['BB']);
  10. $_post['CA']=trim($_post['CA']);
  11. $_post['CB']=trim($_post['CB']);
  12. $_post['EA']=trim($_post['EA']);
  13. $_post['EB']=trim($_post['EB']);
  14. $_post['F']=trim($_post['F']);
  15.  
  16. $AA = $_post['AA'];
  17. $AB = $_post['AB'];
  18. $BA = $_post['BA'];
  19. $BB = $_post['BB'];
  20. $CA = $_post['CA'];
  21. $CB = $_post['CB'];
  22. $EA = $_post['EA'];
  23. $EB = $_post['EB'];
  24. $F = $_post['F'];
  25.  
  26. require_once ('error_handler.php');
  27. require_once ('config.php');
  28. $mysqli=mysqli_connect ('xxx', 'xxx', 'xxx', 'xxx');
  29. $query="SELECT 'bud', 'nr', 'pietro', 'pow_uzyt', 'taras', 'ogrodek', 'ilosc_pokoi', 'price' FROM mieszkaniac5 WHERE pietro BETWEEN '$EA' AND '$EB' OR pow_uzyt BETWEEN '$BA' AND '$BB' OR ilosc_pokoi BETWEEN '$CA' AND '$CB' OR price BETWEEN '$AA' AND '$AB' OR nr='$F'" ;
  30. $results=$mysqli->query($query) or die( mysql_error ()) ;
  31. // ustalenie ilości wyszukanych obiektów
  32. if(empty($results))
  33. // jeśli nie, to wyświetl komunikat i zakończ działanie skryptu
  34. {
  35. die('Formularz wypełniony niepoprawnie! Nie można wyświetlić wyników wyszukiwania!');
  36. }
  37. // jeśli jednak dane są wpisane poprawnie
  38. else
  39. {
  40. $obAmount=mysql_num_rows($results); // TU WYSTĘPUJE BŁĄD
  41. // wyswietlenie iloœci wyszukanych obiektów
  42. echo'Znaleziono: '.$obAmount.'<br /><br />';
  43.  
  44. for($x=0;$x<$obAmount;$x++)
  45. {
  46. // przekształcenie danych na tablicę
  47. $row=mysql_fetch_assoc($results);
  48. // wyœwietlenie numeru identyfikacyjnego
  49. echo $x+1;
  50. echo '. ';
  51. // wyœwietlenie nazwy produktu
  52. echo $row['pr_name'];
  53. echo'<br />';
  54. }
  55. }
  56. // zamknięcie połączenia
  57. mysqli_close($mysqli);
  58. // koniec aplikacji
  59.  
  60. ?>

Błąd ten sam
Następnie zamiast zmiennych próbowałem dać zmienne $post_('wartość') - również nici.

Następnie umieściłem wszystko w jednym pliku 'index.php'
błąd dalej się powtarzał.

Zastanawiałem się nad rozwiązaniem pobrania całych tabel i rozwiazania tego na zasdzie:
if (empty('AA'))
{ if (empty('AB'))
i tak dalej...
else
{ sprawdzenie pozostałych zmiennych

$zmienna_tablicy_mieszkaniac5 = $zmienna_tablicy_mieszkaniac5 - wszystkie pozycje, gdzie 'price' < wartości podanej w 'AA', ale szczerze przyznam, że po pierwsze wydaje mi się to strasznie pracochłonne, a po drugie nie wiem jak zmienić zawartość tej zmiennej...
Za szybką pomoc dziękuję. Na pytania chętnie odpowiem, choć mam nadzieję, że dość obrazowo opisałem problem...

Edit:
Zmiana quote na CODEBOX
Mephistofeles
Po co 2 bazy? Wystarczyłyby 2 tabele, chyba, że o to ci chodzi, ale i tak to za dużo. Lepiej dać kolumnę "rodzaj" ENUM ('c5', 'c6'). Twój kod jest lekko mówiąc nieczytelny, postarałbyś się o jakieś wcięcia...
No i totalnie niezabezpieczony skrypt. SQL Injection rozwali ci tę wyszukiwarkę w parę chwil. I totalnie nieoptymalny. Po co usuwasz białe znaki z POSTa, a potem przepisujesz go do zmiennych? Lepiej od razu przepisać, choć to i tak zły pomysł. Masz możliwość użycia PDO?
I jeszcze jedno, co to '{$EA}' jest? Nie powinno być bez {}?
phpion
Może problemem jest stosowanie $_post zamiast $_POST?
Gallar
Zmiana zmiennej z małej na wielką nic nie dało.
Próbowałem też metodą $_GET również nic...

Co do pierwszego pana, to za uwagę dziękuję, ale w takim razie może jakieś rady - bo krytyka była niekonstruktywna...
Wiem, że tam powinno być bez { } dlatego też zmieniłem.
Proszę o pilną pomoc, bo ta wyszukiwarka była na sobotę tongue.gif
erix
Cytat
No i totalnie niezabezpieczony skrypt. SQL Injection rozwali ci tę wyszukiwarkę w parę chwil. I totalnie nieoptymalny. Po co usuwasz białe znaki z POSTa, a potem przepisujesz go do zmiennych?

To nie jest konstruktywne? Ewidentne dowody na braki w Twoim algorytmie.

  1. <?php
  2. $obAmount=mysql_num_rows($results); // TU WYSTĘPUJE BŁĄD
  3. ?>

Ok, błąd. Ale jaki?

Cytat
Proszę o pilną pomoc, bo ta wyszukiwarka była na sobotę

To jest Twój problem, że miała być na sobotę. winksmiley.jpg Na gotowca nie licz.
Gallar
Konstruktywna, to taka, która nie tylko błędy wytyka, ale przynajmniej stara się nakierować jak te błędy naprawić.
Gotowca nie oczekuję, napisałbym wówczas w innym dziale. Miała być na sobotę, ale jak będzie na jutro, to jakoś przeżyję :-)
Ale nie o taką dyskusję przecie tu chodzi.
Chodzi o to, że nie jestem w stanie rozwiązać opisanego przeze mnie problemu, jeśli natomiast nauczę się czegoś nowego, to będę się tylko cieszył. Dlatego nawet nie gotowe rozwiązania, a coś co pomoże mi problem zrozumieć, dzięki czemu rozwiązać będzie równie pomocne.
Koniec już mojego mądrzenia się, w końcu to ja potrzebuję pomocy brzydal.gif

Błąd:
Cytat
ERRNO: 2 TEKST: mysql_num_rows(): supplied argument is not a valid MySQL result resource LOKALIZACJA: /home/euroland/ftp/index/wysz4/grid.php, linia 40



EDIT:
TAk, chodziło o dwie tabele...
erix
Cytat
Konstruktywna, to taka, która nie tylko błędy wytyka, ale przynajmniej stara się nakierować jak te błędy naprawić.

Przecież nakierowałem. winksmiley.jpg Poza tym, jeśli cały kod jest do przepisania, to więcej czasu zejdzie na jego naprawę, niż napisanie od nowa.

Cytat
Błąd:

Masz coś nie tak z zapytaniem; wyświetl je sobie i debuguj w konsoli MySQL.
Mephistofeles
Rady? Filtruj POSTa (mysql_real_escape_string itd.), a dane trimuj od razu do zmiennych, ominiesz 9 linijek kodu smile.gif.
Gallar
Cytat(Mephistofeles @ 10.03.2009, 21:04:13 ) *
Rady? Filtruj POSTa (mysql_real_escape_string itd.), a dane trimuj od razu do zmiennych, ominiesz 9 linijek kodu smile.gif.



Dziękuję.

Wpisałem w konsoli zapytanie z wpisanymi na "sztywno" danymi i wszystko jest ok, wywaliło mi to, co wywalić powinnoc...
Nie wiem co dalej. Mówicie, aby to napisać jeszcze raz. Może jeszcze jakieś rady, bym nie kręcił się w kółko ?
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.