Написание скрипта поиска/замены базы данных MySQL на PHP

В настоящее время я занимаюсь переделкой своего сделанного на заказ веб-сайта на CMS, управляемую WordPress -.

Веб-сайт, над которым я работал, — это просто мой существующий URL плюс /dev/, то есть http://my.website.com/dev/.

В выходные я перенесу этот сайт на http://my.website.com.и поэтому необходимо будет удалить все ссылки на /dev/URL.

То, что я хотел бы сделать, это, по сути, "найти и заменить" для /devв моей базе данных. Я могу точно видеть, в каких таблицах есть это значение, но, естественно, согласно установке WordPress, довольно много этих полей представляют собой сериализованные данные -, которые просто dump> open with notepad++> find & replaceсломаются.

Код, который я разработал для этой цели, находится здесь:

 "wp_options", "fields" => array( "option_value" ), "id_field" => "option_id" );
$look_at[] = array( "table" => "wp_postmeta", "fields" => array( "meta_value" ), "id_field" => "meta_id" );
$look_at[] = array( "table" => "wp_posts", "fields" => array( "post_content", "guid" ), "id_field" => "ID" );
$look_at[] = array( "table" => "wp_sfmeta", "fields" => array( "meta_value" ), "id_field" => "meta_id" );
$look_at[] = array( "table" => "wp_sfoptions", "fields" => array( "option_value" ), "id_field" => "option_id" );
$look_at[] = array( "table" => "wp_sferrorlog", "fields" => array( "error_text" ), "id_field" => "id" );

for ( $i = 0; $i < sizeof ( $look_at ); $i++ ) {
    foreach( $look_at[$i]["fields"] as $field ) {

        $sql = 'SELECT `'. $field. '`, `'. $look_at[$i]["id_field"]. '` FROM  `'. $look_at[$i]["table"]. '`;';
        $res = mysql_query( $sql );

        while ( $row = mysql_fetch_assoc( $res ) ) {

            $table = $look_at[$i]["table"];
            $id_field = $look_at[$i]["id_field"];
            $old_val = $row[$field];
            $id = $row[$id_field];

            $unserialized_value = @unserialize( $old_val );

            if ( $old_val === 'b:0;' || $unserialized_value !== false )
                $new_val = serialize( str_replace( array( "/dev/", "/dev" ), array( "/", "" ), $unserialized_value ) );
            else
                $new_val = str_replace( array( "/dev/", "/dev" ), array( "/", "" ), $old_val );

            $update_array[] = array( "id_field" => $id_field, "id" => $id, "table" => $table, "key" => $key, "old_val" => $old_val, "new_val" => $new_val );

        }

    }
}

for ( $i = 0; $i < sizeof( $update_array ); $i++ ) {
    if ( $update_array[$i]["old_val"] !== $update_array[$i]["new_val"] )
        $updated_sql.= 'UPDATE '. $update_array[$i]["table"]. ' SET `'. $update_array[$i]["key"]. '` = \''. $update_array[$i]["new_val"]. '\' WHERE `'. $update_array[$i]["id_field"]. '` = \''. $update_array[$i]["id"]. '\';';
}

mysql_query( $updated_sql );

?>

Пример сериализованных данных:

a:6:{s:5:"width";s:3:"400";s:6:"height";s:3:"530";s:14:"hwstring_small";s:22:"height='96' width='72'";s:4:"file";s:30:"2011/12/Amazonas-English-1.jpg";s:5:"sizes";a:13:{s:9:"thumbnail";a:3:{s:4:"file";s:30:"Amazonas-English-1-125x165.jpg";s:5:"width";s:3:"125";s:6:"height";s:3:"165";}s:6:"medium";a:3:{s:4:"file";s:30:"Amazonas-English-1-339x450.jpg";s:5:"width";s:3:"339";s:6:"height";s:3:"450";}s:5:"large";s:0:"";s:14:"post-thumbnail";a:3:{s:4:"file";s:30:"Amazonas-English-1-125x165.jpg";s:5:"width";s:3:"125";s:6:"height";s:3:"165";}s:23:"indexleft-species-thumb";a:3:{s:4:"file";s:30:"Amazonas-English-1-200x265.jpg";s:5:"width";s:3:"200";s:6:"height";s:3:"265";}s:13:"species-thumb";a:3:{s:4:"file";s:30:"Amazonas-English-1-288x381.jpg";s:5:"width";s:3:"288";s:6:"height";s:3:"381";}s:17:"indexheader-thumb";a:5:{s:4:"file";s:30:"Amazonas-English-1-400x300.jpg";s:5:"width";s:3:"400";s:6:"height";s:3:"300";s:4:"path";s:38:"2011/12/Amazonas-English-1-400x300.jpg";s:3:"url";s:88:"http://www.xxxxxxxxxxx.com/dev/wp-content/uploads/2011/12/Amazonas-English-1-400x300.jpg";}s:14:"random-thumb-1";a:3:{s:4:"file";s:28:"Amazonas-English-1-56x75.jpg";s:5:"width";s:2:"56";s:6:"height";s:2:"75";}s:14:"random-thumb-2";a:3:{s:4:"file";s:29:"Amazonas-English-1-75x100.jpg";s:5:"width";s:2:"75";s:6:"height";s:3:"100";}s:14:"random-thumb-3";a:3:{s:4:"file";s:29:"Amazonas-English-1-94x125.jpg";s:5:"width";s:2:"94";s:6:"height";s:3:"125";}s:14:"random-thumb-4";a:3:{s:4:"file";s:30:"Amazonas-English-1-113x150.jpg";s:5:"width";s:3:"113";s:6:"height";s:3:"150";}s:14:"random-thumb-5";a:3:{s:4:"file";s:30:"Amazonas-English-1-132x175.jpg";s:5:"width";s:3:"132";s:6:"height";s:3:"175";}s:13:"d4p-bbp-thumb";s:0:"";}s:10:"image_meta";a:10:{s:8:"aperture";s:1:"0";s:6:"credit";s:0:"";s:6:"camera";s:0:"";s:7:"caption";s:0:"";s:17:"created_timestamp";s:1:"0";s:9:"copyright";s:0:"";s:12:"focal_length";s:1:"0";s:3:"iso";s:1:"0";s:13:"shutter_speed";s:1:"0";s:5:"title";s:0:"";}}

ДОПОЛНИТЕЛЬНОЕ РЕДАКТИРОВАНИЕ

К сожалению, есть другие экземпляры /dev/в других сериализованных массивах, таких как этот пример:

'a:1:{i:0;a:5:{s:4:"type";s:5:"image";s:3:"loc";s:107:"/home/xxxxx/domains/xxxxxxxxx.com/public_html/dev/wp-content/sp-resources/forum-image-uploads/matt/2012/01/";...

Или,

a:1:{i:0;a:5:{s:4:"data";s:88:"Your search - link:http://www.xxxxxxxxx.com/dev/ - did not match any documents. ";...

Таким образом, я не думаю, что простойpreg_replace(или обратный вызов )справятся с задачей, но я думаю, что продвинутый может?


Мои вопросы::

  1. Есть ли более простой способ сделать это?!
  2. Вызовет ли приведенный выше код какие-либо проблемы?

Я ужасно предчувствую проблемы с моим кодом (плохой программист, приношу свои извинения )и поэтому немного опасаюсь проводить тесты с этим кодом.


ПОСЛЕДНЕЕ РЕДАКТИРОВАНИЕ :РАБОЧИЙ КОД

Поскольку мой дамп SQL был почти 100mb, мне пришлось использовать WAMP с неограниченной памятью.


Этот код поместил мой новый файл SQL в тот же каталог (X:\wamp\www), чтобы я мог манипулировать им дальше.

У меня было несколько проблем с повторением данных -, и по какой-то причине в файле оставалось 67 экземпляров /dev, но я использовал Notepad++ и WinMerge для разобраться со всем этим, и в итоге мне потребовалось около 45 минут, чтобы найти/заменить базу данных из более чем 90 миллионов символов.

7
задан dunc 30 April 2012 в 09:44
поделиться