• Jetzt anmelden. Es dauert nur 2 Minuten und ist kostenlos!

UTF8 Formatierungsproblem in DB!?

chrizzTs

Neues Mitglied
Hallo zusammen,

ich habe ein wohl alt bekanntes Problem, bekomme es aber trotz langer inernet recherche nicht behoben.
Ich habe gefühlt alles probiert also hier mein letzter Anlauf.

Ich habe ein Formular in meiner Website, welches mit Hilfe von JQuerry die Felder einliest, an ein Php Skript sendet, welches die Daten dann in eine DB fügt. (Bitte nicht fragen warum über 3 Ecken, muss leider so sein weil die Anforderung so lautet). Die Sonderzeichen werden leider sehr kryptisch in meiner DB dargestellt, rufe ich die Daten jedoch wieder mittels einem php Skript ab, so sieht es alles ganz normal aus.

Hier mein JS Code:
Code:
//Gästebuch Eintrag Post und Echo Injection
$( "#guestbookForm" ).submit(function( event ) {
     event.preventDefault();
     
     var name = $("input[name='name']").val();
     var email = $("input[name='email']").val();
     var eingabe = $("textarea[name='eingabe']").val();
         

   var posting = $.post( "addEntry.php", {name:name, email:email, eingabe:eingabe});
   posting.done(function( data ) {
      $("#replyGuestbookEntry").html(data);
      loadData();
       
    });

   
});

Mein PHP Code sieht dann so aus:
PHP:
<?php

header('Content-type:text/html; charset=utf-8');

$name = $_POST['name'];
$email = $_POST['email'];
$post = $_POST['eingabe'];


if(!empty($name) and !empty($email) and !empty($post) and filter_var($email, FILTER_VALIDATE_EMAIL))
{
$con = mysqli_connect("localhost", "admin", "admin", "guestbook");
mysqli_query("SET NAMES 'UTF8'", $con); 

// Check connection
if (mysqli_connect_errno())
  {
  echo "Failed to connect to MySQL: " . mysqli_connect_error();
  }

$sql = "INSERT INTO entries (name, email, post) VALUES ('$_POST[name]', '$email', '$post')";

if (!mysqli_query($con,$sql))
  {
  die('Error: ' . mysqli_error($con));
  }

echo "Eintrag wurde versandt!";
mysqli_close($con);


} else{
  echo  "<p style=\"color:red\">Eingabefehler, versuchen Sie es erneut.</p>";
  }
?>

Wie ihr seht habe ich schon versucht das ganze hinzubekommen, jedoch ohne Erfolg:
PHP:
mysqli_query("SET NAMES 'UTF8'", $con);

Die Textfelder meiner DB sind vom Typ: varchar(255) und Kollation utf8_general_ci
Da ich wirklich schon eigentlich alles versucht habe was so im Internet stand (vielleicht auch falsch versucht) hoffe ich dass ihr mir helfen könnt und am besten genau sagt wie der Code aussehen muss.

Vielen Lieben Dank
Lg
Chrstian
 
Die Sonderzeichen werden leider sehr kryptisch in meiner DB dargestellt, rufe ich die Daten jedoch wieder mittels einem php Skript ab, so sieht es alles ganz normal aus.
Und wo ist jetzt das Problem? Wie die Daten in der DB aussehen ist doch wurscht. Wenn Speichern und Auslesen funktioniert, ist doch alles gut.
 
Ich habe eine php Seite guestbook.php, in der auf der linken Seite das Formular steht in der Einträge gemacht werden und an die DB gesendet werden und in der rechten Spalte mittel Ajax geladetn werden:
PHP:
<?php
    $title = "Kontakt";
    include "Header.php";
?>
<div id="page-wrapper">
    <div id="page" class="container">
        <div class="title">
            <h2>Gästebuch</h2>
        </div>
    </div>
   
    <div id="wrapper" class ="container">
        <div id="two-column">
            <div>
            <p id="replyGuestbookEntry"></p>
            <form id="guestbookForm">
            <table>
                <tr>
                    <td>Name: </td>
                    <td><input  type="text" size="62" name="name" placeholder="Max Muster"><td>
                </tr>
                <tr>
                    <td>E-Mail:</td>
                    <td> <input  type="text" size="62" name="email" placeholder="[email protected]"></td>
                </tr>
                <tr>
                    <td>Eintrag:</td>
                    <td><textarea value"Ihr Eintrag" name="eingabe"
                        placeholder="Bitte     geben Sie Ihren Gästebucheintrag ein." cols="45" rows="12"></textarea> </td>
                </tr>
            </table>
            <input id="submit" type="submit"value="Eintrag veröffentlichen">
            </form>

            </div>
           
            <div>
            <p id="col2Entries"></p>
            </div>
        </div>
    </div>
</div>
   
<?php
    include "Footer.php";
?>

Mein JS Befehl zum Laden der Daten seiht so aus und wir aufgerufen, wenn das Formular abgesendet wird.
Code:
function loadData(){
     $("#col2Entries").animate({opacity:"0", filter:"alpha(opacity=0)"}, 400, function(){
     $("#col2Entries").load("guestBookEntries.php",function(){
     $("#col2Entries").animate({opacity:"1", filter:"alpha(opacity=100)"}, 400);
     });
     });
   
}

Die Js Datei ruft guestBookEntries.php auf, welches so aussieht:
PHP:
<?php


$db = mysqli_connect("localhost", "admin", "admin", "guestbook");
$ergebnis = mysqli_query($db, "Select * from entries");



$count = 1;

while($row = mysqli_fetch_object($ergebnis))
{
    echo "<p><b>", $count, "</b><br>\n";
    echo ($row->date), "<br>\n";
    echo ($row->name), "<br>\n";
    echo ($row->email), "<br>\n";
    echo ($row->post), "<br></p>\n";

   
  $count++;
}

?>


Und ich benötige die Daten auch richtig in der DB angezeigt, da diese dort zum einen auch bearbeitet werden sollen können und zum anderen ich ein Servlet nutze, welches die Daten an einer anderen Stelle abholt und das Servlet die Daten leider nicht richtig darstellt, sondern so kryptisch anzeigt wie in der DB.
 
Moin,
ich vermute deine PHP/HTML Dateien sind nicht in UTF8 abgespeichert und haben auch keinen richtigen UTF8 header.

MfG
 
Ich habe alle meine Dateien als UTF8 gespeichert.
Und wie du im Code siehst sind meine PHP Datein auf UTF8 gestellt mit:
PHP:
header('Content-type:text/html; charset=utf-8');
 
Die header.php auch? Wie sieht denn der HTML header in der Datei aus?

Mit Firebug mal geguckt, wie die Ajax Daten übertragen werden?

MfG
 
Hier mein Header:
PHP:
<!--    In dieser Datei befindet sich der Header des Webauftritts, der von jeder einzelnen Seite eingebunden werden sollte. Hier werden meta-Daten geladen, die default.css eingebunden. Außerdem wird die Überschrift erstellt und die Menüleiste generiert.

-->


<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<meta http-equiv="Content-language" content="DE" />
<title></title>
<meta name="keywords" content="" />
<meta name="description" content="" />
<link href="http://fonts.googleapis.com/css?family=Source+Sans+Pro:200,300,400,600,700,900|Quicksand:400,700" rel="stylesheet" />
<link href="default.css" rel="stylesheet" type="text/css" media="all" />
<link href="fonts.css" rel="stylesheet" type="text/css" media="all" />
</head>
<body>


<!--Der Gesamte Header: -->

<div id="header-wrapper">

<!-- Überschrift der Seite -->
        <div id="logo">
            <h1><a href="Index.php">Automuseum Mannheim</a></h1>
        </div>
       
<!-- Menüleiste -->
        <nav id="menu">
            <ul id="navigation">           
                <li><a href="index.php" title="Home">Home</a></li>           
                <li><a href="#" title="Ausgewählte Exponate">Ausgewählte Exponate</a>
                    <ul id="exponateListe">
                        <li><a href="AudiR8.php" title="">Audi R8</a></li>
                        <li><a href="911.php" title="">Porsche 911</a></li>
                        <li><a href="Veyron.php" title="">Bugatti Veyron</a></li>
                    </ul>
                </li>
                <li><a href="#" title="Öffnungszeiten">Öffnungszeiten und Preise</a></li>
                <li><a href="webshop.php" title="Shop">Shop</a></li>
                <li><a href="Kontakt.php" title=Kontakt"">Kontakt</a></li>
                <li><a href="#" title="Spiele">Spiele</a></li>
                <li><a href="guestbook.php"    title="Gästebuch">Gästebuch</a></li>
            </ul>
        </nav>
</div>

Wie genau prüfe ich das mit firebug? Ich habe mal versucht es zu debuggen aber sehe nirgend das Echo, dass das Php Skript zurück gibt.
 
Ich zitiere mich nochmal selbst, da ich die Antwort darauf bisher nicht sehen kann.

Auf welchem Weg rufst Du die Inhalte in der Datenbank ab wo sie "kryptisch" aussehen?

Weiterhin solltest Du mal die tatsächlichen HTTP-Header kontrollieren. Das geht im Firebug z.B. im Network-Tab.
 
Hi, die Antwort war oben schon gegeben:
Ich rufe die Daten über ein JS-Befehl ab:
Code:
function loadData(){
     $("#col2Entries").animate({opacity:"0", filter:"alpha(opacity=0)"}, 400, function(){
     $("#col2Entries").load("guestBookEntries.php",function(){
     $("#col2Entries").animate({opacity:"1", filter:"alpha(opacity=100)"}, 400);
     });
     });
 
}
Der wiederung auf ein Php Skript anfragt, welches letzlich die Daten abruft:
PHP:
<?php


$db = mysqli_connect("localhost", "admin", "admin", "guestbook");
$ergebnis = mysqli_query($db, "Select * from entries");



$count = 1;

while($row = mysqli_fetch_object($ergebnis))
{
    echo "<p><b>", $count, "</b><br>\n";
    echo ($row->date), "<br>\n";
    echo ($row->name), "<br>\n";
    echo ($row->email), "<br>\n";
    echo ($row->post), "<br></p>\n";

 
  $count++;
}

?>

Das war doch das was du mit deiner Frage meintest oder?

Habe gerade im Firebug geprüft was für Argumente an das JS übergeben werden und da werden alle Sonderzeichen korrekt dargestellt.

Was genau soll ich an den Headern prüfen? ich bin zwar in dem Tab im Firebug, aber habe keine Ahnung was ich mir da jetzt ansehen soll?
 
Du sagst, dass in der Datenbank die Zeichen komisch aussehen, aber in deinen Scripten sie korrekt ausgegeben werden. Auf welchem Weg siehst Du sie also komisch? Auf dem eben genannten? Dann ist es ja ein Script von dir und kein direkter Blick in die Datenbank.

Und was den HTTP-Header angeht: siehe Firebug Hilfe Stichwort "Examine HTTP Header":
https://getfirebug.com/network

Und falls Du noch nicht weiß was der HTTP Header ist:
http://de.wikipedia.org/wiki/Liste_der_HTTP-Headerfelder
 
Komisch angezeigt wird das ganze in der DB selbst. Sprich wenn ich darauf zugreife über den PhpMyAdmin.

Außerdem werden die Daten kryptisch angezeigt, wenn ich sie mit einem Servlet aus der DB auslese.

Das mit dem Header ist mir soweit klar, nur weiß ich noch immer nicht was es mit der Formatierung der Sonderzeichen zutun hat!?
 
Na genau das meinte ich ja: phpmyadmin. Dort kann man ebenfalls den Zeichensatz einstellen den der phpmyadmin für die Darstellung von Texten verwendet. Es kann durchaus sein, dass in der Datenbank alles korrekt ist, nur dein phpmyadmin nicht. Wenn Du wirklich sicher sein willst, welche Daten tatsächlich in der Datenbank stehen müsstest Du per Konsole darauf zugreifen.

Die Angabe des Zeichensatz im HTTP Header ist relevant für die Darstellung von Sonderzeichen im Browser. Wenn dort ein anderer Zeichensatz ankommt als Du eigentlich ausgeben willst, dann klappt es nicht mit der Ausgabe. Das gilt für jede Datei beim Aufruf über die Text geladen wird.

Und von was für einem Servlet sprichst Du? Was macht das? Womit läuft es? Hast Du dort auch an das Setzen des Zeichensatzes für die Datenbankverbindung gedacht etc.pp?
 
im phpMyAdmin steht
Server Zeichensatz: UTF-8 Unicode (utf8)
ALso sollte phpMyAdmin ja eigentlich es richtig darstellen oder?

Dein Ansatz mit dem Servlet lässt mich jetzt jeodch noch etwas krübeln!
Ich habe zum einen einen appache http Server laufen auf dem die Db liegt und die Php Daten und einen Tomcat auf dem dieses Servlet läuft:
Code:
package v1;

import java.io.IOException;
import java.io.PrintWriter;
import java.nio.charset.Charset;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.Date;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;


/**
* Servlet implementation class CurrentDate
*/
@WebServlet("/CurrentDate")
public class GuesBookEntries extends HttpServlet {
    private static final long serialVersionUID = 1L;
    private Date currentDateAndTime;
      
    /**
     * @see HttpServlet#HttpServlet()
     */

    public GuesBookEntries() {
        super();
        // TODO Auto-generated constructor stub
    }
   
   
  public static String selectData() throws Exception{
      String code ="";
      Class.forName("com.mysql.jdbc.Driver").newInstance();
      Connection con = DriverManager.getConnection("jdbc:mysql://localhost:3306/guestbook", "admin", "admin");
      PreparedStatement statement = con.prepareStatement("Select * from entries");
      ResultSet result = statement.executeQuery();
     
     
      code+= "<table border=\"1\">\n" +
              "<form action=\"http://localhost:8080/GuestBook/CurrentDate\" method=\"POST\">\n";
      int i = 1;
      while(result.next()){
        code+="<tr> \n"+
          "<td><input type=\"checkbox\" name=\"checkbox\" value=\""+result.getString(1)+"\"></td>\n" +
          "<td>" + i + ".<br/>" + result.getString(5) + "<br/>\n" + result.getString(2) + "<br/>\n" + result.getString(3) +
          "<br/>\n" + result.getString(4) + "</td> \n" +
        "</tr> \n";
        i++;
      }
      code+= "</table>\n" +
              "<input type=\"submit\" id=\"submit\" value=\"Ausgefählte Einträge löschen.\" />" +
              "</form>\n";
      System.out.println(code);
      return code;
  }
  

    /**
     * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
     */
 
  public void deleteData(int id){
      try {
         
     
          Class.forName("org.gjt.mm.mysql.Driver");
              Connection con = DriverManager.getConnection("jdbc:mysql://localhost:3306/guestbook", "admin", "admin");     
          PreparedStatement pstmt = con.prepareStatement("delete from entries where id = " + id);
          pstmt.executeUpdate();
          pstmt.close();
          con.close();
      }
      catch (SQLException e) {}
      catch (ClassNotFoundException e) {}
  }
   
 
 
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
       
        response.setContentType("text/html; charset=UTF-8");
       
        PrintWriter out = response.getWriter();
        try{
            byte [] b = selectData().getBytes();
                out.println(new String(b, "UTF-8"));
            }catch(Exception e){}
           
            finally{
            out.close();
                }
       
    }
   

   

    /**
     * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
     */
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    boolean deltedData =false;
       
        try{
            String [] checkedBoxes = request.getParameterValues("checkbox");
           
            for (int i = 0; i < checkedBoxes.length; i++) {
                int line = Integer.parseInt(checkedBoxes[i]);
                deleteData(line);
                deltedData=true;
                }
   
            }
            catch(Exception e){}
       
        response.setContentType("text/html; charset=UTF-8");
        PrintWriter out = response.getWriter();
        try{
            if(!(deltedData)){
                String code="<p style=\"color:red\">Es wurden keine Einträge zum löschen ausgewählt!<br></p>";
                code+="<a href=\"http://localhost/admin/guestbook.php\"><button type=\"button\">Zur&uumlck zum Admin Bereich</button></a>";
                out.println(code);
               
            }
            else{
                String code="<p style=\"color:red\">Die Ausgewählten Einträge wurde erfolgreich entfernt!<br></p>";
                code+="<a href=\"http://localhost/admin/guestbook.php\"><button type=\"button\">Zur&uumlck zum Admin Bereich</button></a>";
                out.println(code);
            }
               
                }catch(Exception e){}
           
            finally{
            out.close();
                }
       
       
    }

}
Wenn ich das Servlet laufen lasse und auf die DB zugreife sieht es genauso aus wie im PhpMyAdmin. Woran kann das liegen?
WIe kann ich denn sehen auf welchen Zeichensatz mein Tomcat eingestellt ist bzw. wie kann ich den ggf. auf UTF8 umstellen?
Ich nutze Eclipse und habe dort auch meinen Tomcat als Server eingebunden.
 
Zurück
Oben