Zeichenkettenproblematik bei Befüllung von Selects per php aus MySQL

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • Zeichenkettenproblematik bei Befüllung von Selects per php aus MySQL

    Es ging um folgendes, und leider ist der Thread schon geschlossen und ich kann dort nicht mehr antworten:

    Ich habe begonnen, eine Internetseite zu programmieren. Allerdings kenne ich mich damit noch nicht so aus und habe erst begonnen, mich einzulesen.

    Ich habe jetzt folgende Situation: Im Hintergrund ist eine MySQL Datenbank. Auf der Internetseite sind 2 Dropdowns, in dem einen kann man ein Land auswählen, das zweite Dropdown wird dann über eine Datei mit den entsprechenden Städten variabel gefüllt, die aus der Datenbank kommen. Das habe ich mit einer Datei func.php gebaut, quasi genauso wie beschrieben:

    Zweite Select-Feld in Abhängigkeit vom ersten?

    Mein Problem ist aber: In den Städtenamen sind Sonderzeichen(z.b. "ö") enthalten. Ich kenne mich mit den ganzen Themen "Zeichensätze", und wie man die definiert, bzw. wo man die festlegt. Die Dropdowns werden jetzt zwar gefüllt, aber die Sonderzeichen werden nicht dargestellt bzw. werden falsch dargestellt.

    Kann mir jemand hier helfen?
    Mich würde das sehr freuen, weil ich an dieser Stelle leider garnicht weiterkomme. Ich weiss nicht, wo ich den zeichensatz in welcher datei definieren muss, oder wie ich das z.b. mit diesen encode/decode funktionen lösen könnte.....

    Vielen Dank für die Hilfe!
  • Hi,
    tja am besten du erledigt alle der Schritte, wie hier beschrieben: [wiki]Unicode und PHP <= 5[/wiki]

    Für dich relevant ist aber vermutlich nur Schritt5 Content Type:
    In die func.php und auch in die Hauptdatei muss folgendes in Zeile1: header('Content-type: text/html; charset=UTF-8') ;
    In die Hauptdatei muss außerdem eine meta Angabe: <meta http-equiv="Content-type" value="text/html; charset=UTF-8" />
  • Ich benutze den normalen Windows-Editor um den html- und php Code zu schreiben. Gibt es denn da noch etwas wie eine Entwicklungsumgebung?

    Ich habe jetzt diese Header in meine index.php eingefügt, aber die Selects werden trotzdem noch fehlerhaft dargestellt - nur dass jetzt auch auf den anderen Seite, wo die Tabellenausgaben bisher mit Sonderzeichen richtig funktioniert haben, auch nicht mehr gehen (d.h. hier werden jetzt auch fehlerhafte Zeichen bzw. "?" angezeigt).

    Die Seite besteht aus einer index.php, die intern noch eine weitere register.php-Datei einbindet. Diese ist dann die, die die func.php einbindet.
    An welchen Stellen muss ich denn dann diese header/metatags einbauen? und muss ich dafür vielleicht in dem html-teil etwas verändern/umbauen? Wenn ja, wo?

    Soll ich einen Teil des Codes hier einmal posten, oder soll ich noch andere Angaben machen, damit mir jemand helfen kann? Die Seite ist noch nicht online verfügbar.

    Danke schonmal für die Hilfe!!
  • Ich habe hier einmal die 3 Quelltexte, vielleicht kann mir ja jemand hier helfen.... Ich habe ein paar aus meiner Sicht unwichtige Fragmente heraus genommen. Vielleicht habe ich ja auch einfach Fehler in dem html-Aufbau?

    Hier ist meine func.php:

    PHP-Quellcode

    1. <?php
    2. header('Content-type: text/html; charset=UTF-8') ;
    3. include("opendatabase.php");
    4. echo "<select size=\"1\" name=\"town\" >";
    5. $query = mysql_real_escape_string($_POST['s']);
    6. $land=$_POST['s'];
    7. $result = mysql_query("SELECT city_name, city_nr FROM cities where country_id='$land' ORDER BY city_name");
    8. while($row = mysql_fetch_object($result))
    9. {
    10. echo '<option value="'.$row->city_nr.'">'.$row->city_name.'</option>';
    11. }
    12. echo "</select>";
    13. ?>
    Alles anzeigen


    Hier ist meine register.php, die von der index.php aufgerufen wird:

    PHP-Quellcode

    1. <script type="text/javascript">
    2. <!--
    3. function sendRequest() {
    4. var req;
    5. try {
    6. req = window.XMLHttpRequest?new XMLHttpRequest():
    7. new ActiveXObject("Microsoft.XMLHTTP");
    8. } catch (e) {
    9. //Kein AJAX Support
    10. }
    11. req.onreadystatechange = function() {
    12. if ((req.readyState == 4) && (req.status == 200)) {
    13. document.getElementById('inhalt').innerHTML = req.responseText;
    14. }
    15. };
    16. var id = document.getElementById('dropdown').value;
    17. req.open('post', 'func.php');
    18. req.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
    19. req.send('s='+ id);
    20. }
    21. //-->
    22. </script>
    23. <form action="index.php?go=savestay" name="testform" method="post">
    24. <table>
    25. <tr align="left">
    26. <th>Country: </th>
    27. <th> <select size="1" name="country" id="dropdown" onChange="sendRequest()"><br>
    28. <?php
    29. include("opendatabase.php");
    30. $result = mysql_query("SELECT id, name FROM `countries` ORDER BY name");
    31. while($row = mysql_fetch_object($result)) {
    32. echo '<option value="'.$row->id.'">'.$row->name.'</option>';
    33. }
    34. ?>
    35. </select>
    36. </tr>
    37. <tr align="left">
    38. <th>Location: </th>
    39. <th>
    40. <div id="inhalt" >
    41. <select size="1" name="town" ></select>
    42. </div>
    43. </tr>
    44. <tr align="left">
    45. <th><input type="submit" value="Save now!"></th>
    46. </tr>
    47. </table>
    48. </form>
    Alles anzeigen


    und dies ist der verkürzte Inhalt meiner index.php, die dann eben die register.php beinhaltet:

    PHP-Quellcode

    1. <?php
    2. session_start();
    3. if (isset($_GET['go']))
    4. {
    5. if($_GET['go']=='login')
    6. {
    7. include("opendatabase.php");
    8. $benutzername = $_POST['benutzername'];
    9. $passwort_eingabe = $_POST['passwort'];
    10. $abfrage = "SELECT benutzername FROM tab_ntzr Where benutzername = '$benutzername' and passwort = '$passwort_eingabe' AND bestaetigt='1'";
    11. $korrekt = false;
    12. $ergebnis = mysql_query($abfrage);
    13. while($row = mysql_fetch_object($ergebnis))
    14. {
    15. $korrekt = true;
    16. $_SESSION['benutzername'] = $row->benutzername;
    17. }
    18. if($korrekt==true)
    19. {
    20. $IPaddress=$_SERVER['REMOTE_ADDR'];
    21. $user=$_SESSION['benutzername'];
    22. $eintrag = "INSERT INTO Logins (User, IP, Zeit, erfolg) VALUES ('$user','$IPaddress', CURRENT_TIMESTAMP, '1')";
    23. $ergebnis = mysql_query($eintrag);
    24. }
    25. else
    26. {
    27. $IPaddress=$_SERVER['REMOTE_ADDR'];
    28. $user=$_SESSION['benutzername'];
    29. $eintrag = "INSERT INTO Logins (User, IP, Zeit, erfolg) VALUES ('$benutzername','$IPaddress', CURRENT_TIMESTAMP, '0')";
    30. $ergebnis = mysql_query($eintrag);}
    31. }
    32. if($_GET['go']=='logout')
    33. {
    34. $_SESSION = array();
    35. if (isset($_COOKIE[session_name()]))
    36. {
    37. setcookie(session_name(), '', time()-42000, '/');
    38. }
    39. session_destroy();
    40. }
    41. }
    42. ?>
    43. <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Frameset//EN"
    44. "http://www.w3.org/TR/html4/frameset.dtd">
    45. <html>
    46. <head>
    47. <link rel="stylesheet" type="text/css" href="style.css">
    48. <meta http-equiv="Content-type" value="text/html; charset=UTF-8" />
    49. <title>my websitey</title>
    50. </head>
    51. <body>
    52. <div class="mn">
    53. <?php
    54. include("menu.inc");
    55. ?>
    56. </div>
    57. <div class="bgg">
    58. <?php
    59. if (isset($_GET['go']))
    60. {
    61. switch($_GET['go'])
    62. {
    63. case 'register': include('register.php');
    64. break;
    65. default: include('home.inc');
    66. }
    67. }
    68. else
    69. {
    70. include('home.inc');
    71. }
    72. ?>
    73. </div>
    74. </body>
    75. </html>
    Alles anzeigen



    Kann vielleicht hier jemand den Fehler sehen, oder auch vielleicht nur Verbesserungsvorschläge machen? Sollte ich vielleicht auch eine andere Gliederung oder Ausgliederung der Sachen machen? Bin für jeden Hinweis dankbar... Vor allem wenn mir jemand sagen kann, ich ich die Sonderzeichen in das Select vom Town-Feld bekomme....

    Vielen Dank!!!

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von sebfra ()

  • Hast du die 3 Dateien schon in deinem neuen Editor mit UTF-8 neu abgespeichert?
    Ansonsten verwendest du vermutlich ISO-8859-15 - dann ersetze in deinen 3 Beispielen mal überall UTF8 durh ISO-8859-15

    Ich habs vielleicht doof ausgedrückt. Es geht nicht darum, dass jeder UTF-8 verwenden muss, sondern dass jeder Teil deines Scripts den selben Zeichensatz verwenden muss.
    UTF-8 ist am populärsten, weil du damit auch die ganzen asiatischen Schriften umsetzen könntest.
  • Tatsächlich - durch ersetzen zu ISO-8859-15 an den beiden Stellen oben im Quelltext funktioniert es!!!

    1000 Danke!!

    Was müsste ich denn machen, um alles auf UTF-8 umzustellen? Müsste ich das dann auch nur an den beiden Stellen ändern, was ja nicht ging, oder auch an der Datenbank oder es irgendwie anders abspeichern? Wenn ja, wie würde das gehen?

    Ganz vielen Dank für die tolle Hilfe!!

    Seb
  • in der Datei func gibt es einen Fehler

    =>

    Quellcode

    1. $query = mysql_real_escape_string($_POST['s']);
    2. $land=$_POST['s'];
    3. $result = mysql_query("SELECT city_name, city_nr FROM cities where country_id='$land' ORDER BY city_name");


    $land wird im Gegensatz zu $query nicht gefiltert.
    In der SQL Abfrage benutzt du allerdings $land.