Mysql
 sql >> डेटाबेस >  >> RDS >> Mysql

आईओएस अक्षांश और देशांतर के लिए PHP क्वेरी एक एक्सएमएल आउटपुट के साथ पास के MySQL lat और lon की खोज नहीं कर रही है

चूंकि आप PHP में नए हैं, मैंने सोचा कि मैं आपकी स्क्रिप्ट पर अपनी टिप्पणियों को लाइन-दर-लाइन चलाकर रिकॉर्ड करूंगा:

{ $lat = (float)$_GET['lat']; }
{ $lon = (float)$_GET['lon']; }

यहां ब्रेसिज़ अनावश्यक हैं। आप कुछ इनपुट विवेक जांच भी कर सकते हैं (जिसमें पैरामीटर बिल्कुल सेट किए गए थे या नहीं)।

$minlat = $lat-.1;
$maxlat = $lat+.1;
$minlon = $lon-.1;
$maxlon = $lon+.1;

यदि आप जमीन पर किसी सीमा के भीतर रिकॉर्ड खोजना चाहते हैं, तो आप की गणना करना चाहेंगे। ग्रेट-सर्कल दूरी ; आपको पता होना चाहिए कि, आपके वर्तमान दृष्टिकोण के साथ, 0.1° देशांतर की दूरी किसी के अक्षांश के साथ बदलती रहती है, ध्रुवों पर किसी भी दूरी से भूमध्य रेखा पर लगभग 7 मील तक नहीं।

Google ने PHP, MySQL और Google Maps के साथ एक स्टोर लोकेटर बनाना :MySQL के साथ स्थान ढूँढना अनुभाग पर विशेष ध्यान दें और (आपके मामले में) PHP के साथ XML को आउटपुट करना

शेष कोड को एक या अधिक में रखें try { ... } किसी भी अपवाद को ब्लॉक करें और पकड़ें।

$dbh = new PDO('(censored personal information)');

जांचें कि यह सफल हुआ:if (!$dbh) die('Unable to create PDO object');

फिर इस PDO ऑब्जेक्ट को अपवाद बढ़ाने के लिए सेट करें $dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); और न केवल तैयार बयानों का अनुकरण करने के लिए $dbh->setAttribute(PDO::ATTR_EMULATE_PREPARES, FALSE);

$sql = 'SELECT lat, lon, name FROM locations WHERE lat >= ? AND lat <= ? AND lon >= ? AND lon <= ?';

हालांकि उपरोक्त सलाह के बाद आपकी क्वेरी नाटकीय रूप से बदल सकती है, फिर भी यह जानना उपयोगी हो सकता है कि आप MySQL के BETWEEN ... AND ... ऑपरेटर:WHERE (lat BETWEEN ? AND ?) AND (lon BETWEEN ? AND ?)

यदि आप प्लेसहोल्डर्स के बजाय नामित पैरामीटर का उपयोग करते हैं तो आपको अपना कोड बनाए रखना आसान हो सकता है:WHERE (lat BETWEEN :minlat AND :maxlat) AND (lon BETWEEN :minlon AND :maxlon)

$params = array( $minlat, $maxlat, $minlon, $maxlon );

यदि नामित प्लेसहोल्डर्स का उपयोग कर रहे हैं, तो आप एक सहयोगी सरणी का उपयोग $params = array ( ':minlat' => $minlat, ... ); के रूप में कर सकते हैं ।

किसी भी मामले में, आप अपने पैरामीटर के लिए अलग-अलग मानों या चर को बाध्य कर सकते हैं (जो मेरा पसंदीदा तरीका है, क्योंकि यह आसानी से किसी को क्वेरी को फिर से चलाने में सक्षम बनाता है केवल कुछ पैरामीटर बदले):$q->bindParam(':minlat', $minlat); आदि.

$q = $dbh->prepare( $sql );
$q->execute( $params );
$doc = new DOMDocument();

जांचें कि यह सफल हुआ:if (!$doc) die('Unable to create DOMDocument object');

$r = $doc->createElement( "locations" );
$doc->appendChild( $r );
foreach ( $q->fetchAll() as $row) {

fetchAll() संपूर्ण परिणामसेट को PHP में लाता है, जिसके लिए परिणामसेट बड़ा होने पर बहुत अधिक मेमोरी की आवश्यकता हो सकती है। जहां कोई केवल बदले में प्रत्येक रिकॉर्ड पर पुनरावृति करना चाहता है, आमतौर पर प्रत्येक रिकॉर्ड को आवश्यकतानुसार लाना बेहतर होता है:while ( $row = $q->fetch() )

  {

यह ब्रेस (नीचे इसके जोड़े के साथ) अतिश्योक्तिपूर्ण है।

    $e = $doc->createElement( "location" );
    $e->setAttribute( 'name', $row['name'] );
    $e->setAttribute( 'd', $d );

आपका $d कहां है चर घोषित/असाइन किया गया?

    $r->appendChild( $e );
  }

जैसा कि ऊपर उल्लेख किया गया है, यह ब्रेस ज़रूरत से ज़्यादा है।

}
print $doc->saveXML();



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. तैयार कथन में वाइल्डकार्ड की तरह प्रयोग करना

  2. PHP के माध्यम से फाइल करने के लिए लॉग इन करें या MySQL डेटाबेस में लॉग इन करें - जो तेज है?

  3. Mysql क्वेरी वांछित मान के बजाय संसाधन आईडी #8 लौटा रही है

  4. यह 7 दिन पहले का डेटा क्यों नहीं खींच रहा है?

  5. Django में विदेशी कुंजी संबंध के साथ दो तालिकाओं से डेटा पुनर्प्राप्त करें?