Podczas tworzenia jednego z moich serwisów (www.rabatek.pl) pope?ni?em bardzo du?y b??d: zaraz po ustanowieniu po??czenia do bazy nie zmieni?em kodowania na UTF8 (domy?lnie bylo latin1). Wszystko przez to ?e po raz pierwszy postanowi?em skorzysta? z klasy PEAR::MDB2 i mi to umkn??o.

W ka?dym b?d? razie strona ju? sobie istnieje kilka miesi?cy i wszystko super dzia?a – do czasu. W wersji beta przerobi?em wyszukiwark? i okaza?o si?, ?e jak wpisz? np. “Wroc?aw” to nic nie znajduje – wszystko przez te piekielne ogonki. Baza ma ju? w tej chwili kilka tysi?cy rekordów wi?c r?czne poprawianie odpada ca?kowicie.

Z pomoc? przyszed? bardzo prosty skrypt PHP. Napisa?em go w 15 minut i nie ma w nim kontroli b??dów, komentarzy itp – po prostu wykonuje swoj? robot? i tyle.

Postanowi?em si? tym skryptem z wami podzieli? gdy? wiem ?e nie tylko ja mam problem z ogonkami.

Uwagi i komentarze mile widziane

define('DB_HOST',              'twoje_ip');
define('DB_USER',               'user_do_bazy');
define('DB_PASS',               'haslo_do_bazy');
define('DB_NAME',               'nazwa_bazy');
 
define('DB_CHARSET',            'UTF8');
define('DB_NAMES',               'UTF8');
define('DB_COLLATION',         'utf8_general_ci');
 
function chars_translate($string) {
 
    $org_letters = array('ą','ć','ę','ł','ń','ó','ś','ź','ż','Ą','Ć','Ę','Ł','Ń','Ó','Ś','Ź','Ż');
    $utf8_letters = array('?','?','?','?','?','ó','?','?','?','?','?','?','?','?','Ó','?','?','?');;
    $string = str_replace($org_letters, $utf8_letters, $string);
    return $string;
}
 
$link = @mysql_connect(DB_HOST, DB_USER, DB_PASS);
if (!$link) {
    echo "error connection to the database: ".mysql_error();
}
 
if (!mysql_select_db(DB_NAME, $link)) {
    echo "error selecting a database: ".mysql_error();
}
 
$tables = array();
 
// odczytaj wszystkie tabele
$query = "SHOW TABLE STATUS ";
$result = mysql_query($query);
while ($row = mysql_fetch_assoc($result)) {
    if ($row['Comment'] != 'VIEW') {
        $tables[] = $row['Name'];
    }
}
 
// pobierz dane ze starych tabeli
$records = array();
foreach ($tables as $table) {
    $query = "SELECT * FROM ".$table;
    $result = mysql_query($query);
    $records[$table] = array();
    $i = 0;
    while($row = mysql_fetch_assoc($result)) {
        foreach ($row as $key => $value) {
            $records[$table][$i][$key] = chars_translate($value);
        }
        $i++;
    }
}
 
// ustaw poprawne kodowanie
mysql_query("SET CHARACTER SET ".DB_CHARSET);
mysql_query("SET NAMES ".DB_NAMES);
mysql_query("SET collation_connection = ".DB_COLLATION);
 
// stworz nowe tabele i wypelnij je danymi
foreach ($tables as $table) {
    $query = "CREATE TABLE ".$table."_new LIKE ".$table;
    $result = mysql_query($query);
 
    if (empty($records[$table])) {
        continue;
    }
    $columns = implode(",", array_keys($records[$table][0]));
    $query = "INSERT INTO ".$table."_new (".$columns.") VALUES ";
 
    foreach ($records[$table] as $row) {
        $query .= "('".implode("','", $row)."'),";
    }
 
    $query = substr($query, 0, -1);
    $result = mysql_query($query);
 
    // skasuj stara tabele
    $query = "DROP TABLE ".$table;
    $result = mysql_query($query);
 
    // zmien nazwe tabeli
    $query = "RENAME TABLE ".$table."_new TO ".$table;
    $result = mysql_query($query);
 
    echo "gotowy ".$table."\n";
    flush();
}
 
echo "KONIEC\n";