UTF-8 bei Mysql

ghostadmin

Grand Admiral Special
Mitglied seit
11.11.2001
Beiträge
25.208
Renomée
189
Standort
Dahoam Studios
Ich habe meine Webseite komplett auf UTF-8 laufen, nur bei Mysql fehlt da noch was. Und zwar hatte ich mit den Defaults zwar richtigen Output aber in der Datenbank selber waren die Umlaute mit seltsamen Zeichen gespeichert und das erschwert das editieren.

Jetzt hab ich mal das nach /etc/mysql/my.cnf in den Abschnitt mysqld
character-set-server=utf8
skip-character-set-client-handshake
default-character-set=utf8
init-connect='SET NAMES utf8'

und
default-character-set=utf8 in den Abschnitt client

Nach der Änderung auf der Console mit mysql update blabla werden die Umlaute aber als ? gespeichert.
Schreibe ich etwas auf der Webseite in die DB, werden die Umlaute auch mit wirren Zeichen reingeschrieben. Allerdings von der Webseite richtig angezeigt.

Diesen Tag benutze ich auf der Webseite:
meta http-equiv="Content-Type" content="text/html; charset=UTF-8"
 
Zuletzt bearbeitet:
Ich hatte da auch schonmal meine Späße damit. Eine Sache ist, dass MySQL die Encoding-Geschichten nur ordentlich benutzen kann, wenn man auf PHP-Seite (ich gehe mal davon aus, dass Du da mit PHP drauf zugreifst) nicht die alten mysql_*-Funktionen benutzt, die noch kompatibel zur 3.23er-Version sind, sondern die neuen mysqli_*-Funktionen, die erst ab MySQL-Version 4.0 funktionieren. Falls Du eine Datenbankabstraktionsschicht benutzt (PearDB, ADODB, usw) muss man auch hier darauf achten das richtige Modul beim Initialisieren einzustellen. Vielleicht hilft Dir das ja schon weiter.
 
Also ich bin Anfänger bei MySQL !

Meinst du z.B. sowas:
$row = mysql_fetch_row($result);

An der Konsole bin ich so vorgegangen um die Umlaute in die Datensätze zu ersetzen:

mysql -u user -p
use blabladb
update blatable set field='text' where id='nummer'

In der my.cnf steht noch unter mysqld:
language = /usr/share/mysql/english
aber das ist glaube ich nur für Fehlercodes

Edit: Im PHP Bereich hab ich folgendes nach dem Connect eingefügt und das funktioniert:
$utf8=mysql_query("SET NAMES 'utf8' COLLATE 'utf8_general_ci'") or die(mysql_error());
Allerdings an der Konsole noch nicht.
Am besten ich schreibe mir gleich was in PHP zum editieren, dann brauche ich die Konsole nicht mehr.
 
Zuletzt bearbeitet:
In PHP gibt es mehrere Möglichkeiten direkt mit MySQL zu reden, siehe http://de.php.net/manual/en/refs.database.php:

Die Funktionen, die mit mysql_* anfangen, sind die älteste (und zugegebenermassen auch bekannteste Variante). Damit hast Du aber nicht die vollen Möglichkeiten mit Features von MySQL 4.1 und höher umzugehen, u.a. sind da auch die Encoding-Sachen nicht zugängig. Dafür benötigst Du meiner Ansicht nach die Klassen und Funktionen aus der mysqli-Extension (siehe http://de.php.net/manual/en/book.mysqli.php).

Ich habe das selbst auch noch nicht benutzt, weil ich mit MySQL schon seit Ewigkeiten nichts mehr gemacht habe, sondern seit vielen Jahren vor allem mit PostgreSQL arbeite. Bei meinem letzten Ausflug mit dem phpMyAdmin habe ich aber festgestellt, dass man den mit beiden Varianten betreiben kann und die Encoding-Dinge erst mit der mysqli-Version ordentlich benutzbar sind. Von daher leite ich ab, dass das vielleicht auch etwas für Dich ist.
 
Jetzt möchte ich folgendes machen, eine Row mittels Angabe einer ID aus einer Table laden und als HTML Form das Feld "name" und "comments" generieren.

Das habe ich jetzt drin aber es wird nichts angezeigt:

Im Hauptscript:
PHP:
<form id="load" name="load" action="priv/guestload.php" method="post" target="_self">
ID:
<input class="input1" type="text" size="1" name="eid" />
<input class="input2" type="submit" value="id Laden" />
</form>

Das ist extra weil Passwortgeschützt:
PHP:
<?php
    $connection=mysql_connect('localhost','xxx','xxx') or die(mysql_error());
    $sql=mysql_select_db('dbname') or die(mysql_error());
    $eid = trim($_POST['eid']);
    if($eid !='')
    {
    $query = 'SELECT * FROM guestbook WHERE id="'.$eid.'"';
    }
    else
    {
    echo("Keine id gew&auml;hlt");
    }


    $result = mysql_query($query);
    
    if($result)
    {
    
        
	echo $row['name'];
	echo $row['comments'];
        
    }
    else
    {
    echo("Fehler beim laden");
    }
?>
 
Da fehlt die Zuweisung für $row in Deinem Code, also z.B. ein mysql_fetch_row()-Aufruf.

Ich würde Dir aber raten auf eine Abstraktionsschicht wie Pear :: DB oder ADODB oder auch PDO zu setzen, da hast Du ein einheitlicheres Datenbankhandling! Schau dazu mal in http://openbook.galileocomputing.de/php_pear/15_0_database-001.htm#ef4d83b1a81589a211763a47bbe2e187 rein. Genaugenommen ist Pear :: DB schon veraltet und man verwendet heute Pear :: MDB2, das funktioniert aber fast zu 99% gleich und unterscheidet sich im Code nur in der Initialisierung am Anfang.
 
Zuletzt bearbeitet:
PHP:
$result = mysql_query($query);
    
    if($result)
    {
    
        $row = mysql_fetch_row($result);
	echo '<span class="name">'.$row['name'].'&nbsp;</span>';
	echo '<div class="text">'.$row['comments'].'</div>';
        
    }

Das zeigt auch nichts an *noahnung*

Edit:
So funktoniert es:
PHP:
$row = mysql_fetch_array($result);
	echo '<form>';
	echo '<input value='.$row['name'].' />';
	echo '<textarea rows="5" cols="45">'.$row['comments'].'</textarea>';
        echo '</form>';
.
EDIT :
.

Kann man die ausgegebenen Werte in einer Variable speichern, welche dann benutzt wird wenn man die Seite nochmal aufruft?

Ich möchte ja gleichzeitig mit Eingabe einer ID die Form Felder ausgeben (das geht jetzt) aber wenn man diese Felder verändert und auf Submit klickt sollen die Feder in der DB gespeichert werden. Bei meinen Versuchen sind die Werte aber immer verschwunden sobald man auf Submit klickt.

Soweit der Code, nur das Anzeigen funktioniert:

PHP:
<form id="show" name="show" action="<?php echo $_SERVER['SCRIPT_NAME']?>" method="post" target="_self">
ID: <input type="text" size="1" name="eid" />
<input type="submit" value="Show" />
<input type="hidden" name="show" value="1" />
</form>


<?php

if(isset($_POST['show']) and $_POST['show']==1)
{

    $eid = trim($_POST['eid']);
    if($eid !='')
    {
    
$connection=mysql_connect('localhost','admin','xxx') or die(mysql_error());
$sql=mysql_select_db('somedb') or die(mysql_error());
$query = 'SELECT * FROM guestbook WHERE id="'.$eid.'"';
    $result = mysql_query($query);
    
    if($result)
    {
    
        $row = mysql_fetch_array($result);
	echo '<form>Name:';
	echo '<input value='.$row['name'].' />';
	echo 'Kommentar:<textarea rows="5" cols="45">'.$row['comments'].'</textarea>';
        echo '</form>';
    }
    else
    {
    echo("Fehler beim laden");
    }
    }
    else
    {
    echo("Keine id gew&auml;hlt");
    }
}



if(isset($_POST['edit']) and $_POST['edit']==1)
{
$connection=mysql_connect('localhost','admin','xxx') or die(mysql_error());
$sql=mysql_select_db('somedb') or die(mysql_error());
$query = 'UPDATE guestbook set name = "'.$name.'" WHERE id = "'.$eid.'"';
echo $query;
$result = mysql_query($query);
$query = 'UPDATE guestbook set comments = "'.$comments.'" WHERE id = "'.$eid.'"';
$result = mysql_query($query);

}



?>

<form id="edit" name="edit" action="<?php echo $_SERVER['SCRIPT_NAME']?>" method="post" target="_self">
ID: <input type="text" size="1" name="eid" />
<input type="submit" value="Editieren" />
<input type="hidden" name="edit" value="1" />
</form>

<?php

phpinfo(INFO_VARIABLES);
?>
 
Zuletzt bearbeitet:
Zurück
Oben Unten