Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: zmiana tresci w bazie danych
Forum PHP.pl > Forum > Bazy danych > MySQL
spamator12


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)?
trueblue
Wyeksportuj zrzut, zmień edytorem, zaimportuj zrzut.
Tomplus
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!!
spamator12
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?
Pyton_000
Tyle możliwości a to tylko 1-szy wynik z googla https://stackoverflow.com/questions/1183906...g-a-mysql-query
spamator12
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).
trueblue
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.
spamator12
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?
trueblue
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.

spamator12
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 = empty($info['serialize']) ? $data->$field : unserialize($data->$field);
  17. }
  18. }
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.