Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Wyszukiwanie w promieniu
Forum PHP.pl > Forum > PHP
crew123
Witam.
Mam bazę z miejsc, w której mam dane dot. położenia geograficznego względem google maps i teraz mam do Was pytanie, jakim sposobem robilibyście wyszukiwanie tych wszystkich miejsc wpisując kod pocztowy i np: szukaj w promieniu 25km? Jakby ktoś znał dobry sposób na to byłbym bardzo wdzięczny smile.gif
Pawel_W
policz odległość punktu A od punktu B i sprawdź czy jest < 25 (wzór na liczenie odległości na mapie znajdziesz w internecie)
maly_swd
W $dane[....] podajesz punkt od ktorego ma szukac.

  1. SELECT
  2. ( 6371 * acos( cos( radians({$dane['google_lat']}) ) * cos( radians(ob.google_lat ) ) * cos( radians(ob.google_lng ) - radians({$dane['google_lng']}) ) + sin( radians({$dane['google_lat']}) ) * sin( radians(ob.google_lat ) ) ) ) AS distance
  3.  
  4. FROM TABELA ob
  5. GROUP BY ob.miejscowosc
  6. HAVING distance<25
  7.  
  8. ORDER BY distance
crew123
o co chodzi z tym ob?
ogólnie mam problem z zapytaniem, wyciągam odległość tym kodem:
  1. $dystans = round (rad2deg(acos(sin(deg2rad($szgeo1)) * sin(deg2rad($szgeo2)) + cos(deg2rad($szgeo1)) * cos(deg2rad($szgeo2)) * cos(deg2rad($dlgeo1 - $dlgeo2)))) * 111.18957696);

Ale potem nie wiem jak skonstruować zapytanie wyświetlające wyniki, ponieważ w bazie nie mam zawartego dystansu, próbowałem jakoś dystans zapisać jako kolumne ale wywyalało błąd.
CuteOne
Jest to nazwa kolumny z aliasem tabeli innymi słowy TABELA.KOLUMNA z tego co pamiętam "_lat" oznacza latitude (google -> google map latitude)
crew123
Niestety kod, który napisał mały wyświetla błąd fetch_array
maly_swd
1. Jak nazywa sie tabela w ktorej trzymasz dane
2. jak nazywaja sie kolumny w ktorych trzymasz dane

Jak to podasz to bedzie wiadomo co jest nie tak u Ciebie.

Podalem CI ogolnego SQL ktory wybiera z bazy wszystko co spelnia warunek z dystansem (wartosc dystans mysql oblicza sam, nie trzba go miec)
crew123
Tabelka, w której trzymam kody i ich położenie geograficzne, miejscowość kodu (lat, lng): kody_new .
Tabelka, w której trzymam dane potrzebne do ogłoszenia oraz położenie geograficzne autora ogłoszenia (lat, lng): ogloszenia .
kody_new:


ogloszenia:
maly_swd
  1. SELECT
  2. ( 6371 * acos( cos( radians({$dane['google_lat']}) ) * cos( radians(o.lat ) ) * cos( radians(o.lng ) - radians({$dane['google_lng']}) ) + sin( radians({$dane['google_lat']}) ) * sin( radians(o.lat ) ) ) ) AS distance
  3.  
  4. FROM ogloszenia o
  5. GROUP BY o.id
  6. HAVING distance<25
  7.  
  8. ORDER BY distance


jak podstawisz pod $dane[...] odpowiednie lat i lng z jakiegos miasta to poda Ci wszystkie oglaszenia, ktore spelniaja warunek 25km od tego co podales w $dane[..]
crew123
Moglbys mi powiedziec jeszcze dlaczego przy przejsciu na 2gą strone wyszukiwania (1,2...4,5) wyskakuje fetch_array lub bez podania promienia czy kodu?
maly_swd
ze co?
Pewnie masz blad w zapytaniu... nie podstawiasz danych lub cos w ten desen.

Wyswietl sobie echo mysql_error();
crew123
Jak dla mnie wszystko jest ok, zamieszcę tutaj plik na którym pracuje:
  1. <?
  2. include ('../include/config.php');
  3. db_connect();
  4. $ustawienia=mysql_fetch_array(mysql_query("SELECT * FROM config"));
  5. ?>
  6. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
  7. <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="pl" lang="pl">
  8. <head>
  9. <title>Wyszukiwarka - <?php echo $ustawienia['tytul']; ?></title>
  10. <?php include('../theme/head.php') ?>
  11. </head>
  12. <body>
  13. <div id="content">
  14. <?php
  15. // pobieramy dane usera
  16. $user_data = get_user_data();
  17.  
  18. <div id="header">
  19. <div id="hdr_lewa">
  20. <div class="logo"></div>
  21. </div>
  22. <div id="hdr_prawa">';
  23. include('../theme/login.php');
  24. echo '
  25. </div>
  26. </div>';
  27. include('../theme/menu.php');
  28. <div id="wrapper">
  29. <table cellpadding="0" cellspacing="0" width="1002">
  30. <tr>
  31. <td valign="top" width="234" style="background:#f6f6f6;">';
  32. include('../theme/lewa.php');
  33. echo '</td><td valign="top" width="534">';
  34. echo '<div class="naglowek">Wyszukiwarka</div>';
  35. include('pagination.php');
  36. $limit = $ustawienia['ogloszen_na_strone']; // Ilość pozycji na stronę...
  37. $pg = $_GET['page']; // Pobranie do zmiennej numeru strony...
  38. if(!isset($pg)) {
  39. $l1 = 0;
  40. $l2 = $limit; //Jeśli zmienna $pg ma pustą zawartość nastawiamy granice od 0 do wartości $limit
  41. } else {
  42. $l1 = $limit * $pg - $limit; //W przeciwnym wypadku oblicz dolną granicę...
  43. $l2 = $limit; //Oraz górną granicę...
  44. }
  45. $kat = $_POST['kategoria'];
  46. $frazy = $_POST['slowa_szukaj'];
  47. $promien = $_POST['promien_szukaj'];
  48. $kodpoczt = $_POST['miasto_szukaj'];
  49. if (!empty($kat))
  50. $wh[] = "id_cat = '$kat'";
  51.  
  52. if (!empty($frazy))
  53. $wh[] = "tytul LIKE '%$frazy%'";
  54.  
  55. if (!empty($wh))
  56. $where = 'WHERE '.implode(' AND ', $wh);
  57. else
  58. $where = '';
  59.  
  60. $qqq = mysql_query("SELECT * FROM kody_new WHERE kod='$kodpoczt'");
  61. $dane = mysql_fetch_array($qqq);
  62.  
  63. $sql = mysql_query("SELECT *,
  64. ( 6371 * acos( cos( radians({$dane['lat']}) ) * cos( radians(o.lat ) ) * cos( radians(o.lng ) - radians({$dane['lng']}) ) + sin( radians({$dane['lat']}) ) * sin( radians(o.lat ) ) ) ) AS distance
  65.  
  66. FROM ogloszenia o
  67. $where
  68. GROUP BY o.id
  69. HAVING distance<$promien
  70. ORDER BY distance LIMIT $l1, $l2");
  71. while($row = mysql_fetch_array($sql)){
  72. $zebra++;
  73. $reszta = $zebra % 2;
  74. if($reszta === 0) {
  75. $kolor = '#f6f6f6; border-bottom:1px solid #fff;';
  76. }
  77. else {
  78. $kolor = '#e9e9e9; border-top:1px solid #dedede; border-bottom:1px solid #fff;';
  79. }
  80. echo '<table cellpadding="0" cellspacing="0" class="oglo_row" style="background:'.$kolor.'">
  81. <tr>
  82. <td valign="middle" width="80">
  83. ';
  84. $id22 = (int)$row['id'];
  85. $result12 = mysql_query("SELECT * FROM zdjecia WHERE id_oglo='$id22'");
  86. $img = mysql_fetch_array($result12);
  87. if(count($img['id']) == 0) {
  88. echo '<img src="theme/images/brak.png" width="80" height="65" style="vertical-align:middle;"> ';
  89. } else {
  90. echo '<img src="'.$img['img'].'" width="80" height="65" style="vertical-align:middle;">';
  91. }
  92. echo '</td><td valign="middle" width="230">';
  93. echo '<a href="ogloszenie-'.$row['id'].'-'.przyjazny_string($row['tytul']).'.html">'.stripslashes($row['tytul']).'</a><br />';
  94. $idwoj = $row['id_woj'];
  95. $wojq = mysql_query("SELECT * FROM wojewodztwa WHERE id='$idwoj'");
  96. $woj = mysql_fetch_array($wojq);
  97. echo '<div style="margin-top:5px;">'.$row['miasto'].' / '.$woj['nazwa'].'</div>';
  98. echo '</td>';
  99. $idk = (int)$row['id_cat'];
  100. $result2 = mysql_query("SELECT * FROM ogloszenia_categories WHERE id='$idk'");
  101. $row2 = mysql_fetch_array($result2);
  102. echo '<td valign="middle" width="120">';
  103. echo '<div style="margin-top:6px;">'.$row2['tytul'].'</div>';
  104. echo '</td><td valign="middle">';
  105. $q = mysql_query("SELECT * FROM dodatkowo WHERE id_oglo='$id22' LIMIT 3");
  106. echo '<table cellpadding="0" cellspacing="5" style="margin-top:6px; margin-left:20px;">';
  107. echo '<tr>';
  108. echo '<td align="left" style="color:#005c9f; font-size:11px;">';
  109. while($q2 = mysql_fetch_array($q)) {
  110. echo '&raquo; '.$q2['id_oglo_opcje'].'<br>';
  111. }
  112.  
  113. echo '</td></tr></table>';
  114. echo '</td><td valign="middle" align="right" width="18">';
  115. echo '<a href="ogloszenie-'.$row['id'].'-'.$row['url'].'-'.przyjazny_string($row['tytul']).'.html"><img src="theme/images/arrow.png" style="border:0;"></a>';
  116. echo '</td></tr></table>';
  117.  
  118. }
  119. list($records)=mysql_fetch_row(mysql_query("SELECT count(*) ogloszenia"));
  120.  
  121. if($records >= 1) {
  122.  
  123. $pag['posts'] = $records; //Ilość rekordów...
  124. $pag['limit'] = $limit; //Rekordów na stronę...
  125. $pag['page'] = $_GET['page']; //Aktualna strona...
  126. $pag['separator'] = '?'; //Separatror - ? lub & więcej o tym w dalszej części.
  127. $pag['url_class'] = 'pages'; //Klasa linków paginowania w CSS...
  128. $pag['a_pg_class'] = 'active_pg'; //Klasa numeru aktywnej strony.
  129. $pag['page_label'] = 'Strona:'; //Etykieta z napisem ''Strona: x/x'' obok paginacji.
  130.  
  131. ECHO print_pagination($pag);
  132. }
  133.  
  134. echo '</td>';
  135. echo '</tr></table></div>';
  136. include('../theme/stopka.php');
  137.  
  138. ?>
  139. </div>
  140. </div>
  141. <? db_close(); ?>
  142. </body>
  143. </html>


Dopiero po wpisaniu kod: 00-001 prmien np:200 wyskakują rekordy
Pawel_W
ludzie, po raz kolejny proszę, to forum jest od tego, żeby pomagać/naprowadzać, a nie podawać gotowce...
crew123
Dla wyjaśnienia przy zapytaniu jest taki błąd: Parse error: syntax error, unexpected T_EXIT
d3ut3r
To jest przecież błąd składni i jest spowodowany skopanym kodem w miejscu xxx, jaki sens jest pisania posta za każdym razem gdy skrypt się nie uruchamia ? no sorry ale jako programista nawet początkujący powinieneś wiedzieć co to jest syntax error.

Na gotowce na forum też jest dział, trzeba po prostu się zdecydować albo chcę to zrobić sam albo chcę żeby ktoś zrobił to za mnie.
crew123
Dobra dałem sobie już z tym radę tylko jeszcze mam do Was pytanie jak zliczyć rekordy które są distance<$promien poprzez count?
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.