Videos streaming images jeux et buzz
Connexion






Perdu le mot de passe ?

Inscrivez-vous maintenant !
Menu Principal
Communauté


« 1 (2)


Wiliwilliam
 0  #21
La loi c'est moi
Inscrit: 07/04/2012 19:19
Post(s): 37199
Karma: 17462
ça n'impliquerait pas que je crée manuellement une class par champion ? (soit 133 champions)
pour le drop c'est une fois par heure. c'est pas la mort.

en tout cas l'exécution du php est assez longue :roll: :lol:
en gros ça tape dans les 30-40s à cause de la limitation du nombre de requête par tranche de 10s sur l'API riot.

Contribution le : 19/08/2016 19:47
Signaler

-Flo-
 0  #22
Je poste trop
Inscrit: 08/01/2005 13:41
Post(s): 15182
Karma: 12550
@Arsenick : Le vrai gain ce n'est pas la table temporaire, c'est le load data. La table temporaire n'est qu'une étape intermédiaire nécessaire dans ce cas précis avant l'insertion dans la table finale, pour gérer les incrémentations des lignes déjà existantes. Le but étant de minimiser le nombre de requêtes effectuées vers la base, grâce au load data il peut ainsi insérer une infinité de lignes en seulement deux requêtes.

Contribution le : 19/08/2016 19:53
Signaler

Arsenick
 0  #23
J'aime glander ici
Inscrit: 13/12/2006 00:12
Post(s): 6447
Karma: 1023
Citation :

@Wiliwilliam_ a écrit:
ça n'impliquerait pas que je crée manuellement une class par champion ? (soit 133 champions)


Pourquoi? tu as besoin d'une instance champion?
Dans tout les cas tes champions sont identique au point de vue de leur attribut (nom, vie, attaque, défense etc).
Au pire tu pourrais avoir une instance par champion mais ça reste une seule classe 🙂

Citation :

pour le drop c'est une fois par heure. c'est pas la mort.


Seulement si ton cycle ne dépasse pas 60 min 😃


Citation :

en tout cas l'exécution du php est assez longue :roll: :lol:


Logique, un traitement local est toujours plus rapide qu'un traitement avec requête DB puisque tu as une communication entre les serveurs.
Et encore en plus si tu le fait en désynchro puisque tu déco/reco de ta DB à chaque fois.


@-Flo- J'avoue que je ne me suis jamais servi du load data.
J'ai tendance à traiter côté apli puis push vers la DB avec une transac.
A voir avec un trace si c'est vraiment plus opti niveau ressource.

Contribution le : 19/08/2016 20:32
Signaler

Wiliwilliam
 0  #24
La loi c'est moi
Inscrit: 07/04/2012 19:19
Post(s): 37199
Karma: 17462
@-Flo-
j'ai ENCORE un soucis
sur la ligne
INSERT INTO lolkoreus SELECT * FROM lolkoreus_wrk ON DUPLICATE KEY UPDATE

donc si l'ID n'existe pas encore, il INSERT bêtement, pas de soucis. on passe à la ligne suivante de la table WRK
si l'ID existe déjà on fait l'UPDATE mais 'faut additionner

donc du coup on a par exemple pour le nombre de kill:
championsKilled .= championsKilled ça marche pas
+= ça marche pas
😃 j'avoue ne pas connaitre la syntaxe. et surtout je ne sais pas comment je pourrais faire bêtement avec un A = A + B vu que les colonnes ont les même noms 😞
sur internet je trouve des trucs avec un WHERE ID = (current ID) mais je sais pas trop comment mettre ça en place dans ce cas là

Contribution le : 19/08/2016 20:35
Signaler

Arsenick
 0  #25
J'aime glander ici
Inscrit: 13/12/2006 00:12
Post(s): 6447
Karma: 1023
@Wiliwilliam_ si tu veux le faire côté DB, tu peux te servir d'une variable sql mais c'est pas vraiment ce qu'on conseil niveau BP.

Normalement tu prend tes donnée existante avant le traitement de tes infos, et ensuite tu mets à jours tes données avec un update après traitement des nouvelles données. Donc du coup t'as pas à te soucier de l'ancienne valeur car elle est de toutes façon additionnée lors de ton traitement.

Contribution le : 19/08/2016 20:41
Signaler

Wiliwilliam
 0  #26
La loi c'est moi
Inscrit: 07/04/2012 19:19
Post(s): 37199
Karma: 17462
ben j'ai le nom de la colonne de destination
championsKilled
la valeur d'origine
championsKilled
la valeur à additionner
championsKilled

je sais vraiment pas quoi foutre derrière le update du coup 😃

j'ai testé bêtement championsKilled = championsKilled et j'ai le droit à "championsKilled in field list is ambiguous" 😃

Contribution le : 19/08/2016 20:48
Signaler

Arsenick
 1  #27
J'aime glander ici
Inscrit: 13/12/2006 00:12
Post(s): 6447
Karma: 1023
@Wiliwilliam_ Logiquemnt dans ta requête tu défini un nom temporaire pour ta table ce qui évite d'avoir une redondance (lolchampion_wks AS lolC =/= lolchampion_wks AS lolC1) mais je te déconseil de faire du process dans la DB: une DB sert à stocker une information non calculable pas à la traiter.

En début de traitement tu fais un SELECT * de ta DB, tu crée à la volée un array d'objet avec toutes tes données (sert toi de l'ID comme index, c'est plus simple).

Quand tu process ton api, tu recherches dans ton array de donnée si l'ID existe déjà, si oui tu additionnes la valeur existante à la nouvelle et ensuite tu l’inclus dans ton ficher.
Quand tu as process tout, tu fais un INSERT / UPDATE et basta.


un truc du genre (schématiser):
var players = [];

foreach (DB->getAllPlayers() as dbPlayer){
    players[dbPlayer->id] = new Player(dbPlayer);
}

foreach (API->getInfos as info){
    $newValue = info->newValue;

    if (array_key_exists (info->id, players){
       $newValue += players[id]->value;
    }

    fwrite (monDocument.csv,$newValue);
}

DB->InsertData(monDocument.csv);


array_key_exists pour savoir si l'ID existe déjà.

Contribution le : 19/08/2016 21:24
Signaler

-Flo-
 1  #28
Je poste trop
Inscrit: 08/01/2005 13:41
Post(s): 15182
Karma: 12550
@Wiliwilliam_ : Pour lever l'ambiguité qu'il te donne en erreur, tu as juste à préfixer la colonne que tu vises par le nom de la table à laquelle elle appartient. Par exemple lolkoreus.championsKilled vs lolkoreus_tmp.championsKilled .

Donc championsKilled = lolkoreus.championsKilled + lolkoreus_tmp.championsKilled

Tout simplement... 🙂

Contribution le : 19/08/2016 22:06
Signaler

Wiliwilliam
 0  #29
La loi c'est moi
Inscrit: 07/04/2012 19:19
Post(s): 37199
Karma: 17462
@-Flo- oui, c'est ce que @Skity m'a expliqué sur Teamspeak.
Du coup on arrive à ça, bon ap':-D:

TRUNCATE TABLE lolheroes;
DROP TABLE IF EXISTS lolheroes_wrk;
CREATE TABLE lolheroes_wrk AS SELECT * FROM lolheroes WHERE 1=0;
LOAD DATA LOCAL INFILE 'compteur.csv'
INTO TABLE lolheroes_wrk
FIELDS TERMINATED BY ';'
ENCLOSED BY '"'
LINES TERMINATED BY '\n' 
(championId, indicea, indicen, wina, winn, assistsa, assistsn, championsKilleda,
championsKilledn, numDeathsa, numDeathsn, minionsKilleda, minionsKilledn, goldEarneda,
goldEarnedn, timePlayeda, timePlayedn, tripleKillsa, tripleKillsn, quadraKillsa,
quadraKillsn, pentaKillsa, pentaKillsn);
INSERT INTO lolheroes SELECT * FROM lolheroes_wrk ON DUPLICATE KEY UPDATE
indicea=lolheroes.indicea+lolheroes_wrk.indicea, indicen=lolheroes.indicen+lolheroes_wrk.indicen,
wina=lolheroes.wina+lolheroes_wrk.wina, winn=lolheroes.winn+lolheroes_wrk.winn, assistsa=lolheroes.assistsa+lolheroes_wrk.assistsa, assistsn=lolheroes.assistsn+lolheroes_wrk.assistsn, 
championsKilleda=lolheroes.championsKilleda+lolheroes_wrk.championsKilleda, 
championsKilledn=lolheroes.championsKilledn+lolheroes_wrk.championsKilledn, numDeathsa=lolheroes.numDeathsa+lolheroes_wrk.numDeathsa, 
numDeathsn=lolheroes.numDeathsn+lolheroes_wrk.numDeathsn, minionsKilleda=lolheroes.minionsKilleda+lolheroes_wrk.minionsKilleda, 
minionsKilledn=lolheroes.minionsKilledn+lolheroes_wrk.minionsKilledn, goldEarneda=lolheroes.goldEarneda+lolheroes_wrk.goldEarneda, 
goldEarnedn=lolheroes.goldEarnedn+lolheroes_wrk.goldEarnedn, timePlayeda=lolheroes.timePlayeda+lolheroes_wrk.timePlayeda, 
timePlayedn=lolheroes.timePlayedn+lolheroes_wrk.timePlayedn, tripleKillsa=lolheroes.tripleKillsa+lolheroes_wrk.tripleKillsa, 
tripleKillsn=lolheroes.tripleKillsn+lolheroes_wrk.tripleKillsn, quadraKillsa=lolheroes.quadraKillsa+lolheroes_wrk.quadraKillsa, 
quadraKillsn=lolheroes.quadraKillsn+lolheroes_wrk.quadraKillsn, pentaKillsa=lolheroes.pentaKillsa+lolheroes_wrk.pentaKillsa, pentaKillsn=lolheroes.pentaKillsn+lolheroes_wrk.pentaKillsn


Et ça, c'est la requête juste pour les CHAMPIONS, parce qu'il y a aussi une requête pour chaque joueur qui vaut son pesant de cacahuète 😃 (cf pastbin)
🔨

Bon ben encore une fois, merci à tous, vous êtes vraiment des champions, parce que comprendre ce que j'explique c'est pas toujours facile #galérien-de-l'explication :lol:
et réciproquement, je suis un peu lent à comprendre ce qu'on m'explique

Contribution le : 19/08/2016 22:14
Signaler

Arsenick
 0  #30
J'aime glander ici
Inscrit: 13/12/2006 00:12
Post(s): 6447
Karma: 1023
Citation :

@-Flo- a écrit:
@Wiliwilliam_ : Pour lever l'ambiguité qu'il te donne en erreur, tu as juste à préfixer la colonne que tu vises par le nom de la table à laquelle elle appartient. Par exemple lolkoreus.championsKilled vs lolkoreus_tmp.championsKilled .

Donc championsKilled = lolkoreus.championsKilled + lolkoreus_tmp.championsKilled

Tout simplement... :)



Ha oui ok, je ne sais pas pourquoi, je pensai qu'il faisait un self join d'ou l'utilisation d'un alias ^^.

Maintenant de vous à moi, je trouve ça sale comme manière de procéder :lol: .

Contribution le : 20/08/2016 00:57
Signaler

Wiliwilliam
 0  #31
La loi c'est moi
Inscrit: 07/04/2012 19:19
Post(s): 37199
Karma: 17462
@-Flo-
@Skity
@Arsenick

dites, j'ai un bug mental ...
PHP:
$query1 = 'LOAD DATA LOCAL INFILE \'/chemin/de/traverse/compteur.csv'
INTO TABLE lolheroes_wrk
FIELDS TERMINATED BY \';\'
ENCLOSED BY \'"\'
LINES TERMINATED BY \'\n\' 
(championId, indicea, indicen, wina, winn)';


ça me ECHO ça
LOAD DATA LOCAL INFILE '/chemin/de/traverse/compteur.csv\' INTO TABLE lolheroes_wrk FIELDS TERMINATED BY ';' ENCLOSED BY '"' LINES TERMINATED BY '\n' (championId, indicea, indicen, wina, winn)


et quand je C/C ça manuellement dans la BDD ça marche

Par contre quand je passe par un mysqli_query($connect,$query1) il me dit merde sans m'afficher d'erreur ...........................
lapin compris ce qu'il se passe vu que le C/C de mon ECHO fonctionne quand je fais manuellement la requête 😞
Les \ pour échapper les ' ne marchent pas du php vers le SQL?

edit:
je suis allé potasser la "concaténation pour les nuls" et j'avoue que ... même en doublant le \ devant le \n ça n'y change rien.

Contribution le : 20/08/2016 12:40
Signaler

Skity
 0  #32
Je masterise !
Inscrit: 29/12/2013 23:48
Post(s): 2024
Karma: 521
Citation :

@Wiliwilliam_ a écrit:
@-Flo-
@Skity
@Arsenick

dites, j'ai un bug mental ...
PHP:
$query1 = 'LOAD DATA LOCAL INFILE \'/chemin/de/traverse/compteur.csv\'
INTO TABLE lolheroes_wrk
FIELDS TERMINATED BY \';\'
ENCLOSED BY \'"\'
LINES TERMINATED BY \'\n\' 
(championId, indicea, indicen, wina, winn)';


ça me ECHO ça
LOAD DATA LOCAL INFILE '/chemin/de/traverse/compteur.csv\' INTO TABLE lolheroes_wrk FIELDS TERMINATED BY ';' ENCLOSED BY '"' LINES TERMINATED BY '\n' (championId, indicea, indicen, wina, winn)


et quand je C/C ça manuellement dans la BDD ça marche

Par contre quand je passe par un mysqli_query($connect,$query1) il me dit merde sans m'afficher d'erreur ...........................
lapin compris ce qu'il se passe vu que le C/C de mon ECHO fonctionne quand je fais manuellement la requête 😞
Les \ pour échapper les ' ne marchent pas du php vers le SQL?

edit:
je suis allé potasser la "concaténation pour les nuls" et j'avoue que ... même en doublant le \ devant le \n ça n'y change rien.


Dans ton ECHO, il y a un antisplash de trop après compteur.csv.

Un echo de mysqli_connect_error() donne quoi ?

Contribution le : 20/08/2016 13:41
Signaler

Wiliwilliam
 0  #33
La loi c'est moi
Inscrit: 07/04/2012 19:19
Post(s): 37199
Karma: 17462
@Skity rien du tout, c'est bien ce qui m'angoisse...

pour le \ de trop je crois que c'est moi qui l'ai rajouté en éditant ce topic 😃

actuellement j'ai ça:

ECHO->
LOAD DATA LOCAL INFILE '/blabla/compteur.csv' INTO TABLE `lolheroes_wrk` FIELDS TERMINATED BY ';' LINES TERMINATED BY '%n' (championId, indicea)


PHP->
$query1 = 'LOAD DATA LOCAL INFILE \'/blabla/compteur.csv\'
INTO TABLE `lolheroes_wrk`
FIELDS TERMINATED BY \';\'
LINES TERMINATED BY \'%n\' 
(championId, indicea)';


et rien a changé, ça marche toujours quand je C/C le ECHO dans la BDD et ça marche pas à partir de mysqli_query
mysqli_query($connect,$query1) or die(mysqli_connect_error($connect));

Contribution le : 20/08/2016 13:55
Signaler

Wiliwilliam
 0  #34
La loi c'est moi
Inscrit: 07/04/2012 19:19
Post(s): 37199
Karma: 17462
ok donc j'ai discuté avec @Dakwamine et du coup
la petite astuce c'était:
$connect = mysqli_init();
mysqli_options($connect, MYSQLI_OPT_LOCAL_INFILE, true);
+ un real_connect

alors quand on sait pas ... ben effectivement c'est pas évident 😃 😃 😃

Contribution le : 20/08/2016 15:46
_________________
Signaler


 Haut   Précédent   Suivant
« 1 (2)






Si vous êtes l'auteur d'un élément de ce site, vous pouvez si vous le souhaitez, le modifier ou le supprimer
Merci de me contacter par mail. Déclaré à la CNIL N°1031721.