gelöst: mysql Einträge per Befehl ändern

MySQL, PostgreSQL, SQLite
fulltilt
Posts: 363
Joined: 2006-08-27 02:06

gelöst: mysql Einträge per Befehl ändern

Post by fulltilt » 2007-08-09 22:09

Ich habe hier eine ca. 24 MB grosse DB und muss einige Einträge (ca. 10000) in einer Tabelle ändern.

Die Struktur sieht so aus:

DB: in der Tabelle pro_seller in der Spalte payment_options sollen alle Einträge mit "Banktransfer" in "18" geändert werden.

Ich weiss nun nicht wie ich das in phpmyadmin umsetzen kann und bräuchte dafür einen Befehl wie z.B.
ALTER TABLE `pro_auctions` CHANGE `Banktransfer` `18` ;

Das kriege ich nicht zusammen ...
Kann jemand helfen?
Last edited by fulltilt on 2007-08-10 12:14, edited 1 time in total.

oxygen
Posts: 2138
Joined: 2002-12-15 00:10
Location: Bergheim

Re: gelöst: mysql Einträge per Befehl ändern

Post by oxygen » 2007-08-09 22:21

Du willst nicht die Tabelle sondern die Einträge ändern. vgl

UPDATE TABLE `pro_auctions` SET `payment_options` = '18' WHERE `payment_options` = 'Banktransfer'

das ist nun wirklich nicht schwer rauszufinden.

fulltilt
Posts: 363
Joined: 2006-08-27 02:06

Re: gelöst: mysql Einträge per Befehl ändern

Post by fulltilt » 2007-08-09 22:27

Danke - Das Problem dabei ist, das hinter dem Banktransfer noch ein <br> und ein anderer Entrag kommt.
Geht das dann überhaupt?

oxygen wrote:Du willst nicht die Tabelle sondern die Einträge ändern. vgl

UPDATE TABLE `pro_auctions` SET `payment_options` = '18' WHERE `payment_options` = 'Banktransfer'

das ist nun wirklich nicht schwer rauszufinden.

oxygen
Posts: 2138
Joined: 2002-12-15 00:10
Location: Bergheim

Re: gelöst: mysql Einträge per Befehl ändern

Post by oxygen » 2007-08-09 22:30

Ja.
UPDATE TABLE `pro_auctions` SET `payment_options` = '18' WHERE `payment_options` LIKE 'Banktransfer%'
Last edited by oxygen on 2007-08-09 22:35, edited 1 time in total.

fulltilt
Posts: 363
Joined: 2006-08-27 02:06

Re: gelöst: mysql Einträge per Befehl ändern

Post by fulltilt » 2007-08-09 22:33

Hi oxygen,

Also es wird dann nur Banktransfer geändert oder geht der Rest dahinter mit weg durch %?


oxygen wrote:Ja.
UPDATE TABLE `pro_auctions` SET `payment_options` = '18' WHERE `payment_options` = 'Banktransfer%'

User avatar
Joe User
Project Manager
Project Manager
Posts: 11137
Joined: 2003-02-27 01:00
Location: Hamburg

Re: gelöst: mysql Einträge per Befehl ändern

Post by Joe User » 2007-08-09 22:43

fulltilt wrote:Das Problem dabei ist, das hinter dem Banktransfer noch ein <br> und ein anderer Entrag kommt.

Ich hoffe, die Anwendung filtert das Feld gut genug -> XSS

fulltilt
Posts: 363
Joined: 2006-08-27 02:06

Re: gelöst: mysql Einträge per Befehl ändern

Post by fulltilt » 2007-08-09 23:04

Wenn ich es so ausführe, kommt es zu keiner Fehlermeldung .. aber geändert hat sich nichts ...


Code: Select all

update pro_auctions set payment_options = '18' where payment_options = 'Banktransfer%';

User avatar
Joe User
Project Manager
Project Manager
Posts: 11137
Joined: 2003-02-27 01:00
Location: Hamburg

Re: gelöst: mysql Einträge per Befehl ändern

Post by Joe User » 2007-08-09 23:16

fulltilt wrote:Wenn ich es so ausführe, kommt es zu keiner Fehlermeldung .. aber geändert hat sich nichts ...

Du versuchst einen Teilstring zu ersetzen, dass geht AFAIK nicht per SQL. Diese Aufgabe (auslesen->ersetzen->einfügen) muss eine externe Anwendung übernehmen.

fulltilt
Posts: 363
Joined: 2006-08-27 02:06

Re: gelöst: mysql Einträge per Befehl ändern

Post by fulltilt » 2007-08-09 23:20

hm ... und direkt über die shell?
Ich könnte auch einen dump erstellen und z.b. mit Kate die Stellen ersetzen ... das Teil kann ich dann wg. der Grösse nicht wieder mit PMA einspielen ...

fulltilt
Posts: 363
Joined: 2006-08-27 02:06

Re: gelöst: mysql Einträge per Befehl ändern

Post by fulltilt » 2007-08-09 23:30

Kate = Editor

Damit könnte das mit dem ersetzen klappen ...
Das wird nur ein Riesen Aufwand und das projket muss schnel wieder online

User avatar
daemotron
Administrator
Administrator
Posts: 2635
Joined: 2004-01-21 17:44

Re: gelöst: mysql Einträge per Befehl ändern

Post by daemotron » 2007-08-09 23:39

Dann würde ich lieber sed auf den Dump drauf loslassen...

Code: Select all

sed 's/Banktransfer/18/' -i dumpfile.sql

User avatar
Joe User
Project Manager
Project Manager
Posts: 11137
Joined: 2003-02-27 01:00
Location: Hamburg

Re: gelöst: mysql Einträge per Befehl ändern

Post by Joe User » 2007-08-09 23:44

Kate ist ein in KDE integrierter Editor.

Ein paar Zeilen PHP/Perl/Python/etc. reichen völlig und nebenbei umgehst Du das Risiko einer unerwarteten Zeichensatz-Konvertierung durch den Editor.

apr
Posts: 16
Joined: 2007-05-15 11:19

Re: gelöst: mysql Einträge per Befehl ändern

Post by apr » 2007-08-09 23:47

Code: Select all

UPDATE `pro_seller` SET `payment_options` = INSERT(`payment_options`, 1, 12, '18') WHERE `payment_options` LIKE 'Banktransfer%';

Schätze das tuts, wenn 'Banktransfer' am Anfang des Strings steht sonst must da noch ein INSTR reinbasteln.

edit: hupsa ein % vergessen...
edit2: ähm ich bin nun etwas verwirrt, was willst du genau anstellen? Das da oben ändert alle Datensätze ab, die mit "Banktransfer" beginnen und ersetzt "Banktransfer" durch "18".
Last edited by apr on 2007-08-09 23:59, edited 1 time in total.

User avatar
Joe User
Project Manager
Project Manager
Posts: 11137
Joined: 2003-02-27 01:00
Location: Hamburg

Re: gelöst: mysql Einträge per Befehl ändern

Post by Joe User » 2007-08-09 23:50

jfreund wrote:Dann würde ich lieber sed auf den Dump drauf loslassen...

Code: Select all

sed 's/Banktransfer/18/' -i dumpfile.sql

Genau so will er es ja nicht haben, sondern:
Alt: Banktransfer XX<br>foobar
Neu: Banktransfer 18<br>foobar

Quick&Dirty&Untestet:

Code: Select all

sed 's/(Banktransfers)[0-9][0-9](<br>.*)/1182/g' -i dump.sql

fulltilt
Posts: 363
Joined: 2006-08-27 02:06

Re: gelöst: mysql Einträge per Befehl ändern

Post by fulltilt » 2007-08-10 00:44

Ist schon richtig ...
Alt "Banktransfer<br>" > Neu > "18"

Das Problem dabei ist das nachher das <br> ein Komma werden soll.
Es geht um Zahlungsarten davon gibts aber 6 und die sind alle in den spalten unterschiedlich >

Banktransfer<br>
oder
Banktransfer<br>Nachnahme<br>
Nachnahme<br>Visa<br>

Das muss nachher dann so aussehen:
18
oder
18,19
18,21

hinter der letzten Zahl darf kein Komma mehr sein ...
Geht das überhaupt?



apr wrote:

Code: Select all

UPDATE `pro_seller` SET `payment_options` = INSERT(`payment_options`, 1, 12, '18') WHERE `payment_options` LIKE 'Banktransfer%';

Schätze das tuts, wenn 'Banktransfer' am Anfang des Strings steht sonst must da noch ein INSTR reinbasteln.

edit: hupsa ein % vergessen...
edit2: ähm ich bin nun etwas verwirrt, was willst du genau anstellen? Das da oben ändert alle Datensätze ab, die mit "Banktransfer" beginnen und ersetzt "Banktransfer" durch "18".
Last edited by fulltilt on 2007-08-10 01:10, edited 1 time in total.

User avatar
Joe User
Project Manager
Project Manager
Posts: 11137
Joined: 2003-02-27 01:00
Location: Hamburg

Re: gelöst: mysql Einträge per Befehl ändern

Post by Joe User » 2007-08-10 01:08

fulltilt wrote:Alt "Banktransfer<br>" > Neu > "18"

Wenn Alles nach dem <br> auch entsorgt werden soll:

Code: Select all

UPDATE pro_seller SET payment_options = '18' WHERE payment_options LIKE 'Banktransfer%';

fulltilt
Posts: 363
Joined: 2006-08-27 02:06

Re: gelöst: mysql Einträge per Befehl ändern

Post by fulltilt » 2007-08-10 01:16

Danke,

Das Problem dabei ist das nachher das <br> ein Komma werden soll.
Es geht um Zahlungsarten von Usern davon gibts aber 6 und die sind alle in den Zeilen unterschiedlich >

Banktransfer<br>
oder
Banktransfer<br>Nachnahme<br>
Nachnahme<br>Visa<br>

Das muss nachher dann so aussehen:
18
oder
18,19
18,21

hinter der letzten Zahl darf kein Komma mehr sein ...
Geht das überhaupt?

Wenn nicht müsste ich wirklich alles danach entsorgen ...
Das ist eine Online Auktion die ein Upgrade bekommt ... leider ist das nicht ganz kompatibel. Ich will aber die Scripte nicht umschreiben sonst passt beim nächsten Upgrade gar nix mehr.

apr
Posts: 16
Joined: 2007-05-15 11:19

Re: gelöst: mysql Einträge per Befehl ändern

Post by apr » 2007-08-10 09:16

Probiers mit:
- a) 'Banktransfer' => '18'
- b) 'Nachname' => '19'
- c) 'Visa' => '21'
- d) '<br>' => ','
- e) Letztes ',' entfernen.


a)

Code: Select all

UPDATE `pro_seller` SET `payment_options` = REPLACE(`payment_options`, 'Banktransfer', '18');

b)

Code: Select all

UPDATE `pro_seller` SET `payment_options` = REPLACE(`payment_options`, 'Nachname', '19');

c)

Code: Select all

UPDATE `pro_seller` SET `payment_options` = REPLACE(`payment_options`, 'Visa', '21');

d)

Code: Select all

UPDATE `pro_seller` SET `payment_options` = REPLACE(`payment_options`, '<br>', ',');

e)

Code: Select all

UPDATE `pro_seller` SET `payment_options` = SUBSTRING(`pro_seller`, 1, CHAR_LENGTH(`pro_seller`)-1) WHERE `pro_seller` LIKE '%,'


Wenn man mag, sollte man auch die Replace schachteln können um ein Query zu bekommen - zumindest a-d geht Problemlos. Wenn e auch mit in einen einzigen Query soll, dann wirds länger (mit IF prüfen ob das letzte Zeichen ein , ist und bei bedarf noch rausschneiden).

Edit: Achso, evtl. bei a-d noch "WHERE `payment_oprions` LIKE '%Ersetzung%'" mit reinnehmen. Ich schätze Volltextsuchen sind schneller als 4x jeden Datensatz zu ändern.

fulltilt
Posts: 363
Joined: 2006-08-27 02:06

Re: gelöst: mysql Einträge per Befehl ändern

Post by fulltilt » 2007-08-10 09:51

Danke - sehr beeindruckend 8O

Ich werde das gleich mal mit einer Kopie testen.

apr wrote:Probiers mit:
- a) 'Banktransfer' => '18'
- b) 'Nachname' => '19'
- c) 'Visa' => '21'
- d) '<br>' => ','
- e) Letztes ',' entfernen.

User avatar
Joe User
Project Manager
Project Manager
Posts: 11137
Joined: 2003-02-27 01:00
Location: Hamburg

Re: gelöst: mysql Einträge per Befehl ändern

Post by Joe User » 2007-08-10 10:17

fulltilt wrote:Das ist eine Online Auktion die ein Upgrade bekommt

Hoffentlich ist die neue Version sicherer als die Alte. Cross-Site-Scripting ist gerade in diesem Bereich nicht zu unterschätzen...

fulltilt
Posts: 363
Joined: 2006-08-27 02:06

Re: gelöst: mysql Einträge per Befehl ändern

Post by fulltilt » 2007-08-10 10:49

Das Script wurde komplett neugeschrieben und auch endlich Indexe erstellt. Daher treten beim Upgrade diese Probleme auf die ich nun nach und nach hinbiegen muss. Eine Neuinstallation geht nicht, weil ich sonst viele Mitglieder verliere ...
Ich habe zum Upgraden eine Kopie paralell installiert und bis auf die obige Sache, läuft soweit alles ... mehr oder weniger :-)

Joe User wrote:
fulltilt wrote:Das ist eine Online Auktion die ein Upgrade bekommt

Hoffentlich ist die neue Version sicherer als die Alte. Cross-Site-Scripting ist gerade in diesem Bereich nicht zu unterschätzen...

User avatar
Joe User
Project Manager
Project Manager
Posts: 11137
Joined: 2003-02-27 01:00
Location: Hamburg

Re: gelöst: mysql Einträge per Befehl ändern

Post by Joe User » 2007-08-10 11:49


fulltilt
Posts: 363
Joined: 2006-08-27 02:06

Re: gelöst: mysql Einträge per Befehl ändern

Post by fulltilt » 2007-08-10 12:09

Joe User wrote:Da Du mich offenbar nicht ganz verstanden hast:
http://en.wikipedia.org/wiki/Cross-site_scripting
http://en.wikipedia.org/wiki/SQL_injection


O.K. alles klar. Bei diesem Script gab es bislang noch keine Probleme was die Sicherheit angeht, bis auf ein Spamproblem über den Mailer .. was behoben ist.
Was die Änderung betrifft, hat alles 100% geklappt bis auf das letzte Zeichen.

fulltilt
Posts: 363
Joined: 2006-08-27 02:06

Re: gelöst: mysql Einträge per Befehl ändern

Post by fulltilt » 2007-08-10 12:13

@ apr >

Hut ab :-)
Das hat alles 100% geklappt bis auf das letzte Komma und das ging jetzt sensationell schnell - wow.
Du hast mir echt Mega weitergeholfen und daher bedanke ich mich mit grösstem Respekt 8)


apr wrote:Probiers mit:
- a) 'Banktransfer' => '18'
- b) 'Nachname' => '19'
- c) 'Visa' => '21'
- d) '<br>' => ','
- e) Letztes ',' entfernen.


a)

Code: Select all

UPDATE `pro_seller` SET `payment_options` = REPLACE(`payment_options`, 'Banktransfer', '18');

b)

Code: Select all

UPDATE `pro_seller` SET `payment_options` = REPLACE(`payment_options`, 'Nachname', '19');

c)

Code: Select all

UPDATE `pro_seller` SET `payment_options` = REPLACE(`payment_options`, 'Visa', '21');

d)

Code: Select all

UPDATE `pro_seller` SET `payment_options` = REPLACE(`payment_options`, '<br>', ',');

e)

Code: Select all

UPDATE `pro_seller` SET `payment_options` = SUBSTRING(`pro_seller`, 1, CHAR_LENGTH(`pro_seller`)-1) WHERE `pro_seller` LIKE '%,'


Wenn man mag, sollte man auch die Replace schachteln können um ein Query zu bekommen - zumindest a-d geht Problemlos. Wenn e auch mit in einen einzigen Query soll, dann wirds länger (mit IF prüfen ob das letzte Zeichen ein , ist und bei bedarf noch rausschneiden).

Edit: Achso, evtl. bei a-d noch "WHERE `payment_oprions` LIKE '%Ersetzung%'" mit reinnehmen. Ich schätze Volltextsuchen sind schneller als 4x jeden Datensatz zu ändern.