FAQ |
Kalender |
2006-07-07, 14:10 | #1 | |||
|
||||
Medlem
|
Tjena!
Jag har ett litet databasproblem som jag inte kan lösa. I en databas har jag 20 olika installationer av samma programvara. Varje installation består av 10 olika tables med exakt likadan uppbyggnad. Om jag ska uppdatera ett fält i en installation kan jag använda nedanstående kod som funkar bra (obs värden ändrade i exemplet): UPDATE `Installationnr1` SET `option_value` = 'NYTT VÄRDE' WHERE `option_id` =42 AND `program_id` =0 AND CONVERT( `option_name` USING utf8 ) = 'namn_på_fält' LIMIT 1 ; Så... hur gör jag för att köra denna koden så att den ändrar exakt samma fält fast i alla mina installationer på samma gång? Jag är ingen expert på databaser men jag läste i denna post men fattar inte ändå... http://www.webmasternetwork.se/index.php?a...&hl=update&s=wn Trevlig helg! Mvh Jonas |
|||
Svara med citat |
2006-07-07, 14:28 | #2 | |||
|
||||
Medlem
|
Citat:
Citat:
Trots ovanstående frågetecken så låter det troligt att du kan lösa ditt problem med en loop: Kod:
<?php for($i=1;$i<=10;$i++) { $sql = "UPDATE `Installationnr$i` ..."; } ?> |
|||
Svara med citat |
2006-07-07, 14:32 | #3 | |||
|
||||
Medlem
|
Tjena...
Well, det är bloggar.. varje installation är 10 tabeller... så i alla mina bloggar vill jag kunna ändra ett speciellt fält på enklast möjliga sätt. Grejen är att varje installation har automatiskt genererade namn på tables så jag vet inte namnen på dom, utan jag vill ändra alla som finns i databasen. Mvh Jonas |
|||
Svara med citat |
2006-07-07, 15:00 | #4 | |||
|
||||
Mycket flitig postare
|
Citat:
|
|||
Svara med citat |
2006-07-07, 21:53 | #5 | |||
|
||||
Mycket flitig postare
|
JonasO: Om du ska få några bra svar din fråga så uttryck dig klart att man förstår vad du menar. Vad är det för applikation, vad menar du med en installation? Vadå för "programvara", vad används för tekniker? Vilken databas pratar vi om? ...MySQL, php, ...
Med lite klarhet kan du få bra svar här, men om du inte riktigt har klart för dig vad du frågar så blir det svårt att ge några bra svar. |
|||
Svara med citat |
2006-07-08, 10:57 | #6 | |||
|
||||
Medlem
|
Tja
Jag kanske var litekortfattad förut men så här ligger det iaf till: 1. Jag kör XXXX antal installationer av ett bloggscript. Alla bloggar ligger i samma databas men i olika tabeller efter följade princip. YYYYYY = 6 bokstäver som är automatisk genererade typ ewt345 eller kanske 34df4d, med andra ord jag har inte en susning egentligen men de ligger i samma databas efter nedanstående princip. ------------------------ YYYYYYY_namn //Blogg1 YYYYYYY_index //Blogg1 YYYYYYY_extra //Blogg1 YYYYYYY_ping //Blogg1 . . . osv YYYYYYY_namn //Blogg2 YYYYYYY_index //Blogg2 YYYYYYY_extra //Blogg2 YYYYYYY_ping //Blogg2 . . . osv YYYYYYY_namn //Blogg3 YYYYYYY_index //Blogg3 YYYYYYY_extra //Blogg3 YYYYYYY_ping //Blogg3 . . . osv Tänk att jag har XXXX antal bloggar i samma databas och sen vill jag ändra ett fält i tex alla "blogping" fält som ligger i alla tabeller som heter YYYYYYY_ping. Dvs det finns ett fält per installation och har jag XXXX installationer blir det ganska många. Det jag behöver är alltså någon slags kod som söker igenom alla mina tabeller i en databas efter fältet "blogping" och sedan ändrar värdet där. Det kan väl inte vara så svårt tycker jag, det är ingen Rocket Science direkt. Jag kan ju tex ladda hem hela databasen och söka igenom och ändra det jag vill med tex en vanlig texteditor - dock kanske det inte är det optimala precis men det fungerar B)... lite jobbigt bara när databasen blir allt för stor.. Well, jag använder ett antal Linux servrar som har MySQL - 4.1.19-standard eller nyare. Om någon knåpar ihop ett litet php-script som fixar detta så betalar jag för tiden å 700:- exkl moms. (borde väl bara bli en timme) Det finns en hel del info på dev.mysql.com men jag kan liksom inte få ihop det i ett php script el liknande... Trevlig helg! Jonas |
|||
Svara med citat |
2006-07-08, 14:47 | #7 | ||
|
|||
Mycket flitig postare
|
Detta borde fungera. Helt otestat men det känns som det fungerar
Söker upp alla tabeller som slutar på "_ping" Kod:
$sqlResult = mysql_query ("SHOW TABLES LIKE '%_ping'") or die (mysql_error()); if (mysql_num_rows ($sqlResult)) { while ($row = mysql_fetch_row($sqlResult)) { // Nu kommer $row[0] innehålla hela tabell namnet. // Kan tex göra mysql_query ("UPDATE $row[0] SET count = count +1"); } } |
||
Svara med citat |
2006-07-08, 14:58 | #8 | |||
|
||||
Mycket flitig postare
|
Okej. Det var ju en bättre förklaring. Nej nån Rocket Science är det ju inte direkt...
Vad du behöver göra är att använda SHOW eller DESCRIBE t ex: SHOW TABLES FROM en_databas; #visa alla tabeller i en databas SHOW FIELDS FROM en_tabell LIKE '%\_ping'; #ger alla columner i en tabell som slutar på _ping (Använder inte SHOW direkt dagligen men ovan borde fungera för att få reda på vad du behöver veta, titta annars i MySQL dokumentationen) sedan kan du substringa ut namnet eller använda det direkt för att ändra i en nästa query Edit: Nån hann ett par minuter före mig men jag låter det stå. |
|||
Svara med citat |
2006-07-17, 03:02 | #9 | |||
|
||||
Medlem
|
Vi har "samma" problem men i vårt fall spänner varje kund över olika databaser på en server. Vad jag har gjort för att underlätta min egen vardag är att bygga en uppdaterings sida. Jag kör en diff med hjälp av ett program som heter Sqlyog, diffen kopierar jag och klistrar in. Sedan låter jag skriptet uppdatera alla kunders databaser.
Det är väl ungefär så du menar att du vill jobba med den skillnaden att det ska vara per tabell istället? För att ge ett exempel: db.tw_utveckling table.members field.pwd (CHARS 255) db.tw_kunden_1 table.members field.pwd (CHARS 10) db.tw_kunden_2 table.members field.pwd (CHARS 10) Men efter lång tankemöda kom vi på att pwd bör vara 255 chars istället för 10 chars (exempel) då kör jag en diff på db.tw_utveckling mot db.tw_kunden_1 och det som skiljer dessa emellan i detta exempel pwd får jag ut som sql-kod och låter mitt skript köra på samtliga kunders databaser (dessa ligger på vår server) |
|||
Svara med citat |
Svara |
|
|