Veritabanından htmlentitiesi () değerleri nasıl kaldırılır?

4 Cevap php

Ben bir şey biliyordum önce uzun değil - ben pek şimdi bile biliyorum - htmlentities() aracılığıyla değerlerini çalıştırdıktan sonra benim mysql veritabanındaki verileri eklenen php bir web uygulaması olarak tasarlanmış. Sonunda benim başıma geldi ve bu adımı kaldırılır ve yerine girdi daha çıktı içinde sıkışmış ve benim neşeli yolunda gitti.

Ancak ben beri bu eski bazı verileri tekrar yaşadım ve ben etkili iki htmlentitied edilir görüntülenen değerleri alıyorum ekranda görüntülenen ne yazık ki ben, bir sorun var.

Yani, geri alakalı karakterleri içine ya da her satır, çözme okumak ve 12. tablolarda 17 milyon satır güncellemek için bir komut dosyası yazmak zorunda olacak tüm eski, etkilenen satır değişen bir mysql veya phpmyadmin yolu var mı?

EDIT:

Teşekkürler yardım herkes için, ben güzel değil, bazı kod ile aşağı aşağıda benim kendi cevap yazdı ama ben olacağım yatakta olduğum sürece yani benim kod göz kamaştırıcı bir hata işaret birisi engelleme önceki test verileri üzerinde çalıştı o tamam işe yararsa yarın yedek DB üzerinde çalışan ve daha sonra canlı biri.

4 Cevap

Ben bu güzel, değil kullanarak sona erdi, ama ben yorgunum, 02:00 ve o işini yaptı! (Edit: test verilerine)

$tables = array('users', 'users_more', 'users_extra', 'forum_posts', 'posts_edits', 'forum_threads', 'orders', 'product_comments', 'products', 'favourites', 'blocked', 'notes');
foreach($tables as $table)
    {       
        $sql = "SELECT * FROM {$table} WHERE data_date_ts < '{$encode_cutoff}'";
        $rows = $database->query($sql);
        while($row = mysql_fetch_assoc($rows))
            {
                $new = array();
                foreach($row as $key => $data)
                    {
                        $new[$key] = $database->escape_value(html_entity_decode($data, ENT_QUOTES, 'UTF-8'));
                    }
                array_shift($new);
                $new_string = "";
                $i = 0;
                foreach($new as $new_key => $new_data)
                    {
                        if($i > 0) { $new_string.= ", "; }
                        $new_string.= $new_key . "='" . $new_data . "'";
                        $i++;
                    }
                $sql = "UPDATE {$table} SET " . $new_string . " WHERE id='" . $row['id'] . "'";
                $database->query($sql);
                // plus some code to check that all out
            }
    }

Ben bir php komut dosyası yazıyorum bu durumda yapılacak iyi bir şey olduğunu düşünüyorum. Dave dedi gibi metinleri geri dönüştürmek için, html_entity_decode () işlevini kullanabilirsiniz.

İlk birkaç girişleri ile bir masa üzerinde komut deneyin. Bu test çok zaman tasarrufu sağlayacaktır. Tabii ki, php komut dosyasını çalıştırmadan önce yedekleme tablo (lar) unutmayın.

Ben kısa olasılığı vardır korkuyorum. Milyonlarca satır için hesaplama olursa olsun veri kümelerini geri dönüştürmek nasıl, oldukça pahalı kalır. Yani bir php komut dosyası için gitmek ... Bu en kolay yolu

PHP kodlama yöntemi olduğu için, sen çözmek için kullanmak isteyeceksiniz. Sen html_entity_decode geri orijinal karakterlerin onları dönüştürmek için kullanabilirsiniz. Gotta döngü!

Sadece gerekmez satırları çözmek için değil dikkatli olun. Değil bunu belirlemek olacak nasıl emin.

Bu biraz kıytırık ama ben toplu güncelleme gitmek için tek yol olduğunu düşünüyorum ...

$Query = "SELECT row_id, html_entitied_column FROM table";
$result = mysql_query($Query, $connection);
while($row = mysql_fetch_array($result)){
    $updatedValue = html_entity_decode($row['html_entitied_column']);
    $Query = "UPDATE table SET html_entitied_column = '" . $updatedValue . "' ";
    $Query .= "WHERE row_id = " . $row['row_id'];
    mysql_query($Query, $connection);
}

This is simplified, no error handling etc. Not sure what the processing time would be on millions of rows so you might need to break it up into chunks to avoid script timeouts.