Menu

Orte mit Umlaute = kein Ergebnis

Olaf Gleba
2021-04-29
2021-04-29
  • Olaf Gleba

    Olaf Gleba - 2021-04-29

    Moin,

    ich habe hier eine Umkreissuche auf einer Seite, die folgende Merkmale hat:

    • 1 Inputfeld, dass Ortsnamen ODER PLZ Angaben akzeptiert (s. Code)
    • GeoDB: DB, alle Tables haben die Collation utf8_unicode_ci
    • Umlaute in sämtlichen Tabellen alle o.k. (bzw. zip_coordinates => zc_location_name => Köln (s.u.))
    • HTML Formular (accept-charset=utf-8) sendet/empfängt den Wert der Variable rs per GET
    • Debugging: Printe ich den Wert der Variable (nach Submit) komme ich im Frontend + Quelltextausgabe jeweils Köln angezeigt. Also alles gut, nichts zerschossen.

    Alles funktioniert auch bestens, nur wenn ich einen Ortsnamen mit Umlauten angebe (bspw. eben Köln), findet er mir nichts in der GeoDB.

    Hat irgendjemand vielleicht eine Idee, was ich noch probieren könnte, bzw. wo der Fehler liegen könnte? Im Grunde ist meine ganze Kette ja UTF-8 codiert.

    Vielen Dank schon jetzt, viele Grüße
    Olaf

    Ich poste einfach mal den relevanten Code f. die Umkreissuche mit. Obschon ich denke dass heran nichts drehen muss (es funktioniert ja genau so wie es soll). Bis auf die Suche nach Orten mit Umlauten...

    // Variable `$rs` ist die GET Variable, die aus dem Formsubmit kommt
    
    // PLZ suggested...
    if(is_numeric($rs)) {
    
      $stmt = $dbh->prepare(
        "
          SELECT * FROM 
            zip_coordinates 
          WHERE 
            zc_zip LIKE ?
        "
      );
    
    } else {
      // String, e.g. City suggested...
      $stmt = $dbh->prepare(
        "
          SELECT * FROM 
            zip_coordinates 
          WHERE 
            zc_location_name LIKE ?
        "
      );
    }
    
    $stmtRadius = $dbh->prepare(
      "
        SELECT 
          dest.zc_zip, 
          dest.zc_location_name,
          ACOS(
            SIN(RADIANS(src.zc_lat)) * SIN(RADIANS(dest.zc_lat)) 
            + COS(RADIANS(src.zc_lat)) * COS(RADIANS(dest.zc_lat))
            * COS(RADIANS(src.zc_lon) - RADIANS(dest.zc_lon))
            ) * 6380 AS distance
        FROM 
          zip_coordinates dest
        CROSS JOIN 
          zip_coordinates src
        WHERE 
          src.zc_id = :zcid
        HAVING 
          distance < :distance
        ORDER BY 
          distance;
      "
    );
    
    $stmt->execute(array("$rs%"));
    $rows = $stmt->fetchAll();
    
    foreach ($rows as $row) {
    
      $stmtRadius->execute(array(":zcid" => $row['zc_id'], ':distance' => $distance));
      $res = $stmtRadius->fetchAll();
    
      foreach ($res as $r) {
        $sl_rs_results[] = $r['zc_zip'];
      }
    
    }
    
    // ... Query die CMS DB mit `$sl_rs_result[]` nach Datensätzen... 
    
     

    Last edit: Olaf Gleba 2021-04-29
  • Olaf Gleba

    Olaf Gleba - 2021-04-29

    Wie das so ist, kaum war der Post raus, habe ich die Lösung gefunden ;-). Vielleicht hilfts jemand bei einem vergleichbaren Problem.

    Ich hatte dem PDO connect zur GeoDB einfach den noch keinen expliziten charset mitgegeben:

    $dbh = new PDO('mysql:host=xxx;dbname=xxx;charset=utf8', ...);
    
     

Log in to post a comment.