row uit tbl1 van db1 naar tbl1 van db2

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Bram Couteaux

Bram Couteaux

05/02/2008 01:36:00
Quote Anchor link
Hallo allemaal,

ik zit met een probleempje waar ik zelf al aan heb zitten kloten maar toen ik ermee bezig was dacht ik dat moet makkelijker kunnen. Ik heb een script nodig waarmee je een rij uit een tabel van db1 ophaalt en plaatst in een tabel in db2.
Het idee erachter is:
je hebt een "actual" database en een "history" database. Deze zijn qua tabel indeling identiek. Stel je hebt tabel "persoon" in de actual database. Piet veranderd zijn gegevens daarom willlen we nu de rij van piet uit de "actual" database ophalen en in de identieke tabel in de "history" database invoegen om vervolgens de wijziging in de actual database te doen die piet wenste(ist nou een t of een d?).
Dit is vrij makkelijk te maken als de tabellen en de opbouw van de tabellen vooraf ingesteld zijn in de functie maar ik heb het over ruim 23 tabellen waarvan de indeling affentoe veranderd plus komt er zo nu en dan weer een nieuwe tabel bij terwijl we het systeem uitbreiden.

Wat ik tot nu toe had(voordat ik dus dacht dat het makkelijker kon)was dit waarbij de compactibileit van de query nog klein is(alleen nog tabellen bewerken waarbij het eac_id van toepassing is.) maar dat is makkelijk uit te breiden met een paar extra variabelen:

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
<?

function doquery ($table,$id,$query)
{

    //tabelstructuur ophalen
    $result = mysql_query("SELECT * FROM $table");
    $i = 0;
    while ($i < mysql_num_fields($result))
    {

        $info = mysql_fetch_field($result);
        $field["$i"] = ",`$info->name`";
        $field2["$i"] = "$info->name";
        $i++;
    }

    //oude gegevens ophalen
    $query = myqsl_query("SELECT * FROM $table WHERE eac_id ='$id'");
    $value = mysql_fetch_assoc($query);
    //oude gegevens opslaan
    $field['0'] = substr("$field[0]", 1);
    $fields = trim("$field[0]$field[1]$field[2]$field[3]$field[4]$field[5]$field[6]$field[7]$field[8]$field[9]$field[10]$field[11]$field[12]$field[13]$field[14]$field[15]$field[16]
                    $field[17]$field[18]$field[19]$field[20]$field[21]$field[22]$field[23]$field[24]$field[25]$field[26]$field[27]$field[28]$field[29]$field[30]"
);
    $values = trim("$value[$field2[0]]$value[$field2[1]]$value[$field2[2]]"); //enzovoorts t/m 30 want dat is 5 velden meer dan de tot nu toe grootste tabel
    mysql_select_db("eaczc_history");
    mysql_query("INSERT INTO `$table` ($fields) VALUES ($values)");
    
}


?>


Alle hulp en ideeën zijn welkom!

B.v.d.

Bram
Gewijzigd op 01/01/1970 01:00:00 door Bram Couteaux
 
PHP hulp

PHP hulp

27/11/2024 21:17:48
 
Frank -

Frank -

05/02/2008 01:51:00
Quote Anchor link
History, leuk en aardig, maar wat is nu het daadwerkelijke probleem? Een database kan al snel enkele terabytes aan data bevatten, zelfs MySQL kan dat wel aan. Gaan klooien met 2 databases, is vragen om problemen.

Wil je ondanks alle problemen tóch een aparte history gaan bijhouden, maak dan aparte tabellen in je database aan. Ga vervolgens met TRIGGERs werken, die kunnen e.e.a. automatisch bijhouden, daar heb je geen PHP voor nodig. Dat is dus vele malen veiliger, er kan veel minder fout gaan. En fout gaan, dat is iets waar MySQL gek op is! (Of heb jij de database goed geconfigureerd?)

Je hebt wel minimaal MySQL 5.0.2 nodig, oudere versies kennen geen TRIGGERs.

Ps. Gooi nog wel even die gore backtics ` uit je queries, die onzin heeft niks met SQL te maken.
 
Bram Couteaux

Bram Couteaux

05/02/2008 02:14:00
Quote Anchor link
Excuus voor die backticks maar ik heb de querys rechtstreeks uit pma gehaalt en dan zitte die dingen nog erin.
Heb even gekeken maar de mysql versie is 4.2 bij onze host(flexweb) dus triggers vallen af. We willen niet oude rijen nog in dezelfde tabel hebben en de omvang van de db heeft daar niks mee te maken. Een 2e tabel voor iedere tabel maar in dezelfde database kan wel maar maakt het onoverzichtelijker en het enige extra voor een 2e db is dat je 2x mysql_select_db moet gebruiken.
De reden dat we 2 db's willen heeft enkel en alleen te maken met beveiliging en verschillende mysql accounts. Je kan me vertellen en adviseren dat hetgeen wat we willen niet mogelijk is maar wij denken er anders over en ik vraag jullie om me te helpen zoverre dat jullie dat kunnen en willen met deze opzet.

Nogmaals alvast bedankt,


Bram
 
Frank -

Frank -

05/02/2008 02:24:00
Quote Anchor link
Versie 4.2? Is die dan uitgebracht? De handleiding zegt daar niks over, die lijkt niet te bestaan, op de site van MySQL kan ik er niks van terugvinden.

Het verhaal van beveiliging en mysql accounts gaat niet op, dat kun je prima inrichten met 1 database. GRANT en REVOKE zijn niet voor niks uitgevonden.

Quote:
Je kan me vertellen en adviseren dat hetgeen wat we willen niet mogelijk is maar wij denken er anders over en ik vraag jullie om me te helpen zoverre dat jullie dat kunnen en willen met deze opzet.
Wat wil je nu? Hulp of horen dat je goed bezig bent? Het feit dat je met oude rommel bezig bent, zegt mij genoeg... Leesvoer, zal je goed doen, zal je wakker schudden.
 
Bram Couteaux

Bram Couteaux

05/02/2008 15:55:00
Quote Anchor link
Hulp in hetgeen waarom ik vroeg als je bereid bent dat te geven zoals ik al had gezegd en ik hoef niet te horen dat ik het geweldig doe en het is mysql 4 ik heb fout gekeken toen ik pma opende.
Thx anyway en ga lkkr verder...

P.S. Sorry dat we oude rommel gebruiken hoor geweldige frank maar niet iedereen heeft gelijk de niewste mysql en ja ik weet dat 6 inmiddels onderweg is.
 
Crispijn -

Crispijn -

05/02/2008 16:11:00
Quote Anchor link
@Bram: Frank kan soms wat kort door de bocht gaan maar het is wel iemand die weet waar hij over praat... Hoe vervelend dat soms ook kan zijn. Ik zou zijn tips zeker meenemen voordat je een systeem hebt dat slaat op bagger...

Dus: Zorgen dat je een goede mysqlversie hebt (iig dus 5.0.45) of nieuwer. Dan gaan we praten over een database die wat kan! Wanneer de database iets kan, kan jij er ook wat mee!
 
Frank -

Frank -

05/02/2008 16:13:00
Quote Anchor link
Wat nu precies het probleem is, blijft een groot raadsel, beveiligingsproblemen hoef je namelijk niet op te lossen met meerdere databases. Dat doe je door meerdere users aan te maken en de users te voorzien van de juiste rechten. GRANT en REVOKE zijn daarvoor gemaakt, zie de handleiding.

Met jouw aanpak van 2 databases zit je gewoon op het verkeerde pad. Wellicht wil je dat niet horen, het is helaas wel zo. Waarom? Omdat je nu de garantie krijgt op corrupte data, alles wat fout kan gaan, zal (zoals gewoonlijk) ook fout gaan. Het grote probleem is alleen dat je dan nauwelijks meer kunt achterhalen wat de juiste stand van zaken is.

Veel succes!

Tipje: ga niet zo eigenwijs doen en stel je open voor andermans ideeen. Anders heeft het weinig zin om te vragen om hulp...

Edit:
Ik wil inderdaad nog wel eens een bochtje afsnijden of op een teer zieltje trappen, de botte bijl bevalt namelijk uitstekend. Op de één of andere manier komt de boodschap dan beter over.

Mocht dat niet bevallen, jammer maar helaas.
Gewijzigd op 01/01/1970 01:00:00 door Frank -
 



Overzicht Reageren

 
 

Om de gebruiksvriendelijkheid van onze website en diensten te optimaliseren maken wij gebruik van cookies. Deze cookies gebruiken wij voor functionaliteiten, analytische gegevens en marketing doeleinden. U vindt meer informatie in onze privacy statement.