Archief - /PHP Grote table opvullen met array

Het archief is een bevroren moment uit een vorige versie van dit forum, met andere regels en andere bazen. Deze posts weerspiegelen op geen enkele manier onze huidige ideeën, waarden of wereldbeelden en zijn op sommige plaatsen gecensureerd wegens ontoelaatbaar. Veel zijn in een andere tijdsgeest gemaakt, al dan niet ironisch - zoals in het ironische subforum Off-Topic - en zouden op dit moment niet meer gepost (mogen) worden. Toch bieden we dit archief nog graag aan als informatiedatabank en naslagwerk. Lees er hier meer over of start een gesprek met anderen.

GamesMaxed

Legacy Member
Hallo allemaal, ik zit met een probleem, maar het is belangrijk dat ik eerst uitleg wat de bedoeling van het project is.
Ik werk sinds enkele dagen een exp tracker voor de MMO Runescape. Uit de highscores kan ik het level, exp en de rank (Highscores rank) van alle 25 skills halen. Ik heb dus een array die er zo uitzuit:
Code:
array(
    [0]=>
        'EXP' = 5946
        'LEVEL' = 25
        'RANK' = 156
    [1]=>
        'EXP' = 2595
        'LEVEL' = 5
        'RANK' = 548464
)
Nu is de vraag hoe ik dit makkelijk in mijn database, en zeer geoptimalliseerd doe. Voor elke 25 skills heb ik 3 aparte kolommen waar exp, level, en rank instaan. Dit moet zeer geoptimallisseerd zijn aangezien ik verwacht om ongeveer 200 gebruikers te moeten doen. Ik gebruik PDO (met bindparam).

SQL

Code:
-- phpMyAdmin SQL Dump
-- version 3.5.8.1deb1
-- http://www.phpmyadmin.net
--
-- Machine: localhost
-- Genereertijd: 26 jul 2013 om 12:52
-- Serverversie: 5.5.32-0ubuntu0.13.04.1
-- PHP-versie: 5.4.9-4ubuntu2.2

SET SQL_MODE="NO_AUTO_VALUE_ON_ZERO";
SET time_zone = "+00:00";

--
-- Databank: `clantracker`
--

-- --------------------------------------------------------

--
-- Tabelstructuur voor tabel `clans`
--

CREATE TABLE IF NOT EXISTS `clans` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(255) NOT NULL,
  `leader` varchar(255) NOT NULL,
  `password` varchar(255) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB  DEFAULT CHARSET=latin1 AUTO_INCREMENT=5 ;

--
-- Gegevens worden uitgevoerd voor tabel `clans`
--

INSERT INTO `clans` (`id`, `name`, `leader`, `password`) VALUES
(1, 'Lunagang', 'Feppie64', 'Lunagang2013'),
(2, 'Robin Is Pro', 'Robin', 'RobinClan'),
(3, 'Reddit', '/r/runescape', 'Reddit FTW'),
(4, 'MineCraft', 'Notch', 'ModAPI');

-- --------------------------------------------------------

--
-- Tabelstructuur voor tabel `user1`
--

CREATE TABLE IF NOT EXISTS `user1` (
  `date` date NOT NULL,
  `total_level` smallint(6) DEFAULT NULL,
  `total_exp` bigint(20) DEFAULT NULL,
  `total_rank` mediumint(9) DEFAULT NULL,
  `attack_level` tinyint(4) DEFAULT NULL,
  `attack_exp` int(11) DEFAULT NULL,
  `attack_rank` mediumint(9) DEFAULT NULL,
  `defence_level` tinyint(4) DEFAULT NULL,
  `defence_exp` int(11) DEFAULT NULL,
  `defence_rank` mediumint(9) DEFAULT NULL,
  `strength_level` tinyint(4) DEFAULT NULL,
  `strength_exp` int(11) DEFAULT NULL,
  `strength_rank` mediumint(9) DEFAULT NULL,
  `consitution_level` tinyint(4) DEFAULT NULL,
  `consitution_exp` int(11) DEFAULT NULL,
  `consitution_rank` mediumint(9) DEFAULT NULL,
  `ranged_level` tinyint(4) DEFAULT NULL,
  `ranged_exp` int(11) DEFAULT NULL,
  `ranged_rank` mediumint(9) DEFAULT NULL,
  `prayer_level` tinyint(4) DEFAULT NULL,
  `prayer_exp` int(11) DEFAULT NULL,
  `prayer_rank` mediumint(9) DEFAULT NULL,
  `magic_level` tinyint(4) DEFAULT NULL,
  `magic_exp` int(11) DEFAULT NULL,
  `magic_rank` mediumint(9) DEFAULT NULL,
  `cooking_level` tinyint(4) DEFAULT NULL,
  `cooking_exp` int(11) DEFAULT NULL,
  `cooking_rank` mediumint(9) DEFAULT NULL,
  `woodcutting_level` tinyint(4) DEFAULT NULL,
  `woodcutting_exp` int(11) DEFAULT NULL,
  `woodcutting_rank` mediumint(9) DEFAULT NULL,
  `fletching_level` tinyint(4) DEFAULT NULL,
  `fletching_exp` int(11) DEFAULT NULL,
  `fletching_rank` mediumint(9) DEFAULT NULL,
  `fishing_level` tinyint(4) DEFAULT NULL,
  `fishing_exp` int(11) DEFAULT NULL,
  `fishing_rank` mediumint(9) DEFAULT NULL,
  `firemaking_level` tinyint(4) DEFAULT NULL,
  `firemaking_exp` int(11) DEFAULT NULL,
  `firemaking_rank` mediumint(9) DEFAULT NULL,
  `crafting_level` tinyint(4) DEFAULT NULL,
  `crafting_exp` int(11) DEFAULT NULL,
  `crafting_rank` mediumint(9) DEFAULT NULL,
  `smithing_level` tinyint(4) DEFAULT NULL,
  `smithing_exp` int(11) DEFAULT NULL,
  `smithing_rank` mediumint(9) DEFAULT NULL,
  `mining_level` tinyint(4) DEFAULT NULL,
  `mining_exp` int(11) DEFAULT NULL,
  `mining_rank` mediumint(9) DEFAULT NULL,
  `herblore_level` tinyint(4) DEFAULT NULL,
  `herblore_exp` int(11) DEFAULT NULL,
  `herblore_rank` mediumint(9) DEFAULT NULL,
  `agility_level` tinyint(4) DEFAULT NULL,
  `agility_exp` int(11) DEFAULT NULL,
  `agility_rank` mediumint(9) DEFAULT NULL,
  `thieving_level` tinyint(4) DEFAULT NULL,
  `thieving_exp` int(11) DEFAULT NULL,
  `thieving_rank` mediumint(9) DEFAULT NULL,
  `slayer_level` tinyint(4) DEFAULT NULL,
  `slayer_exp` int(11) DEFAULT NULL,
  `slayer_rank` mediumint(9) DEFAULT NULL,
  `farming_level` tinyint(4) DEFAULT NULL,
  `farming_exp` int(11) DEFAULT NULL,
  `farming_rank` mediumint(9) DEFAULT NULL,
  `runecrafting_level` tinyint(4) DEFAULT NULL,
  `runecrafting_exp` int(11) DEFAULT NULL,
  `runecrafting_rank` mediumint(9) DEFAULT NULL,
  `hunter_level` tinyint(4) DEFAULT NULL,
  `hunter_exp` int(11) DEFAULT NULL,
  `hunter_rank` mediumint(9) DEFAULT NULL,
  `construction_level` tinyint(4) DEFAULT NULL,
  `construction_exp` int(11) DEFAULT NULL,
  `construction_rank` mediumint(9) DEFAULT NULL,
  `summoning_level` tinyint(4) DEFAULT NULL,
  `summoning_exp` int(11) DEFAULT NULL,
  `summoning_rank` mediumint(9) DEFAULT NULL,
  `dungoneering_level` tinyint(4) DEFAULT NULL,
  `dungoneering_exp` int(11) DEFAULT NULL,
  `dungoneering_rank` mediumint(9) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

-- --------------------------------------------------------

--
-- Tabelstructuur voor tabel `user2`
--

CREATE TABLE IF NOT EXISTS `user2` (
  `date` date NOT NULL,
  `total_level` smallint(6) DEFAULT NULL,
  `total_exp` bigint(20) DEFAULT NULL,
  `total_rank` mediumint(9) DEFAULT NULL,
  `attack_level` tinyint(4) DEFAULT NULL,
  `attack_exp` int(11) DEFAULT NULL,
  `attack_rank` mediumint(9) DEFAULT NULL,
  `defence_level` tinyint(4) DEFAULT NULL,
  `defence_exp` int(11) DEFAULT NULL,
  `defence_rank` mediumint(9) DEFAULT NULL,
  `strength_level` tinyint(4) DEFAULT NULL,
  `strength_exp` int(11) DEFAULT NULL,
  `strength_rank` mediumint(9) DEFAULT NULL,
  `consitution_level` tinyint(4) DEFAULT NULL,
  `consitution_exp` int(11) DEFAULT NULL,
  `consitution_rank` mediumint(9) DEFAULT NULL,
  `ranged_level` tinyint(4) DEFAULT NULL,
  `ranged_exp` int(11) DEFAULT NULL,
  `ranged_rank` mediumint(9) DEFAULT NULL,
  `prayer_level` tinyint(4) DEFAULT NULL,
  `prayer_exp` int(11) DEFAULT NULL,
  `prayer_rank` mediumint(9) DEFAULT NULL,
  `magic_level` tinyint(4) DEFAULT NULL,
  `magic_exp` int(11) DEFAULT NULL,
  `magic_rank` mediumint(9) DEFAULT NULL,
  `cooking_level` tinyint(4) DEFAULT NULL,
  `cooking_exp` int(11) DEFAULT NULL,
  `cooking_rank` mediumint(9) DEFAULT NULL,
  `woodcutting_level` tinyint(4) DEFAULT NULL,
  `woodcutting_exp` int(11) DEFAULT NULL,
  `woodcutting_rank` mediumint(9) DEFAULT NULL,
  `fletching_level` tinyint(4) DEFAULT NULL,
  `fletching_exp` int(11) DEFAULT NULL,
  `fletching_rank` mediumint(9) DEFAULT NULL,
  `fishing_level` tinyint(4) DEFAULT NULL,
  `fishing_exp` int(11) DEFAULT NULL,
  `fishing_rank` mediumint(9) DEFAULT NULL,
  `firemaking_level` tinyint(4) DEFAULT NULL,
  `firemaking_exp` int(11) DEFAULT NULL,
  `firemaking_rank` mediumint(9) DEFAULT NULL,
  `crafting_level` tinyint(4) DEFAULT NULL,
  `crafting_exp` int(11) DEFAULT NULL,
  `crafting_rank` mediumint(9) DEFAULT NULL,
  `smithing_level` tinyint(4) DEFAULT NULL,
  `smithing_exp` int(11) DEFAULT NULL,
  `smithing_rank` mediumint(9) DEFAULT NULL,
  `mining_level` tinyint(4) DEFAULT NULL,
  `mining_exp` int(11) DEFAULT NULL,
  `mining_rank` mediumint(9) DEFAULT NULL,
  `herblore_level` tinyint(4) DEFAULT NULL,
  `herblore_exp` int(11) DEFAULT NULL,
  `herblore_rank` mediumint(9) DEFAULT NULL,
  `agility_level` tinyint(4) DEFAULT NULL,
  `agility_exp` int(11) DEFAULT NULL,
  `agility_rank` mediumint(9) DEFAULT NULL,
  `thieving_level` tinyint(4) DEFAULT NULL,
  `thieving_exp` int(11) DEFAULT NULL,
  `thieving_rank` mediumint(9) DEFAULT NULL,
  `slayer_level` tinyint(4) DEFAULT NULL,
  `slayer_exp` int(11) DEFAULT NULL,
  `slayer_rank` mediumint(9) DEFAULT NULL,
  `farming_level` tinyint(4) DEFAULT NULL,
  `farming_exp` int(11) DEFAULT NULL,
  `farming_rank` mediumint(9) DEFAULT NULL,
  `runecrafting_level` tinyint(4) DEFAULT NULL,
  `runecrafting_exp` int(11) DEFAULT NULL,
  `runecrafting_rank` mediumint(9) DEFAULT NULL,
  `hunter_level` tinyint(4) DEFAULT NULL,
  `hunter_exp` int(11) DEFAULT NULL,
  `hunter_rank` mediumint(9) DEFAULT NULL,
  `construction_level` tinyint(4) DEFAULT NULL,
  `construction_exp` int(11) DEFAULT NULL,
  `construction_rank` mediumint(9) DEFAULT NULL,
  `summoning_level` tinyint(4) DEFAULT NULL,
  `summoning_exp` int(11) DEFAULT NULL,
  `summoning_rank` mediumint(9) DEFAULT NULL,
  `dungoneering_level` tinyint(4) DEFAULT NULL,
  `dungoneering_exp` int(11) DEFAULT NULL,
  `dungoneering_rank` mediumint(9) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

-- --------------------------------------------------------

--
-- Tabelstructuur voor tabel `users`
--

CREATE TABLE IF NOT EXISTS `users` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `clan` int(11) NOT NULL,
  `display_name` varchar(12) NOT NULL,
  PRIMARY KEY (`id`),
  UNIQUE KEY `display_name` (`display_name`)
) ENGINE=InnoDB  DEFAULT CHARSET=latin1 AUTO_INCREMENT=3 ;

--
-- Gegevens worden uitgevoerd voor tabel `users`
--

INSERT INTO `users` (`id`, `clan`, `display_name`) VALUES
(1, 1, 'Robin House'),
(2, 1, '01564864');

GamesMaxed

Legacy Member
Er is telkens maar 1 row die moet ingevuld worden. Ik heb de SQL code in de beginpagina gezet zodat jullie mijn database ook kunnen bekijken

SgtPepper

Legacy Member
Je kan niet zomaar voor elke user die je in je systeem gaat zetten een tabel aanmaken. Dat werkt zeer inefficiënt.
Het probleem begint dus niet bij je insert maar bij je database structuur.

Ik heb nu niet veel tijd en heb snel door uw dump gescrolled, maar ik zou het als volgt aanpakken :

tabel user :

Deze zit goed zoals je ze nu wil aanpakken, dit wordt de algemene tabel voor je users bij te houden.

tabel skill :
- skill_id (primary)
- skill_name

tabel user_skills
- user_id
- skill_id
- exp
- level
- rank

Zo ga je dus in die laatste tabel een row hebben voor elke skills van elke user. Dit gaat uw selects later ook een pak vergemakkelijken.

Voor uw waarden te inserten ga je (en ik weet niet of dit mogelijk is want heb de highscore API niet bekeken) best voor elke user een array ophalen in de vorm van :
$user = array();
$user['cooking'] = array(
'rank' => rank,
'exp' => exp,
'level' => level
);

Die user array ga je dan opvullen met de gegevens van elke skill.
Achteraf kan je dan loopen door deze array en per skill een insert doen met de bijhorende gegevens in je database.

GamesMaxed

Legacy Member
En nog iets, wordt die database na een tijd dan niet enorm lang (Per dag komen er dan zo'n 5000 rijen) waardoor de query heel lang duurt als het alle gegevens van een speler uit database moet halen?

Tyfius

Legacy Member
Rijen ophalen uit tabellen die deftig geïndexeerd zijn is nog altijd efficiënter dan zomaar tabellen gaan bijmaken.

Ik ken niets van RuneScape, maar ik vermoed dat de statistieken ergens op hun website te vinden zijn. Ik kwam bijvoorbeeld dit topic tegen waar ze statistieken ophalen via een web service op de RuneScape website. Heb je al eens goed gekeken of zij geen API aanbieden die je kan gebruiken?

GamesMaxed

Legacy Member
De linkt wilt hier niet openen (Wat liegt aan hawkee, niet aan de link) maar ik gebruik cUrl en de minimale versie van de highscores (CSV).

Bedankt iedereen voor de antwoorden, volgens mij weet ik nu alles wat ik nodig heb.
Het archief is een bevroren moment uit een vorige versie van dit forum, met andere regels en andere bazen. Deze posts weerspiegelen op geen enkele manier onze huidige ideeën, waarden of wereldbeelden en zijn op sommige plaatsen gecensureerd wegens ontoelaatbaar. Veel zijn in een andere tijdsgeest gemaakt, al dan niet ironisch - zoals in het ironische subforum Off-Topic - en zouden op dit moment niet meer gepost (mogen) worden. Toch bieden we dit archief nog graag aan als informatiedatabank en naslagwerk. Lees er hier meer over of start een gesprek met anderen.
Terug
Bovenaan