Ik heb een simpel PHP-scriptje gemaakt, waarmee ik de namen van spelers uit tabel spelers van database 1 wil synchroniseren / kopiëren naar de spelers tabel van database 2.
Op zich heb ik dit nu werkend, maar dit is een inefficiënte manier; ik doorloop de spelers tabel van database 1 en maak vervolgens een insert query voor de spelers tabel in database 2. Doordat ik beide spelerstabellen het veld waar de naam staat een unieke eigenschap heb gegeven (om er zeker van te zijn dat de velden uniek zijn) weet ik in ieder geval 100% zeker dat een naam maar 1x voor kan komen in beide tabellen.
So far so good, maar dit kan mijns inziens beter en ik vroeg mij af hoe. Ik heb niet zo heel veel kennis van MySQL en ik heb ook al wel het een en ander gezocht op internet. In mijn zoektocht vond ik dan voornamelijk het synchroniseren van databases, iets wat voor mij niet van toepassing is. Toen ik verder keek kwam ik wel iets tegen met IF (NOT) EXISTS, maar dat is alleen in de SQL query en dus alleen in de database / tabel waar je de query op loslaat. Ik zou dus eigenlijk iets moeten hebben als PL/SQL, zoals dat is met (iig) Oracle, maar ik gebruik (helaas?) MySQL, omdat beide pakketten dit nou eenmaal vragen.
Voor de zekerheid de code die ik nu hiervoor gebruik:
Bijkomend is ook nog eens, dat er steeds meer spelers juist erbij komen, waardoor de resultaten van de SELECT alleen maar toenemen. Nu kan ik dat wel weer afvangen met een LIMIT natuurlijk, door steeds om de 100 spelers de limiet te verhogen, maar zoals je begrijpt wil ik niet aan de gang blijven met het bijwerken van het script. Iemand die weet wat ik (door mijn gemis aan de juiste kennis en ervaring) uit de brand kan en wil helpen?
Wellicht ten overvloede: de MySQL en PHP draaien op een Debian Testing met de PHP5 en MySQL5 uit diens repositories (exacte versies weet ik even niet).
Op zich heb ik dit nu werkend, maar dit is een inefficiënte manier; ik doorloop de spelers tabel van database 1 en maak vervolgens een insert query voor de spelers tabel in database 2. Doordat ik beide spelerstabellen het veld waar de naam staat een unieke eigenschap heb gegeven (om er zeker van te zijn dat de velden uniek zijn) weet ik in ieder geval 100% zeker dat een naam maar 1x voor kan komen in beide tabellen.
So far so good, maar dit kan mijns inziens beter en ik vroeg mij af hoe. Ik heb niet zo heel veel kennis van MySQL en ik heb ook al wel het een en ander gezocht op internet. In mijn zoektocht vond ik dan voornamelijk het synchroniseren van databases, iets wat voor mij niet van toepassing is. Toen ik verder keek kwam ik wel iets tegen met IF (NOT) EXISTS, maar dat is alleen in de SQL query en dus alleen in de database / tabel waar je de query op loslaat. Ik zou dus eigenlijk iets moeten hebben als PL/SQL, zoals dat is met (iig) Oracle, maar ik gebruik (helaas?) MySQL, omdat beide pakketten dit nou eenmaal vragen.
Voor de zekerheid de code die ik nu hiervoor gebruik:
PHP:
En ja, ik weet dat PHP automatisch de verbinding sluit met MySQL, maar wil het liever 100% zeker weten. Zoals te zien is, laat ik door elke resultaat van de eerste query een INSERT query los op de tweede tabel en database, nu weet ik ook wel, dat dit met 1 INSERT query kan, maar dat maakt mijns inziens voor de load niet uit.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
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
| ?php $host = 'localhost'; // Server $user = 'usert'; // Gebruikersnaam $pass = 'pass'; // Wachtwoord $conn = mysql_connect($host, $user, $pass); if(!$conn) // Maak connectie met database en controleer of gegevens goed zijn { echo 'Het maken van de verbinding was niet goed. '; } else // Selecteer de benodigde database { $seldb = mysql_select_db('ProConStatsLog'); if(!$seldb) // Controleer of het selecteren van de database gelukt is. { echo 'Het selecteren van de eerste database is niet gelukt.'; } else // We kunnen een query loslaten { $query = "SELECT `SoldierName` FROM `tbl_playerdata`"; $result = mysql_query($query); if(!$result) // Controleer of de query uitvoerbaar was { echo 'Er ging iets mis met het draaien van de query.'; } else // Vang de resultset op { while($row = mysql_fetch_assoc($result)) { $seldb2 = mysql_select_db('ezstats', $conn); if(!$seldb2) // Controleer of verbinden met tweede database is gelukt { echo 'Verbinden met tweede database is niet gelukt.'; } else // Zo ja, dan gaan we weer door. { $player = mysql_real_escape_string($row['SoldierName']); // Escape de spelernamen waar noodzakelijk $query2 = "INSERT INTO ezstats_players (name) VALUES ('". $player ."');"; $result2 = mysql_query($query2); if(!$result2) { echo 'Het invoeren van '. htmlspecialchars($row['SoldierName']) .' is niet gelukt, waarschijnlijk al in de tabel.<br>'; echo "\n\r"; } else { echo 'Speler '. htmlspecialchars($player) .' is succesvol aan de EZStats toegevoegd<br>'; } } } } } } mysql_close($conn); ?> |
Bijkomend is ook nog eens, dat er steeds meer spelers juist erbij komen, waardoor de resultaten van de SELECT alleen maar toenemen. Nu kan ik dat wel weer afvangen met een LIMIT natuurlijk, door steeds om de 100 spelers de limiet te verhogen, maar zoals je begrijpt wil ik niet aan de gang blijven met het bijwerken van het script. Iemand die weet wat ik (door mijn gemis aan de juiste kennis en ervaring) uit de brand kan en wil helpen?
Wellicht ten overvloede: de MySQL en PHP draaien op een Debian Testing met de PHP5 en MySQL5 uit diens repositories (exacte versies weet ik even niet).