Avatar billede tinem Novice
02. april 2008 - 18:44 Der er 10 kommentarer og
1 løsning

XML, mysql og danske bogstaver

Jeg kan ikke få denne testside http://www.tinemuller.dk/googlemap/tutorial/storelocator/library_phpsqlsearch_map.htm til at virke og er næsten sikker på at det er fordi der er danske bogstaver i databasen og ved ikke hvordan jeg skal rette nedenstående koder som er taget fra en tutorial http://code.google.com/support/bin/answer.py?answer=87134&topic=11369&ctx=sibling, hvor de ikke har tænkt på danske bogstaver. Jeg har fået en testside til at virke med en database, hvor det IKKE var danske bogstaver.

library_phpsqlsearch_genxml.php

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
  <head>
    <meta http-equiv="content-type" content="text/html; charset=utf-8"/>
    <title>Tine - Google Maps AJAX + MySQL/PHP Example</title>
    <script src="http://maps.google.com/maps?file=api&v=2&key=ABQIAAAAmYYoLeRyazVGDeFwMH_5chRBa9hFh1JQE70w75ZW5bLNFA531BSqFdAlOuedN5j5p0Nzmek2tUeZkA"
            type="text/javascript"></script>
    <script type="text/javascript">
   
//<![CDATA[
    var map;
    var geocoder;
   
        var iconBlue=new GIcon();
        iconBlue.image='http://labs.google.com/ridefinder/images/mm_20_blue.png';
        iconBlue.shadow='http://labs.google.com/ridefinder/images/mm_20_shadow.png';
        iconBlue.iconSize=new GSize(12, 20);
        iconBlue.shadowSize=new GSize(22, 20);
        iconBlue.iconAnchor=new GPoint(6, 20);
        iconBlue.infoWindowAnchor=new GPoint(5, 1);

        var iconRed=new GIcon();
        iconRed.image='http://labs.google.com/ridefinder/images/mm_20_red.png';
        iconRed.shadow='http://labs.google.com/ridefinder/images/mm_20_shadow.png';
        iconRed.iconSize=new GSize(12, 20);
        iconRed.shadowSize=new GSize(22, 20);
        iconRed.iconAnchor=new GPoint(6, 20);
        iconRed.infoWindowAnchor=new GPoint(5, 1);
   
        var iconYellow=new GIcon();
        iconYellow.image='http://labs.google.com/ridefinder/images/mm_20_yellow.png';
        iconYellow.shadow='http://labs.google.com/ridefinder/images/mm_20_shadow.png';
        iconYellow.iconSize=new GSize(12, 20);
        iconYellow.shadowSize=new GSize(22, 20);
        iconYellow.iconAnchor=new GPoint(6, 20);
        iconYellow.infoWindowAnchor=new GPoint(5, 1);
   
        var customIcons = [];
        customIcons["SH"]=iconBlue;
        customIcons["SF"]=iconRed;
        customIcons["SB"]=iconYellow;
   
        customIcons["FH"]=iconBlue;
        customIcons["FF"]=iconRed;
        customIcons["FB"]=iconYellow;
   
        customIcons["JH"]=iconBlue;
        customIcons["JF"]=iconRed;
        customIcons["JB"]=iconYellow;
   
        customIcons["OH"]=iconBlue;
        customIcons["OF"]=iconRed;
        customIcons["OB"]=iconYellow;

   
    function load() {
      if (GBrowserIsCompatible()) {
        geocoder = new GClientGeocoder();
        map = new GMap2(document.getElementById('map'));
        map.addControl(new GSmallMapControl());
        map.addControl(new GMapTypeControl());
        //map.setCenter(new GLatLng(40, -100), 4);
        map.setCenter(new GLatLng(56.26392, 9.501785), 6);
      }
    }

  function searchLocations() {
    var address = document.getElementById('addressInput').value;
    geocoder.getLatLng(address, function(latlng) {
      if (!latlng) {
        alert(address + ' not found');
      } else {
        searchLocationsNear(latlng);
      }
    });
  }

  function searchLocationsNear(center) {
    var radius = document.getElementById('radiusSelect').value;
    var searchUrl = 'library_phpsqlsearch_genxml.php?lat=' + center.lat() + '&lng=' + center.lng() + '&radius=' + radius; alert(searchUrl)
    GDownloadUrl(searchUrl, function(data) {
      var xml = GXml.parse(data);
      var markers = xml.documentElement.getElementsByTagName('marker');
      map.clearOverlays();

      var sidebar = document.getElementById('sidebar');
      sidebar.innerHTML = '';
      if (markers.length == 0) {
        sidebar.innerHTML = 'No results found.';
        //map.setCenter(new GLatLng(40, -100), 4);
        map.setCenter(new GLatLng(56.26392, 9.501785), 6);
       
        return;
      }

      var bounds = new GLatLngBounds();
      for (var i = 0; i < markers.length; i++) {
        var name = markers[i].getAttribute('name');
        var address = markers[i].getAttribute('address');
        var icon_type = markers[i].getAttribute('icon_type');
        var distance = parseFloat(markers[i].getAttribute('distance'));
        var point = new GLatLng(parseFloat(markers[i].getAttribute('lat')),
                                parseFloat(markers[i].getAttribute('lng')));
       
        var marker = createMarker(point, name, address, icon_type);
        map.addOverlay(marker);
        var sidebarEntry = createSidebarEntry(marker, name, address, distance);
        sidebar.appendChild(sidebarEntry);
        bounds.extend(point);
      }
      map.setCenter(bounds.getCenter(), map.getBoundsZoomLevel(bounds));
    });
  }

    function createMarker(point, name, address, icon_type) {
      var marker = new GMarker(point, customIcons[icon_type]);
      //GLog.write(icon_type);
      //var marker = new GMarker(point, {icon:customIcons[type]});

     
      var html = '<b>' + name + '</b> <br/>' + address;
      GEvent.addListener(marker, 'click', function() {
        marker.openInfoWindowHtml(html);
      });
      return marker;
    }

    function createSidebarEntry(marker, name, address, distance) {
      var div = document.createElement('div');
      var html = '<b>' + name + '</b> (' + distance.toFixed(1) + ')<br/>' + address;
      div.innerHTML = html;
      div.style.cursor = 'pointer';
      div.style.marginBottom = '5px';
      GEvent.addDomListener(div, 'click', function() {
        GEvent.trigger(marker, 'click');
      });
      GEvent.addDomListener(div, 'mouseover', function() {
        div.style.backgroundColor = '#eee';
      });
      GEvent.addDomListener(div, 'mouseout', function() {
        div.style.backgroundColor = '#fff';
      });
      return div;
    }
    //]]>
  </script>
  </head>

  <body onload="load()" onunload="GUnload()">
    Address: <input type="text" id="addressInput"/>
   
    Radius: <select id="radiusSelect">
      <option value="25" selected>25</option>
      <option value="100">100</option>

      <option value="200">200</option>
    </select>
    <input type="button" onclick="searchLocations()" value="Search Locations"/>
    <br/>   
    <br/>
<div style="width:600px; font-family:Arial,
sans-serif; font-size:11px; border:1px solid black">
  <table>
    <tbody>
      <tr id="cm_mapTR">
        <td width="200" valign="top"> <div id="sidebar" style="overflow: auto; height: 400px; font-size: 11px; color: #000"></div>

        </td>
      <!--  <td> <div id="map" style="overflow: hidden; width:400px; height:400px"></div> </td> -->
        <td> <div id="map" style="border: 1px solid black; overflow: hidden; width:400px; height:400px"></div> </td>
      </tr>
    </tbody>
  </table>
</div>   
  </body>
</html>
Avatar billede tinem Novice
04. april 2008 - 16:40 #1
Siden virker lidt bedre nu http://www.tinemuller.dk/googlemap/tutorial/storelocator/library_phpsqlsearch_map.htm, men der er stadigvæk problemer. Jeg bruger utf8_danish_ci i databasen.

Det var en forkert side som jeg pastede ind, det skulle have været nedenstående:

Adresserne er en kopi af samme tabel som viser denne side http://www.tinemuller.dk/alle_folkebiblioteker/dropdownmenu/PVII/, hvor det fungerer OK med danske bogstaver i databasen. Er ved at blive sindssyg.:-(

Jeg indsætter lige php-koderne for denne side som virker, så måske er der en der kan finde ud af, hvordan jeg skal bruge htmlspecialchars og utf8_encode. Det er sikkert "bare" det som mangler.
map_data_xml.php<?php

// Connect to the database
require($_SERVER['DOCUMENT_ROOT'] . '/db_credentials.php');

$conn = mysql_connect($db_server, $db_user, $db_pass);
mysql_select_db($db_name, $conn);

//Get the variable from the link
$category=@$_GET["category"];
//    $city=$_GET["city"];
//    $postnummer=$_GET["postnummer"];
/*$inarg = "'" . implode("','", $_GET['category']) . "'";*/

// Select all the rows in the markers table
$query="SELECT * FROM manyboxes_alle_folkebiblioteker WHERE category
='$category' ORDER BY branchname ASC  ";
/*$query="SELECT * FROM manyboxes_alle_folkebiblioteker WHERE category IN
($inarg) ORDER BY branchname ASC  ";*/

//$query="SELECT * FROM manyboxes_alle_folkebiblioteker WHERE category='$category' OR city='$city' OR postnummer='$postnummer' ORDER BY branchname ASC";

$result = mysql_query($query);
if (!$result) {
}

/*header("Content-type: text/xml; charset: UTF-8");*/
header("Content-type: text/xml");


// Start XML file, echo parent node

echo '<markers>';
// Iterate through the rows, printing XML nodes for each
while ($row = @mysql_fetch_assoc($result)){
// ADD TO XML DOCUMENT NODE
echo '<marker ';

$encoded=$row['name'];
$encoded=htmlspecialchars($encoded);
$encoded=utf8_encode($encoded);
echo 'name="' .$encoded. '" ';

$encoded=$row['branchname'];
$encoded=htmlspecialchars($encoded);
$encoded=utf8_encode($encoded);
echo 'branchname="' .$encoded. '" ';

echo 'id="'.$row['id'].'" ';

$encoded=$row['adresse'];
$encoded=htmlspecialchars($encoded);
$encoded=utf8_encode($encoded);
echo 'adresse="' .$encoded. '" ';

$encoded=$row['adresse1'];
$encoded=htmlspecialchars($encoded);
$encoded=utf8_encode($encoded);
echo 'adresse1="' .$encoded. '" ';

echo 'postnummer="' . $row['postnummer'] . '" ';


$encoded=$row['city'];
$encoded=htmlspecialchars($encoded);
$encoded=utf8_encode($encoded);
echo 'city="' .$encoded. '" ';

echo 'tlf="' . $row['tlf'] . '" ';

echo 'telefax="' . $row['telefax'] . '" ';

echo 'email="' . $row['email'] . '" ';

$encoded=$row['hjemmeside'];
$encoded=htmlspecialchars($encoded);
$encoded=utf8_encode($encoded);
echo 'hjemmeside="' .$encoded. '" ';

$encoded=$row['category'];
$encoded=htmlspecialchars($encoded);
$encoded=utf8_encode($encoded);
echo 'category="' .$encoded. '" ';


echo 'googles_lat="' . $row['googles_lat'] . '" ';
echo 'googles_lng="' . $row['googles_lng'] . '" ';

echo 'lat="' . $row['lat'] . '" ';
echo 'lng="' . $row['lng'] . '" ';

echo '/>';
}


// End XML file
echo '</markers>';

?>



library_phpsqlsearch_genxml.php
<?php 
require("phpsqlsearch_dbinfo.php");

// Get parameters from URL
$center_lat = $_GET["lat"];
$center_lng = $_GET["lng"];
$radius = $_GET["radius"];

// Start XML file, create parent node
$dom = new DOMDocument("1.0");
$node = $dom->createElement("markers_library");
$parnode = $dom->appendChild($node);

// Opens a connection to a mySQL server
$connection=mysql_connect (localhost, $username, $password);
if (!$connection) {
  die("Not connected : " . mysql_error());
}

// Set the active mySQL database
$db_selected = mysql_select_db($database, $connection);
if (!$db_selected) {
  die ("Can\'t use db : " . mysql_error());
}

// Search the rows in the markers_library table
$query = sprintf("SELECT address, name, lat, lng, icon_type, ( 6371 * acos( cos( radians('%s') ) * cos( radians( lat ) ) * cos( radians( lng ) - radians('%s') ) + sin( radians('%s') ) * sin( radians( lat ) ) ) ) AS distance FROM markers_library HAVING distance < '%s' ORDER BY distance LIMIT 0 , 20",
  mysql_real_escape_string($center_lat),
  mysql_real_escape_string($center_lng),
  mysql_real_escape_string($center_lat),
  mysql_real_escape_string($radius));
$result = mysql_query($query);

if (!$result) {
  die("Invalid query: " . mysql_error());
}

header("Content-type: text/xml");

// Iterate through the rows, adding XML nodes for each
while ($row = @mysql_fetch_assoc($result)){
  $node = $dom->createElement("marker");
  $newnode = $parnode->appendChild($node);
  $newnode->setAttribute("name", $row['name']);
  $newnode->setAttribute("address", $row['address']);
  $newnode->setAttribute("lat", $row['lat']);
  $newnode->setAttribute("lng", $row['lng']);
  $newnode->setAttribute("distance", $row['distance']);
  $newnode->setAttribute("icon_type", $row['icon_type']);
}

echo $dom->saveXML();
?>
Avatar billede w13 Novice
04. april 2008 - 16:44 #2
Gemmer du også ovenstående tekst/kode i formatet (/encoding) UTF-8?
Avatar billede tinem Novice
04. april 2008 - 17:04 #3
Som du kan se har jeg prøvet en masse doctype og encoding, og her virker det http://www.tinemuller.dk/alle_folkebiblioteker/dropdownmenu/PVII/, og jeg har brugt det samme her http://www.tinemuller.dk/googlemap/tutorial/storelocator/library_phpsqlsearch_map.htm. Du kan se i vis kilde, hvad jeg har forsøgt.
Avatar billede tinem Novice
04. april 2008 - 17:12 #4
Hvis du indtaster "Smakkegårdsvej 112" 1 på denne side http://www.tinemuller.dk/googlemap/tutorial/storelocator/library_phpsqlsearch_map.htm, så vil du se hvordan den ikke viser å. Og hvis du så prøver med 3, så kommer denne fejlmeddelelse i Firebug:

<br />

<b>Warning</b>:  DOMElement::setAttribute() [<a href='function.DOMElement-setAttribute'>function.DOMElement-setAttribute

</a>]: xmlEncodeEntitiesReentrant : char out of range in <b>/home/www/tinemuller.dk/googlemap/tutorial

/storelocator/library_phpsqlsearch_genxml.php</b> on line <b>45</b><br />

<?xml version="1.0" encoding="ISO-8859-1"?>

<markers_library><marker name="Gentofte Bibliotekerne" address="Smakkeg&#23716;svej 112" lat="55.761549"

lng="12.526881" distance="0.046302544418926" icon_type="SF"/><marker name="Gentofte Bibliotekerne" address

="Vangede Bygade 45" lat="55.751036" lng="12.518502" distance="1.2552224850096" icon_type="SF"/><marker

name="Gentofte Bibliotekerne" address="Gentoftegade 45" lat="55.746449" lng="12.541362" distance="1

.9224327494714" icon_type="SF"/><marker name="Lyngby-Taarb&#27360;Kommunes Biblioteker" address="Lyngby

Hovedgade 28" lat="55.773317" lng="12.498992" distance="2.1498580229259" icon_type="SH"/><marker name

="Gentofte Bibliotekerne" address="Ordrupvej 121" lat="55.759475" lng="12.569701" distance="2.7335106153854"

icon_type="SF"/><marker name="Gladsaxe Bibliotekerne" address="S&#65533;borg Hovedgade 220" lat="55.742275"

lng="12.496521" distance="2.827505680153" icon_type="SH"/></markers_library>
Avatar billede w13 Novice
04. april 2008 - 17:30 #5
Du skal nok bruge UTF-8 så, og så huske at gemme siden med encoding UTF-8 også, hvis du f.eks. bruger Notesblok.
Avatar billede tinem Novice
05. april 2008 - 12:18 #6
Jeg bruger Dreamweaver MX 2004 men koderne er jo kopieret/downloaded fra tutorialen http://code.google.com/support/bin/answer.py?answer=87134&topic=11369&ctx=sibling#findnearsql - Jeg kan ikke finde ud af at maile direkte til dig, men ville høre om du ikke kunne have lyst til selv at lave denne tutorial med DANSKE bogstaver i tabellen og med utf8_danish_ci samt php5, så du selv kan se problemet?
Avatar billede w13 Novice
05. april 2008 - 12:26 #7
Har du i stedet mulighed for at sende mig dine filer? Så kan jeg se, om jeg kan finde fejlen, og så bruger jeg ikke hele min lørdag på en php-tutorial, jeg ikke skal bruge til noget. ;)
Avatar billede w13 Novice
05. april 2008 - 12:26 #8
w13 (at) ofir dk
Avatar billede tinem Novice
06. april 2008 - 11:06 #9
Jeg har sendt mail til dig, men er ikke sikker på at du har modtaget den?

Jeg er kommet problemet lidt nærmere, jeg ændrede nedenstående:
// Start XML file, create parent node
//$dom = new DOMDocument("1.0");
$dom = new DOMDocument('1.0', 'utf-8');

Og NU virker det med at finde alle markørerne http://www.tinemuller.dk/googlemap/tutorial/storelocator/library_phpsqlsearch_map.htm, men nu skal jeg så bare finde ud af hvordan jeg får æ ø å frem istedet for ?.

Nu er der måske flere som har et forslag?
Avatar billede tinem Novice
06. april 2008 - 12:04 #10
Har lige konstateret at der slet ikke vises noget i Explorer 6. Er ved at blive skør. :-(

Min host er Gigahost og OS: Debian Linux 4.0 php 5.2

Jeg kan da ikke være den eneste som har disse problemer. Der må da findes en løsning?
Avatar billede tinem Novice
07. april 2008 - 10:43 #11
Problemet er løst med dette "enkle" tip som jeg fik af en engelsk gut. Ja, når man ved det, så er det jo enkelt. Håber at dette kan hjælpe andre.

  $name=$row['name'];
  $name=utf8_encode($name);
  $newnode->setAttribute("name", $name);
  $address=$row['address'];
  $address=utf8_encode($address);
  $newnode->setAttribute("address", $address);
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Computerworld tilbyder specialiserede kurser i database-management

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester