maskieren von "&" in MySQL db?

Alles, was MySQL betrifft, kann hier besprochen werden.

maskieren von "&" in MySQL db?

Postby tobi berlin » 28. January 2010 10:27

Guten Morgen,

ich stehe vor folgendem kleinen Problem: Eine Bildergalerie wird über eine Datenbank aufgebaut. Ein Feld trägt den Namen der Bilddatei, ein Feld den Untertitel, usw.

Die Untertitel werden über php in html umgesetzt und ausgegeben mit den Befehlen
Code: Select all
$row = mysql_fetch_object ($a);
...
$untertitel = htmlentities ($row->untertitel);
...
echo "<p><span id='untert'>$untertitel</span></p>

Jetzt habe ich aber in einem Untertitel das †-Zeichen. Dieses scheint nicht mit htmlentities convertiert zu werden - es erscheint das typische Zeichen für undefinierte Chars. Wenn ich nun aber den html-Code &dagger; in der Datenbank eingebe, wird nur das "&" in html umgesetzt und der Rest direkt übernommen - im Untertitel steht also genau "&dagger;", im Quelltext "&amp;dagger;". Ich denke mir also, man müsste vermeiden, dass das "&" im php in html-code umgesetzt wird, indem man es in dem Datenbankbankeintrag maskiert. Ist das möglich? Oder gibt es noch eine andere Möglichkeit, eine andere Codierungsanweisung in php?

Ich hoffe, das macht das Problem so weit deutlich. Ich möchte noch nicht die Seite direkt verlinken, weil einige vertrauliche Bilder dabei sind, von denen noch nicht ganz klar ist, ob sie veröffentlicht werden können.

Danke im Voraus,
mfg
Tobi
tobi berlin
 
Posts: 16
Joined: 18. September 2009 01:29

Re: maskieren von "&" in MySQL db?

Postby Wiedmann » 28. January 2010 10:52

Jetzt habe ich aber in einem Untertitel das †-Zeichen - es erscheint das typische Zeichen für undefinierte Chars.

In welcher Kodierung bekommst du Daten von der Datenbank und in welcher Kodierung erwartet der Browser die Zeichen?
Wiedmann
AF Moderator
 
Posts: 17106
Joined: 01. February 2004 12:38
Location: Stuttgart / Germany

Re: maskieren von "&" in MySQL db?

Postby tobi berlin » 28. January 2010 11:34

In Mysql: Kollation: utf8_unicode_ci
Im html:
Code: Select all
echo "<html><head><meta http-equiv='content-type' content='text/html; charset=utf-8' />
...


Der complette code sieht so aus, auch noch vorläufig, ich werde das Layout noch schöner machen, aber nur zur Veranschaulichung soweit:
Code: Select all
<?php

include ("../mysqlverbindung.php");

$id = $_GET['index'];
$maxid = $_GET['ged'];
$dbq = "SELECT bilddatei, untertitel FROM bilderref WHERE id='$id'";
$a = mysql_query ($dbq);
$row = mysql_fetch_object ($a);
$bilddatei = $row->bilddatei;
$untertitel = htmlentities ($row->untertitel);

echo "<html><head><meta http-equiv='content-type' content='text/html; charset=utf-8' />
<title>ERfA Bildergalerie - $bilddatei</title>
<link rel='icon' href='../pics/logotab.ico' type='image/ico'>
<link rel='stylesheet' href='galeriestyle.css'></head>
<body><center>";

//             ---- testen, ob Bild ist vorhanden:----
if (!file_exists($bilddatei)) echo "<p id='errmsg'>Dieses Bild in noch in Bearbeitung.<br />Wir bitten um Verst&auml;ndnis.</p>";
   else {
   echo "<img src='$bilddatei' alt='$untertitel' />";
   }

echo "<p><span id='untert'>$untertitel</span></p><br /><table cellspacing='0' cellpadding='0'><tr>";

//             ---- Galeriebuttons: -----
if ($id >     1 ) echo "<td id='buttons'><a href='bildfenster.php?index=". ($id-1 )."&ged=$maxid'><img src='bubck.gif' border='none' /></a></td>";
echo "<td id='schliessen'><a href='' onclick='window.close()'>Fenster<br />schlie&szlig;en</a></td>";
if ($id < $maxid) echo "<td id='buttons'><a href='bildfenster.php?index=". ($id+1 )."&amp;ged=$maxid'><img src='bufwd.gif' border='none' /></a></td>";
echo "</tr></table></center></body></html>";
?>


Der erzeugte Quelltext mit dem Sonderzeichen:
Code: Select all
<html><head><meta http-equiv='content-type' content='text/html; charset=utf-8' />
<title>ERfA Bildergalerie - pfeiferundtn.jpg</title>
<link rel='icon' href='../pics/logotab.ico' type='image/ico'>
<link rel='stylesheet' href='galeriestyle.css'></head>
<body><center><img src='pfeiferundtn.jpg' alt='........... (&amp;dagger;)' /><p><span id='untert'>............. (&amp;dagger;)</span></p><br /><table cellspacing='0' cellpadding='0'><tr><td id='buttons'><a href='bildfenster.php?index=38&ged=55'><img src='bubck.gif' border='none' /></a></td><td id='schliessen'><a href='' onclick='window.close()'>Fenster<br />schlie&szlig;en</a></td><td id='buttons'><a href='bildfenster.php?index=40&amp;ged=55'><img src='bufwd.gif' border='none' /></a></td></tr></table></center></body></html>
tobi berlin
 
Posts: 16
Joined: 18. September 2009 01:29

Re: maskieren von "&" in MySQL db?

Postby Wiedmann » 28. January 2010 11:59

In Mysql: Kollation: utf8_unicode_ci

Ok, in der utf-8 Kodierung ist es (hoffentlich) abgespeichert.

Code: Select all
include ("../mysqlverbindung.php");

Die Frage war ja aber, in welcher Kodierung du es bekommst (und das ist ja derzeit wohl kein utf-8) und wird wohl in dieser Datei festgelegt (macht man jedenfalls normal im Connectionsstring oder gleich nach der Connection).

So nebenbei:
Code: Select all
echo "<html><head><meta http-equiv='content-type' content='text/html; charset=utf-8' />
...
echo "<p id='errmsg'>Dieses Bild in noch in Bearbeitung.<br />Wir bitten um Verst&auml;ndnis.</p>";

Entitys benutzt man nicht wenn nicht nötig (tm). Und bei utf-8 ist sind die abgesehen von den 4 Specialchars für nichts nötig.
Wiedmann
AF Moderator
 
Posts: 17106
Joined: 01. February 2004 12:38
Location: Stuttgart / Germany

Re: maskieren von "&" in MySQL db?

Postby tobi berlin » 28. January 2010 12:58

Ok, in der utf-8 Kodierung ist es (hoffentlich) abgespeichert.
Also ich habe jetzt das † Zeichen nochmal im Notepad als utf-8 gespeichert, neu geöffnet und nochmal in die Datenbank rüberkopiert - wieder undefiniertes Sonderzeichensymbol.

Die Frage war ja aber, in welcher Kodierung du es bekommst (und das ist ja derzeit wohl kein utf-8) und wird wohl in dieser Datei festgelegt (macht man jedenfalls normal im Connectionsstring oder gleich nach der Connection).

Diese include-datei "mysqlverbindung.php" sieht bei mir so aus:
Code: Select all
<?php
$dbconect = mysql_connect ('...','...','...');
if (!$dbconect) {
  die('Keine Verbindung zur Datenbank. '.mysql_error()) ;
  }

$dbselct = mysql_select_db ('...', $dbconect);
if (!$dbselct) {
 die('DB konnte nicht ausgewählt werden. '.mysql_error());
}
?>
Ich habe leider noch nicht so viel Erfahrung mit der Materie. Muss denn da noch irgendwo ne codierungsangabe stehen?


So nebenbei: Entitys benutzt man nicht wenn nicht nötig (tm). Und bei utf-8 ist sind die abgesehen von den 4 Specialchars für nichts nötig.
Das verstehe ich jetzt auch nicht ganz. Wenn ich die Funktion htmlentities weglasse, werden alle Umlaute und Anführungszeichen nicht mehr richtig codiert...
tobi berlin
 
Posts: 16
Joined: 18. September 2009 01:29

Re: maskieren von "&" in MySQL db?

Postby Wiedmann » 28. January 2010 14:05

Das verstehe ich jetzt auch nicht ganz. Wenn ich die Funktion htmlentities weglasse, werden alle Umlaute und Anführungszeichen nicht mehr richtig codiert...

Eben deshalb, weil du von der DB im Moment kein utf-8 geliefert bekommst.

Aber mir ging es in dem Zitat ja auch (erstmal nicht) um das was aus der DB kommt, sondern was du direkt im Code stehen hast:
Code: Select all
echo "<p id='errmsg'>Dieses Bild in noch in Bearbeitung.<br />Wir bitten um Verst&auml;ndnis.</p>";

In welcher Kodierung ist denn die PHP-Datei abgespeichert?
Wiedmann
AF Moderator
 
Posts: 17106
Joined: 01. February 2004 12:38
Location: Stuttgart / Germany

Re: maskieren von "&" in MySQL db?

Postby tobi berlin » 28. January 2010 14:45

Die php-Datei ist auch im utf-8 Format... :|
tobi berlin
 
Posts: 16
Joined: 18. September 2009 01:29

Re: maskieren von "&" in MySQL db?

Postby Wiedmann » 28. January 2010 15:07

Die php-Datei ist auch im utf-8 Format... :|

Warum schreibst du dann nicht?:
Code: Select all
echo "<p id='errmsg'>Dieses Bild in noch in Bearbeitung.<br />Wir bitten um Verständnis.</p>";


BTW:
Du benutzt immer mal wieder "/>" in deinen HTML Tags. Das wäre XHTML. Du sagst dem Browser aber, dass jetzt HTML kommt (und das auch noch ohne Dokumenttyp-Deklarationen).
Wiedmann
AF Moderator
 
Posts: 17106
Joined: 01. February 2004 12:38
Location: Stuttgart / Germany

Re: maskieren von "&" in MySQL db?

Postby tobi berlin » 28. January 2010 15:27

Ich muss gestehen, a) ich habe diesen popupwindows noch keine ordentliche html-Deklaration gegeben, weil das ganze Design noch vorläufig ist... :oops: das habe ich jetzt nachgeholt, sodass der Anfang jetzt so aussieht (aus php erzeugt):

Code: Select all
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="de-AT">
<head>
...
und b) dass ich immer wieder feststelle, dass mir noch einiges an Grundlagenwissen fehlt.
Aber auch mit diesem header wird das † nicht richtig angezeigt.

Das "Verständnis" in der einen Meldung habe ich jetzt mit richtigen ä geschrieben, und es funktioniert auch, wenn das Bild nicht gefunden wird. Aber an allen anderen Stellen werden die Umlaute nicht angezeigt, wenn sie direkt im html stehen. Warum :?: Ich werde bei Gelegenheit nochmal einige Zeit damit aufbringen müssen, mich mit den verschiedenen Codierungen und doc-type-Deklarationen vertraut zu machen.

Ich hoffe, bis dahin beanspruche ich deine Gedult mit meiner Unerfahrenheit nicht all zu sehr. :)
tobi berlin
 
Posts: 16
Joined: 18. September 2009 01:29

Re: maskieren von "&" in MySQL db?

Postby Wiedmann » 28. January 2010 15:38

Aber an allen anderen Stellen werden die Umlaute nicht angezeigt, wenn sie direkt im html stehen.

Damit meinst du jetzt eine anderen Datei?

Weil:
Code: Select all
echo "<td id='schliessen'><a href='' onclick='window.close()'>Fenster<br />schließen</a></td>";

muss genauso funktionieren, anstatt:
Code: Select all
echo "<td id='schliessen'><a href='' onclick='window.close()'>Fenster<br />schlie&szlig;en</a></td>";
Wiedmann
AF Moderator
 
Posts: 17106
Joined: 01. February 2004 12:38
Location: Stuttgart / Germany

Re: maskieren von "&" in MySQL db?

Postby tobi berlin » 29. January 2010 10:34

Wiedmann wrote:Damit meinst du jetzt eine anderen Datei?
Ja. Wenn Sonderzeichen ßü direkt im html-quellcode stehen, kommt �
Ich habe jetzt das &szlig; im "Fenster schließen" mit ß ausgetauscht, und an dieser Stelle wird es auch richtig angezeigt. Vielleicht weil es über den php-parser geht?
tobi berlin
 
Posts: 16
Joined: 18. September 2009 01:29

Re: maskieren von "&" in MySQL db?

Postby Wiedmann » 29. January 2010 10:57

Ja. Wenn Sonderzeichen ßü direkt im html-quellcode stehen, kommt �

Naja, eigentlich ist das ganz simpel:
Die Kodierung in der die Datei abgespeichert ist, muss mit der übereinstimmen, die man in "meta charset" angibt. Dann passiert dies nicht. Maskieren mit Entitys muss man dann nur die Zeichen, die es im eingestellten Charset nicht gibt, weshalb ja UTF-8 praktisch ist, da es dort alle Zeichen gibt.

In diesem Beispiel ist eben die Datei in einer anderen Kodierung abgespeichert, als in "meta charset" angegeben. Also musst du hier mal schauen, wie die Datei abgespeichert ist, und was du im "meta charset" angibst.


Diese include-datei "mysqlverbindung.php" sieht bei mir so aus:
Code: Select all
$dbconect = mysql_connect ('...','...','...');
if (!$dbconect) {
  die('Keine Verbindung zur Datenbank. '.mysql_error()) ;
  }

$dbselct = mysql_select_db ('...', $dbconect); 

Dann noch schnell zu deinem DB Problem. Da du im "meta charset" UTF-8 abgibst, sagst du einfach MySQL das du eben dieses haben willst:
Code: Select all
$dbconect = mysql_connect ('...','...','...');
if (!$dbconect) {
  die('Keine Verbindung zur Datenbank. '.mysql_error()) ;
  }

mysql_set_charset('utf8', $dbconect);

$dbselct = mysql_select_db ('...', $dbconect); 


Code: Select all
$untertitel = htmlentities ($row->untertitel); 

Und dann wollen wir nur bei den 4 Zeichen Entitys wo es nötig ist:
Code: Select all
$untertitel = htmlspecialchars($row->untertitel); 
Wiedmann
AF Moderator
 
Posts: 17106
Joined: 01. February 2004 12:38
Location: Stuttgart / Germany

Re: maskieren von "&" in MySQL db?

Postby tobi berlin » 29. January 2010 12:03

Das sieht schonmal sehr gut aus. Ich habe es auf localhost getestet. Anscheinend gibts ausgerechnet jetzt gerade Verbindungsprobleme mit dem server, und abgehakt ist die Sache für mich erst, wenn auch online das richtige Zeichen dargestellt wird, sollte es aber auch.

In sofern möchte ich mich schonmal sehr für deine Hilfe und Mühe bedanken, Wiedmann! :)

Falls es online doch nicht richtig geht, meld ich mich hier nochmal. Ansonsten wünsche ich allen ein schönes Wochenende!

Grüße
tobi
tobi berlin
 
Posts: 16
Joined: 18. September 2009 01:29

Re: maskieren von "&" in MySQL db?

Postby tobi berlin » 30. January 2010 17:14

Das Problem verlagert sich...

Wie gesagt, auf localhost mit meiner Xampp Version geht es problemlos. Mir kommt es merkwürdigerweise so vor, als hätte das php auf dem Server Probleme mit der funktion, denn alle Seiten sind nach dem mysql_set_charset('utf8', $dbconect); abgeschnitten. Auch wenn ich es als Abfrage schreibe, steigt es aus und alles Folgende wird nicht mehr angezeit. Woran kann das liegen? Ich werde wohl am Montag mal beim Server anrufen müssen... :|

Laut php.net ist das (PHP 5 >= 5.2.3),
Der Server bietet laut seiner HP PHP 4/5... das wär natürlich etwas erbärmlich...
tobi berlin
 
Posts: 16
Joined: 18. September 2009 01:29

Re: maskieren von "&" in MySQL db?

Postby Wiedmann » 30. January 2010 17:44

als hätte das php auf dem Server Probleme mit der funktion, denn alle Seiten sind nach dem mysql_set_charset('utf8', $dbconect); abgeschnitten.

Laut php.net ist das (PHP 5 >= 5.2.3),
Der Server bietet laut seiner HP PHP 4/5... das wär natürlich etwas erbärmlich...

Und welches PHP5 ist es dann genau auf dem Server? (MySQL muss dann auch noch mind. 5.0.7 sein).

Ansonsten steht ja im Manual auch die Alternative, wie es auch ohne diese Funktion geht.
Wiedmann
AF Moderator
 
Posts: 17106
Joined: 01. February 2004 12:38
Location: Stuttgart / Germany

Next

Return to MySQL

Who is online

Users browsing this forum: No registered users and 4 guests