Ses derniers messages sur les forums
Enfin bref, clés étrangères ou pas, tu dois spécifier les champs sur lesquels tu JOIN.
Attention, les clés étrangères ne sont pas une conséquence de l'utilisation d'innoDB.
Tu les as créé comment tes clés étrangères ?
Et pour moi, tu dois quand même spécifier l'attribut sur lequel tu JOIN, ca parait logique. Sinon, avec ton raisonnement, tes tables seraient condamnées à joiner les autres que sur leurs clé primaire / étrangères.
Voici la technique que j'utilise :
<?php
define ('DL_BUFFER', 16384);
function download ($blob, $filename) {
$filename = ereg_replace('[\\/:\*\?"<>\|;]', '_', str_replace(' ', ' ', $filename));
$isIE = $isIE6 = false;
if (isset($_SERVER["HTTP_USER_AGENT"])) {
$HTTP_USER_AGENT = $_SERVER["HTTP_USER_AGENT"];
if (strstr($HTTP_USER_AGENT, 'compatible; MSIE ') !== false && strstr($HTTP_USER_AGENT, 'Opera') === false) {
$isIE = 1;
}
if (strstr($HTTP_USER_AGENT, 'compatible; MSIE 6') !== false && strstr($HTTP_USER_AGENT, 'Opera') === false) {
$isIE6 = 1;
}
}
header('Pragma: ');
header('Cache-Control: cache');
if ($isIE) {
$filename = rawurlencode($filename);
header ("Pragma: public");
header ("Cache-Control: no-store, max-age=0, no-cache, must-revalidate");
header ("Cache-Control: post-check=0, pre-check=0", false);
header ("Cache-Control: private");
header ("Content-Disposition: inline; filename=$filename");
}
header ("Content-Type: application/octet-stream; name=\"$filename\"");
header ("Content-Disposition: attachment; filename=\"$filename\"");
if ($isIE && !$isIE6) {
header ("Content-Type: application/download; name=\"$filename\"");
}
else {
header ("Content-Type: application/octet-stream; name=\"$filename\"");
}
$size = strlen($blob);
$nb = ($size/DL_BUFFER);
$reste = ($size%DL_BUFFER);
for ($a=0; $a<$nb; $a++) {
echo substr($blob, $a*DL_BUFFER, DL_BUFFER);
flush();
}
echo substr($blob, -$reste);
flush();
}
?>
- $filename : le nom que tu veux donner au fichier
- $blob : le contenu binaire du fichier (récupérable avec un file_get_contents)
D'un point de vue de conception, tu as un problème, c'est à dire que tu dépends du site heroesofwarcraft.nainwak.org.
Si celui ci meurt, ta page meurt.
Bref, il faut faire des concessions dans ce cas la :
- abandonner le temps réel comme tu le fais actuellement, et récupérer l'xp du joueur une fois par heure par exemple
- stocker en base de données l'xp du joueur pour éviter de la redemander à ce site
- si le site distant est mort, afficher la dernière XP connue avec un petit message du genre "donnée peut être pas à jour"
- etc.
Ce sont des boulets Free, ils peuvent très bien savoir (si tu leur fourni une ip + une date) quel modem à "écrit" ces messages.
Pourquoi ne pas écrire à abuse@proxad.net ?
Et il fait quoi pour te harceler ?
(si son ip est dynamique, tu ne pourras faire grand chose de concluant et acceptable)
Sammuel, tout comme Lupus mic, j'utilise beaucoup innodb (ne serait ce que pour les transactions), et pour le moteur de recherche du site, je duplique en fait mes tables en MyISAM avec un FULLTEXT.
Comment ca marche : quand un message est inséré dans mon forum, je l'insert dans une table innodb et je met aussi à jour d'autres tables, le tout dans une transaction. Ensuite, j'insere également le message dans une table MyISAM (et la, si la requete merde, ben elle merde, au pire les recherches du site seront moins précises, mais je perds pas l'intégrité de ma base principale innoDB).
Les raisons de ce choix :
- simplicité de mise en place
- faible cout CPU lors des recherches
- j'ai une petite base de données à la base (sans table dupliquée) et donc ma base n'est pas forcement beaucoup plus grosse avec ces tables dupliquées (la base pour lephpfacile : 100 Mo environ).
PS : cette technique était utilisée par wikipedia il n'y a pas ci longtemps que ca. Eux par contre, ils remplissaient les tables MyISAM toutes les nuits au lieu de les remplir à chaque insertion d'article => leur recherche était moins précise jusqu'à ce que la nuit arrive, mais le lendemain, la recherche donnait tous les résultats possibles.
PPS : les deux techniques sont combinables => tu peux insérer dans la table MyISAM au fur et à mesure et lancer toutes les nuits un script qui calculera le diff entre les deux tables et compléter la table MyISAM.
Utiliser deux champs ?
Je suis d'accord, mais ce n'est pas le cas de tout le monde :)
Mais cette rubrique est intéressante, on la sortira.
Pourquoi pas :)
Mais attention, tout le monde ne produit pas du libre avec PHP.