php.de

Zurück   php.de > Webentwicklung > Datenbanken

Datenbanken SQL und Co

Antwort
 
LinkBack Themen-Optionen Thema bewerten
Alt 11.02.2012, 21:37  
Neuer Benutzer
 
Benutzerbild von JankoHack
 
Registriert seit: 19.05.2009
Beiträge: 9
JankoHack befindet sich auf einem aufstrebenden Ast
Standard [Erledigt] PHP/MySQL: Ersetzen von zerstören Umlauten oder anderen Zeichen in komplet

Hallo,

da ich selbst lange gesucht habe und nichts fand habe ich es eben selber gemacht. Auf gleich Weise könnte man das Tool auf eine komplette Datenbank erweitern.

Viel Spaß damit

Gruß Janko

PHP-Code:
<?
$db_host   
"localhost";           // Host der Datenbank
$db_user   "dbuser";              // Datenbank-User
$db_pass   "mypassword";          // Datenbank-Passwort
$db_name   "Firma";               // Name der Datenbank
$db_table  "Kunden";                // Name der Tabelle in dessen Felder die Zeichen ersetzt werden sollen

$array_von  = array("ä","Ä","ü","Ü","ö","Ö","ß");    // Ersetze diese Zeichen (beliebig erweiterbar)
$array_nach = array("ä" ,"Ä" ,"ü" ,"Ü" ,"ö" ,"Ö" ,"ß");     // zu diese Zeichen (beliebig erweiterbar)

// Oder ersetze zu HTML:
// $array_von  = array("ä"     ,"Ä"     ,"ü"     ,"Ü"     ,"ö"     ,"Ö"     ,"ß"      ,"€");         // Ersetze diese Zeichen (beliebig erweiterbar)
// $array_nach = array("&auml;","&Auml;","&uuml;","&Uuml;","&ouml;","&Ouml;","&szlig;","&euro;");    // zu diese Zeichen (beliebig erweiterbar)

$db = @mysql_connect($db_host,$db_user,$db_pass) or die(mysql_error());
@
mysql_select_db($db_name,$db) or die(mysql_error());

$query  "SHOW COLUMNS FROM `".$db_table."`";                                     // Query zur Ermittel Tabellenfelder
$result = @mysql_query($query);                                                   // Query ausführen und Ergebnis in $result schreiben
if (mysql_errno() != 0){ echo mysql_error(); }                                      // Gab es bei der Abfrage einen Fehler?Wenn ja, dann ausgeben
else { $num mysql_numrows($result); }                                         // Ermitteln wie viele Datensätze gefunden wurden

if ($num 0){
        
$query_update  "UPDATE `".$db_name."`.`".$db_table."` Set \n";        // Generiere Update-Query
        
for($i=0;$i<$num;$i++){                                                 // Durchlaufe Feldnamen
            
$fieldname     mysql_result($result,$i,"Field");
            for(
$x=0;$x<sizeof($array_von);$x++){                               // Durchlaufe Ersetzungen
                
$query_update .= "`".$fieldname."` = REPLACE(`".$fieldname."`, '".$array_von[$x]."','".$array_nach[$x]."')";
                    if ((
sizeof($array_von)-1) != $x){
                        
$query_update .= ", \n";
                    }
                    else if ((
$num-1) != $i){
                               
$query_update .= ", \n";
                    }

            }
        }
            @
mysql_query($query_update);
            if (
mysql_errno() != 0){ echo mysql_error(); }

            else {echo 
"<pre>------------- OK ------------- \n Betroffene Datensätze: ".mysql_affected_rows()."\n------------------------------ \n </pre>";}
}

?>

Geändert von JankoHack (12.02.2012 um 10:04 Uhr).
JankoHack ist offline   Mit Zitat antworten
Sponsor Mitteilung
PHP Code Flüsterer

Registriert seit: 21.08.2005
Beiträge: 4682
PHP-Kenntnisse:
Fortgeschritten

Alt 11.02.2012, 22:53  
moderatives Dielektrikum
 
Benutzerbild von nikosch
 
Registriert seit: 21.05.2008
Beiträge: 35.987
PHP-Kenntnisse:
Fortgeschritten
nikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunft
Standard

Zerstörte Umlaute haben ein Grund. Oftmals sind sie nicht einmal zerstört, sondern es passen einfach nicht Daten- und Ausgabezeichensatz zusammen. Wie auch immer, man sollte die Ursachen angehen, nicht an den Symptomen rumdoktoren.
__________________
--
One pixel is still too big. Please make it smaller. ASAP.

Initiative Mittelstand.
Die wichtigste Gestaltungsregel im Screendesign ist Pi mal Daumen des Arbeitgebers.
--
nikosch ist offline   Mit Zitat antworten
Alt 12.02.2012, 09:58  
Neuer Benutzer
 
Benutzerbild von JankoHack
 
Registriert seit: 19.05.2009
Beiträge: 9
JankoHack befindet sich auf einem aufstrebenden Ast
Standard

Hallo Nikosch,

ich sehe schon: Du hast keinen Bedarf.
Aber ich verrate Dir was: Für diese Art der Problemlösung habe ich mich bewusst entschieden, da *ich* keine andere Möglichkeit gefunden habe und auch die Einstellungen am Zeichensatz oder "CONVERT TO CHARSET latin1" nichts brachte.

Wie dem auch sei: Mit meinem Post konnte ich nicht nur mein Problem lösen sondern helfe auch noch der Nachwelt des Forums (im Gegensatz zu Deinem Beitrag).

Gruß Janko
JankoHack ist offline   Mit Zitat antworten
Alt 12.02.2012, 10:42  
Erfahrener Benutzer
 
Benutzerbild von tr0y
 
Registriert seit: 26.07.2010
Beiträge: 4.856
PHP-Kenntnisse:
Fortgeschritten
tr0y ist ein wunderbarer Anblicktr0y ist ein wunderbarer Anblicktr0y ist ein wunderbarer Anblicktr0y ist ein wunderbarer Anblicktr0y ist ein wunderbarer Anblicktr0y ist ein wunderbarer Anblicktr0y ist ein wunderbarer Anblicktr0y ist ein wunderbarer Anblick
tr0y eine Nachricht über MSN schicken
Standard

Mit dem Post hilfst du der Nachwelt nur wenig bis garnicht. MySQL unterstützt ein Breites Zeichensatzmodell, in jedem Fall ist es wichtig MySQL beim insert der Daten das richtige Encoding zu liefern das MySQL für diese Tabelle auch nutzt. ( Source-Charset <-> Destination-Charset ), gleiches gilt für das abfragen von Daten bei dem Grundsätzlich vom Script / von der API verstanden werden muss was MySQL liefert und ob es im Folge der Datenpublikation das Encoding selbstständig verändern muss.

Du gehst hin und replaced in der Datenbank "miss-spelled Signs" gegen ihr "current used Charset"-Equivalent. Grundsätzlich evaluierst du aber nicht die Charset-Symbiose wie oben beschrieben, du patcht nur optische Probleme.

Ein gutes "Tool" gräbt alle Daten aus der Datenbank stück für stück aus und replaced alle Datensätze korrekt encoded zurück in die Datenbank, was Grundsätzlich sogar innerhalb der Datenbank passieren kann. Wie bei allen Encoding-Issues muss man allerdings wissen in welchem Encoding die Daten dort eingefügt wurden, hat man kenntniss darüber dürfte ein temporäres Transcoding einer Tabelle mit referenz auf ein SELECT-Statement mit ausgelieferte COLLATE-Angabe seinen Job tun, das Zieltable würde angeben als was du encoden willst, COLLATE entsprechend im SELECT-Statement als was MySQL die Inhalte der Columns interpretieren soll.

Grundsätzlich aber im Table rumzuklecksen, halte ich für die vollkommen falsche Vorgehensweise.

Von daher: @nikosch -> FULL ACK

Außerdem:
Dein Script hinkt, du nutzt Error-Supression, für mich ein klares Zeichen das dich Fehler nicht interessieren und auch Fehler nicht den User des Scripts interessieren sollen. Fehler unterdrückt man nicht, Fehler wertet man aus und reagiert entsprechend. Auch mit Schleifen sich durch Daten zu graben sei ja vielleicht eine generell gute Möglichkeit. Sich allerdings nur auf mysql_num_rows() zu verlassen bindet das ganze ein Stückweit an wirklich nur eine Datenbankplattform und auch wirklich nur an ein Driver-Modell. Viele ( und vielleicht auch zukünftige MySQL-Driver ) liefern keine mysql_num_row-Daten aus, so das man, wenn man schon wissen will wieviele Rows dort reinkommen, vorher entsprechend mit
Code:
SELECT COUNT(*) as countOf FROM yourTable WHERE yourExpression = 'match this here'
, die Sache selbstständig und allgegenwärtig abfragt.

Generell:
Du gehst bei deinem Script fest davon aus das der zugrundeliegende Datenbestand grundsätzlich SGML ist, SGML ( HTML, XML ) hat aber im Prinzip nix in der Datenbank verloren, sondern würde ( wenn überhaupt ) erst in der Darstellenden Schicht der Anwendung die sich die Daten holt aus dem zur Verfügung stehenden Encoding erzeugt werden.

Ein Beispiel wäre hier ein Benutzername der äüö's enthält. Dein Source würde dort beim reparieren der Tabelle entsprechend das SGML-Equivalent rein-replacen, geht die Anwendung nun hin und fragt bei einem Login-Vorgang die Tabelle ab ob user Läüös existiert ( was er ja ohne SGML tun würde ), sagt die Datenbank ihm: Nö. Fatales Ergebnis.
__________________
Lasse mir ohne Anwendung von Gewalt Dinge schenken, Amazon weiß darüber bald mehr.

Geändert von tr0y (12.02.2012 um 11:27 Uhr).
tr0y ist offline   Mit Zitat antworten
Alt 12.02.2012, 13:02  
Neuer Benutzer
 
Benutzerbild von JankoHack
 
Registriert seit: 19.05.2009
Beiträge: 9
JankoHack befindet sich auf einem aufstrebenden Ast
Standard

Ja, ich gebe Dir zum Teil recht. Das Problem besteht aber nun trotzdem. Es besteht bereits im Dump - Und dort auch nur stellenweise. Welche Möglichkeit gäbe es ein solches Dump - welches "falsche und richtige" Umlaute enthält - richtig einzuspielen? Auf das Dump habe ich keinen Einfluss (von extern geliefert)!
Zitat:
Dein Script hinkt, du nutzt Error-Supression, für mich ein klares Zeichen das dich Fehler nicht interessieren
PHP-Code:
if (mysql_errno() != 0){ echo mysql_error(); } 
Scherzkeks

Gruß Janko
JankoHack ist offline   Mit Zitat antworten
Alt 12.02.2012, 13:22  
Erfahrener Benutzer
 
Benutzerbild von tr0y
 
Registriert seit: 26.07.2010
Beiträge: 4.856
PHP-Kenntnisse:
Fortgeschritten
tr0y ist ein wunderbarer Anblicktr0y ist ein wunderbarer Anblicktr0y ist ein wunderbarer Anblicktr0y ist ein wunderbarer Anblicktr0y ist ein wunderbarer Anblicktr0y ist ein wunderbarer Anblicktr0y ist ein wunderbarer Anblicktr0y ist ein wunderbarer Anblick
tr0y eine Nachricht über MSN schicken
Standard

Zitat:
Zitat von JankoHack Beitrag anzeigen
Ja, ich gebe Dir zum Teil recht. Das Problem besteht aber nun trotzdem. Es besteht bereits im Dump - Und dort auch nur stellenweise. Welche Möglichkeit gäbe es ein solches Dump - welches "falsche und richtige" Umlaute enthält - richtig einzuspielen? Auf das Dump habe ich keinen Einfluss (von extern geliefert)!

PHP-Code:
if (mysql_errno() != 0){ echo mysql_error(); } 
Scherzkeks

Gruß Janko
PHP-Code:
set_error_handler(function ( $errno$errstr$errfile$errline, array $context ) {
   if ( 
error_reporting() === ) return false;
   throw new 
ErrorException($errstr0$errno$errfile$errline);
}, 
E_ALL E_STRICT );

$databaseErrors = array();

try {
    
mysql_connect('localhost''test1','test2');
}
catch ( 
ErrorException $e ) {
    
$databaseErrors[] = array('type' => 'connect''message' => $e->getMessage());
}

if ( 
count($databaseErrors) == ) {
    
/* ... */
}
else {
    echo 
'Sorry, this script could not run properly, the following list of errors occured:'."<br />";
    foreach ( 
$databaseErrors as $item ) {
        echo 
'[ '.$item['type'].' ]: '.$item['message']."<br />";
    }

was das dump angeht, stell fest welches encoding das dump hat und welches encoding die Datenbank verwendete. Wenn die Ursache dort schon festzustellen ist kannst du a) Das Dump mit iconv by PHP nachbearbeiten ( parsen ) oder es nach dem Datenbank-Insert wie geschildert auf Datenebene verändern. Grundsätzlich musst du aber zuerst feststellen was für ein Encoding der ganzen geschichte zugrundeliegt.
__________________
Lasse mir ohne Anwendung von Gewalt Dinge schenken, Amazon weiß darüber bald mehr.
tr0y ist offline   Mit Zitat antworten
Alt 12.02.2012, 14:28  
Neuer Benutzer
 
Benutzerbild von JankoHack
 
Registriert seit: 19.05.2009
Beiträge: 9
JankoHack befindet sich auf einem aufstrebenden Ast
Standard

Danke für die Antwort...

EOD
JankoHack ist offline   Mit Zitat antworten
Alt 12.02.2012, 14:47  
Erfahrener Benutzer
 
Benutzerbild von tr0y
 
Registriert seit: 26.07.2010
Beiträge: 4.856
PHP-Kenntnisse:
Fortgeschritten
tr0y ist ein wunderbarer Anblicktr0y ist ein wunderbarer Anblicktr0y ist ein wunderbarer Anblicktr0y ist ein wunderbarer Anblicktr0y ist ein wunderbarer Anblicktr0y ist ein wunderbarer Anblicktr0y ist ein wunderbarer Anblicktr0y ist ein wunderbarer Anblick
tr0y eine Nachricht über MSN schicken
Standard

Zitat:
Zitat von JankoHack Beitrag anzeigen
Danke für die Antwort...

EOD
Soviel Sand.. und keine Förmchen..
__________________
Lasse mir ohne Anwendung von Gewalt Dinge schenken, Amazon weiß darüber bald mehr.
tr0y ist offline   Mit Zitat antworten
Alt 12.02.2012, 16:49  
moderatives Dielektrikum
 
Benutzerbild von nikosch
 
Registriert seit: 21.05.2008
Beiträge: 35.987
PHP-Kenntnisse:
Fortgeschritten
nikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunft
Standard

Zitat:
was das dump angeht, stell fest welches encoding das dump hat und welches encoding die Datenbank verwendete. Wenn die Ursache dort schon festzustellen ist kannst du a) Das Dump mit iconv by PHP nachbearbeiten ( parsen ) oder es nach dem Datenbank-Insert wie geschildert auf Datenebene verändern. Grundsätzlich musst du aber zuerst feststellen was für ein Encoding der ganzen geschichte zugrundeliegt.
Ganz genau. Auf dieses Vorgehen wurde auch schon oft in diesem Forum hingewiesen- Entscheidend ist, mit einer sauberen DB zu beginnen, sonst trägst DU das Problem weiter und weiter und selbst korrekt arbeitende Systeme haben plötzlich Probleme mit den Umlauten.
Der vorgeschlagene Code ist zudem hochgradig ineffizient, weil jedes Zeichen in verschachtelten Anfragen einzeln ersetzt wird. In einem DB Dump ließe sich so etwas wesentlich effizienter erreichen.
__________________
--
One pixel is still too big. Please make it smaller. ASAP.

Initiative Mittelstand.
Die wichtigste Gestaltungsregel im Screendesign ist Pi mal Daumen des Arbeitgebers.
--
nikosch ist offline   Mit Zitat antworten
Antwort


Themen-Optionen
Thema bewerten
Thema bewerten:

Forumregeln
Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are an
Gehe zu

Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
Wert aus einer Tabelle mit Daten aus einer anderen Tabelle ersetzen bigdaddy83le PHP Einsteiger 8 21.07.2011 14:23
[Erledigt] Tabelle in Abhängigkeit einer anderen Tabelle Quu Datenbanken 8 26.06.2011 14:15
Bestehende php /Myqsl Tabelle Neben einander aus geben Totti-Totti PHP Tipps 2009 3 21.12.2009 11:00
variable Zeichen ersetzen Menuhin Datenbanken 12 02.09.2009 16:00
Zeichen in allen Datensätzen ersetzen halskrause Datenbanken 3 14.03.2009 20:34
wert aus einer tabelle mit wert aus andere tabelle ersetzen lindner Datenbanken 3 11.07.2006 17:20
Problem: Zeichen in ganzer Tabelle ersetzen Datenbanken 1 03.12.2005 21:21
[Erledigt] Zeichen ersetzen in einem Dokument PHP Tipps 2007 16 25.11.2005 14:16
auf Mysql Datenbank Zeichen ersetzen durch andere ??? Tango Beitragsarchiv 1 01.08.2005 01:48
auf Mysql Datenbank Zeichen ersetzen durch andere ??? Tango PHP Tipps 2005-2 0 31.07.2005 20:14
[Erledigt] Ein Zeichen durch ein anderes ersetzen PHP Tipps 2005 1 17.02.2005 08:52
HILFE: Column count doesn't match value count at row 1 Datenbanken 17 12.06.2004 16:45

Besucher kamen über folgende Suchanfragen bei Google auf diese Seite
mysql zeichen austauschen, mysql umlaute ersetzen, mysql ersetzen zeichen, php sonderzeichen in umlaute ersetzen, php mysql umlaute umwandeln, php mysql ersetzen umlaute, mysql datenbank zerstören, mysql zeichen in kompletter datenbank erstetzen, sonderzeichen ersetzen in mysql mit php, mysql ersetzen von zeichen, daten ersetzen php mysql skript

Alle Zeitangaben in WEZ +2. Es ist jetzt 17:05 Uhr.




Powered by vBulletin® Version 3.7.2 (Deutsch)
Copyright ©2000 - 2012, Jelsoft Enterprises Ltd.
Search Engine Optimization by vBSEO 3.2.0
Aprilia-Forum, Aquaristik-Forum, Liebeskummer-Forum, Zierfisch-Forum, Geizkragen-Forum