18.000 bestanden in MySQL
Ik heb op dit moment 18.000 userfiles, het zijn .ini files en ik wil ze graag allemaal in mijn MySQL database krijgen, handmatig zou dit heel veel tijd gaan kosten. Heeft iemand een idee hoe ik het zou kunnen doen? Het structuur gaat als volgt:
Kingunit.ini
Cash=100
Score=20
...
Ik heb dus een database tabel die ziet er dan hetzelfde eruit:
Username Cash Score ...
Hoe moet ik dit dan maken voor 18
000 bestanden? Ook moet de filename bij Username komen, kan iemand mij hulp aanbieden?
Plaats eens een voorbeeld van een bestand.
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
hashPW=68157737
password=xxxxxxxx
Score=50970
Admin=5
Skin=147
Wins=354
Runups=274
C1=6
C2=6
IRC=1
Muted=0
Donor=1
Color=-1828716544
Channel=4
ChannelID=39481319
PrimeID=0
Primepoint=0
Cash=1938
Hat=2
Ticket=0
password=xxxxxxxx
Score=50970
Admin=5
Skin=147
Wins=354
Runups=274
C1=6
C2=6
IRC=1
Muted=0
Donor=1
Color=-1828716544
Channel=4
ChannelID=39481319
PrimeID=0
Primepoint=0
Cash=1938
Hat=2
Ticket=0
Daar heb ik er dus 18.000 van, en dat moet ik deze tabel:
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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
CREATE TABLE IF NOT EXISTS `PlayerInfo` (
`ID` int(11) NOT NULL AUTO_INCREMENT,
`Username` varchar(24) NOT NULL,
`hashPW` varchar(50) NOT NULL,
`Password` varchar(50) NOT NULL,
`Score` int(11) NOT NULL DEFAULT '0',
`Skin` int(11) NOT NULL,
`Wins` int(11) NOT NULL,
`Runups` int(11) NOT NULL,
`C1` int(11) NOT NULL,
`C2` int(11) NOT NULL,
`IRC` int(11) NOT NULL,
`Locked` int(11) NOT NULL,
`Muted` int(11) NOT NULL,
`Channel` int(11) NOT NULL,
`ChannelID` int(11) NOT NULL,
`Donor` int(11) NOT NULL,
`Color` int(11) NOT NULL,
`Primepoint` point NOT NULL,
`PrimeID` int(11) NOT NULL,
`Cash` int(11) NOT NULL,
`Hat` int(11) NOT NULL,
`Ticket` int(11) NOT NULL,
PRIMARY KEY (`ID`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=3 ;
`ID` int(11) NOT NULL AUTO_INCREMENT,
`Username` varchar(24) NOT NULL,
`hashPW` varchar(50) NOT NULL,
`Password` varchar(50) NOT NULL,
`Score` int(11) NOT NULL DEFAULT '0',
`Skin` int(11) NOT NULL,
`Wins` int(11) NOT NULL,
`Runups` int(11) NOT NULL,
`C1` int(11) NOT NULL,
`C2` int(11) NOT NULL,
`IRC` int(11) NOT NULL,
`Locked` int(11) NOT NULL,
`Muted` int(11) NOT NULL,
`Channel` int(11) NOT NULL,
`ChannelID` int(11) NOT NULL,
`Donor` int(11) NOT NULL,
`Color` int(11) NOT NULL,
`Primepoint` point NOT NULL,
`PrimeID` int(11) NOT NULL,
`Cash` int(11) NOT NULL,
`Hat` int(11) NOT NULL,
`Ticket` int(11) NOT NULL,
PRIMARY KEY (`ID`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=3 ;
Gewijzigd op 15/01/2012 13:14:14 door Jurrien P
Als je dat voor elkaar hebt, kun je voor elke regel in je .ini bestanden een kolom vullen en dat uiteindelijk als record invoegen in je database.
Ik heb eerlijk gezegd helemaal geen idee waar ik moet beginnen.
Hihi, dit is best wel grappig...
Daar zou je de functie glob voor kunnen gebruiken, hiermee haal je alle bestanden, of alleen alle .ini bestanden uit een map en kan je ze stuk voor stuk af handelen.
Roel van de Water op 15/01/2012 13:57:00:
Heb je al een while() gemaakt die alle bestanden door zou kunnen lopen?
Als je dat voor elkaar hebt, kun je voor elke regel in je .ini bestanden een kolom vullen en dat uiteindelijk als record invoegen in je database.
Als je dat voor elkaar hebt, kun je voor elke regel in je .ini bestanden een kolom vullen en dat uiteindelijk als record invoegen in je database.
1. je hebt in principe geen while nodig
-> foreach(glob('*.ini') as $file)
2. het is ook niet nodig om de ini file regel voor regel uit te lezen
-> http://wwww.php.net/parse_ini_file
Redelijkwijs heb je van de php start tag tot de php end tag z'n 24 regels in je php script:
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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
<?php
ini_set('display_errors',1);
error_reporting(E_STRICT | E_ALL);
set_time_limit(0);
foreach (glob('*.ini') as $file) {
$record = parse_ini_file($file);
$fileinfo = pathinfo($file);
$record['username'] = $fileinfo['filename'];
$aValues = array();
foreach($record as $field => $value) {
$aValues[] = "'". mysql_real_escape_string($value) ."'";
}
$sql = "INSERT INTO PlayerInfo
(".(explode(',',array_keys($record))).")
VALUES
(".(explode(',',$aValues)).")";
if (($result = mysql_query($sql)) === false) {
echo 'PlayerInfo: '.$record['username'].' is niet toegeveogd';
}
else {
echo 'PlayerInfo: '.$record['username'].' is toegeveogd';
}
}
?>
ini_set('display_errors',1);
error_reporting(E_STRICT | E_ALL);
set_time_limit(0);
foreach (glob('*.ini') as $file) {
$record = parse_ini_file($file);
$fileinfo = pathinfo($file);
$record['username'] = $fileinfo['filename'];
$aValues = array();
foreach($record as $field => $value) {
$aValues[] = "'". mysql_real_escape_string($value) ."'";
}
$sql = "INSERT INTO PlayerInfo
(".(explode(',',array_keys($record))).")
VALUES
(".(explode(',',$aValues)).")";
if (($result = mysql_query($sql)) === false) {
echo 'PlayerInfo: '.$record['username'].' is niet toegeveogd';
}
else {
echo 'PlayerInfo: '.$record['username'].' is toegeveogd';
}
}
?>
Opmerking: dit is niet getest!
Op username dient nog een unique key geplaatst te worden
Gewijzigd op 15/01/2012 17:13:19 door Noppes Homeland
Bedankt voor de inzet Noppes, maar wat bedoel je percies met 'unique key'?
En dan is het ook aan te raden om MyIsam als engine links te laten liggen en InnoDB te gebruiken. Dat is het beste wat mysql te bieden heeft om enigsinds de data integriteit te waarborgen.
Notice: Array to string conversion on line 24
Daarna word de query niet uitgevoerd, misschien klinkt het gek, maar ik snap op dit moment weinig van de code dus het is voor mij moeilijk om het repareren.
Explode moet implode zijn.
Error weg, alleen hij word nog niet toegevoegd, even kijken wat ik precies fout doe.
Je hebt neem ik aan het gedeelte toegevoegd dat de verbinding maakt met je database?
var_dump anders de query eens...
- Mark - op 15/01/2012 19:28:05:
Je hebt neem ik aan het gedeelte toegevoegd dat de verbinding maakt met je database?
Ja, de connectie heb ik natuurlijk gemaakt.
Als ik vardump doe op $sql:
Code (php)
1
INSERT INTO PlayerInfo (hashPW,password,Score,Admin,Wins,Runups,C1,C2,IRC,Locked,Muted,Channel,ChannelID,Donor,Skin,username) VALUES ('74252610','199824','0','0','0','0','1','1','0','0','0','-1','-1','0','124','Kingunit')"
Gewijzigd op 15/01/2012 19:45:27 door Jurrien P
In de database: `Password` varchar(50) NOT NULL,
Hoofdletter/Kleine letter probleem.
Heb het gezien, alles opgelost het werkt nu. Heel erg bedankt allemaal, echt - dit scheelt weer 18.000 userfiles openen. :)