row uit tbl1 van db1 naar tbl1 van db2
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)
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
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)");
}
?>
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
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.
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
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:
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.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.
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.
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!
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...
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. 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.
Mocht dat niet bevallen, jammer maar helaas.
Gewijzigd op 01/01/1970 01:00:00 door Frank -