Drukowana wersja tematu

Kliknij tu, aby zobaczyć temat w orginalnym formacie

Forum PHP.pl _ MySQL _ zmiana tresci w bazie danych

Napisany przez: spamator12 1.04.2019, 21:31:47



Witam, moj opiekun (domena, server, obsluga itp.) wyemigrowal na zachod i przegapilem oplate domeny, ktora przepadla. Teraz zakupilem nowa i musze zmienic dane w bazie danych z DOMENA1.pl na DOMENA2.pl we wszystkich miejscach gdzie taki zapis wytepuje.

Stad pytanie jak powinna wygladac komenda, ktora to zmienia (jest to najprostsza baza msql ~200MB)?

Napisany przez: trueblue 2.04.2019, 06:26:39

Wyeksportuj zrzut, zmień edytorem, zaimportuj zrzut.

Napisany przez: Tomplus 2.04.2019, 07:12:50

Jak masz dostęp do PHPMYADMIN to jest tam opcja SZUKAJ PO WSZYSTKICH TABELACH.

Prawdopodobnie stara nazwa domeny jest tylko w konkretnych tabelach i kolumnach więc wtedy można wykorzystać zapytanie SQL:

  1. UPDATE `tabelaZkolumnaDOzamiany` SET `kolumnaZblednaDomena` = REPLACE(`kolumnaZblednaDomena` , 'domena1.pl', 'domena2.pl');


Zrób wcześniej kopię zapasową tabeli!!

Napisany przez: spamator12 19.04.2019, 04:08:55

Dziekuje za zainteresowanie - mam dostep do phpmyadmin! Chcialbym przeleciec przez wszystkie tabele w bazie (cala baza - dla pewnosci). Jest na to jakas komenda? Rozumiem, ze ze wzgledu ze bedzie to dlugo trwac musze zmienic ustawienia mysqla aby pozwalal dluzej mielic baze itp. tak?

Napisany przez: Pyton_000 19.04.2019, 08:08:08

Tyle możliwości a to tylko 1-szy wynik z googla https://stackoverflow.com/questions/11839060/find-and-replace-text-in-the-entire-table-using-a-mysql-query

Napisany przez: spamator12 28.04.2019, 03:59:54

Chce z autoamtu przejechac po wszystkich tabelach/kolumnach a nie recznie to wpisywac.

Wyciagnalem baze jako txt jak radzono (@trueblue - klik na EXPORT i wybralem select 'Texy! text' jako format) i przejechalem automatem, ale jak to teraz wgrac? Nie moge jej wrzucic (wgrac) z powrotem.

EDIT:

Przy eksporcie jako sql i podmianie nazwy XXX na YYY za pomoca tekstowego edytora wystepuja bledy...

Nie za bardzo wiem czemu - wydaje mi sie ze relacja pomiedzy tabelami/kolumnami jest zachowana - w koncu zmieniam tylko nazwe i ta nazwe zmieniam wszedzie, wiec korelacja powinna byc zachowana...

Ktos ma jakies pomysly? Sa jakies komendy mysql co mi przeleca automatycznie po wszystkich tabelach i zamienia nazwe? Moze zamiana przez mysql zamiast przez edytor tekstowy w czyms pomoze (chodz wydaje sie to nielogiczne ale nie znam sie na bazach danych).

Napisany przez: trueblue 28.04.2019, 09:50:15

Cytat(spamator12 @ 28.04.2019, 04:59:54 ) *
Przy eksporcie jako sql i podmianie nazwy XXX na YYY za pomoca tekstowego edytora wystepuja bledy...

Przy eksporcie czy imporcie? Jakie błędy?

Cytat(spamator12 @ 28.04.2019, 04:59:54 ) *
Ktos ma jakies pomysly? Sa jakies komendy mysql co mi przeleca automatycznie po wszystkich tabelach i zamienia nazwe? Moze zamiana przez mysql zamiast przez edytor tekstowy w czyms pomoze (chodz wydaje sie to nielogiczne ale nie znam sie na bazach danych).

Pyton_000 podał Ci najbliższe rozwiązanie powyżej.

Napisany przez: spamator12 28.04.2019, 12:27:17

Najpierw eksportuje stara baze, nastepnie zmaieniam nazwy przez edytor tekstowy (replace XXX to YYY) i nastepnie wgrywam baze. Ale to nie dziala - najprawdopodobniej wystepuje gdzies jakas korelacja - w sensie AAA jest kojarzone z XXX i po zmaianie XXX na YYY wystepuje problem - chodz na chlopski rozumn nie powinien.

Zadnych bledow przy eksporcie i imporcie. Bledy pojawiaja sie jak odpalam strone (wyczyscielem wszystkie tabele, ktore mozna bylo wyczyscic - np cache).

Przykladowy blad - "Notice: unserialize(): Error at offset 2080 of 3676 bytes in views_db_object->load_row() (line 2307 of..."

Pomyslalem, ze jak zrobie to przez komendy sql - to moze one sa dokladniejsze albo wprowadzaja jakies dodatkowe modyfikacje i baza zadziala. A w tym linku co podal @Pyton_000 - "If you want to edit from all tables, best way is to take the dump and then find/replace and upload it back." no wiec tak zrobilem. Jest jakas komenda co zmienia WSZYSTKIE tabele w bazie mysql poprzez phpmyadmin?

Nie chcialbym wklepywac komend dla wszystkich tabel (wklepywac ich nazw, wyszukiwac po kilka rekordow w kazdej tabeli). Znacie na to jakis sposob?

EDIT:

Z ciekawosci przeszukalem baze przez phpmyadmin na fraze XXX i znalazl tego duzo. Jednak gdy chce edytowac zawartosc pol, to nie ma tam w polach mozliwosci edycji nazwy XXX (XXX tam nie wystepuje) - moze fraza XXX jest w jakis sposob zakodowana w innej nazwie/postaci i dlatego edytor tego nie zamienil na YYY.

Czyli jezeli XXX w bazie w czesci pol jest zakodowany jako a1a1a1 to edycja poprzez edytor nic nie poradzi, bo trzeba za pomoca tego klucza przekonwertowac YYY na odpowiednik b2b2b2 i wtedy zamienic a1a1a1 na b2b2b2. Ale moze zamiana przez phpmyadmin od razu zrobi to automatycznie - tylko jak zamienic zadana fraze od razu w wszystkich tabelach i kolumnach w danej bazie?

Napisany przez: trueblue 28.04.2019, 12:53:05

Cytat(spamator12 @ 28.04.2019, 13:27:17 ) *
Przykladowy blad - "Notice: unserialize(): Error at offset 2080 of 3676 bytes in views_db_object->load_row() (line 2307 of..."

Wartości, które zmieniasz są elementem zseralizowanych struktur. Nie wystarczy zmiana samej wartości. Poszukaj wartości w takim stringu i zmienić oprócz niej samej, jej długość. Najpewniej to string w postaci, np.: s:4:"abcd". Tak więc oprócz samego łańcucha "abcd" musisz zmienić również wartość 4 na odpowiadającą długości nowego łańcucha. Po takiej zmianie możesz podmieniać zwykłe wystąpienia (niezserializowane).

Cytat(spamator12 @ 28.04.2019, 13:27:17 ) *
Jest jakas komenda co zmienia WSZYSTKIE tabele w bazie mysql poprzez phpmyadmin?[/b]

Nie chcialbym wklepywac komend dla wszystkich tabel (wklepywac ich nazw, wyszukiwac po kilka rekordow w kazdej tabeli). Znacie na to jakis sposob?

Są tam też inne rozwiązania.


Napisany przez: spamator12 28.04.2019, 13:35:44

Inne rozwiazanie mi nie dzialaja (php 7.3.4).

s:dlugosc stringa:\"nazwa stringa" (oryginal) w bazie nie wystepuje. Wiec nie moge tego zamienic na odpowiednia dlugosc nowego stringa - juz probowalem.

blad

"Notice: unserialize(): Error at offset 2080 of 3676 bytes in views_db_object->load_row() (line 2307 of..."

z tego co widze w bazie kieruje do

('views_db_object', 'class', 'sites/all/modules/views/includes/view.inc', 'views', 10),
czyli
INSERT INTO `registry` (`name`, `type`, `filename`, `module`, `weight`) VALUES

jak podgladam tabele 'registry' to jak mam tam ten offset wyciagnac? - offset 2080 of 3676 bytes

EDIT: dokopalem sie tylko do kodu modulu:

  1. /**
  2.   * Load the object with a row from the database.
  3.   *
  4.   * This method is separate from the constructor in order to give us more
  5.   * flexibility in terms of how the view object is built in different contexts.
  6.   *
  7.   * @param object $data
  8.   * An object from db_fetch_object. It should contain all of the fields
  9.   * that are in the schema.
  10.   */
  11. public function load_row($data) {
  12. $schema = drupal_get_schema($this->db_table);
  13.  
  14. // Go through our schema and build correlations.
  15. foreach ($schema['fields'] as $field => $info) {
  16. $this->$field = http://www.php.net/empty($info['serialize']) ? $data->$field : http://www.php.net/unserialize($data->$field);
  17. }
  18. }

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)