requête avec sous requete qui fonctionne sur PhpMyAdmin mais pas avec un script PHP
Bonjour,
Avant tout j'ai cherché pas mal de temps avant de poster ici mon problème, mais impossible de trouver le même cas...
Alors voilà le contexte :
J'ai cette requête
Code:
1 2 3 4 5 6 7 8 9 10 11
| select T.* FROM
(SELECT v.idPlayer as victim, v.name as vicName,k.idPlayer as killer, k.name as kilName, count(*) as number
FROM stats_players v
LEFT OUTER JOIN stats_events e ON v.idPlayer = e.idPlayerVictim
LEFT OUTER JOIN stats_players k ON e.idPlayer = k.idPlayer
WHERE e.type="PVP"
GROUP BY v.idPlayer,k.idPlayer
HAVING COUNT(*) > 3 ORDER BY COUNT(*) DESC) AS T
group by killer
order by count(*) DESC, sum(number) DESC
LIMIT 1 |
Lorsque je la lance sous PhpMyAdmin, elle retourne bien une valeur, jusqu'ici tout va bien.
Dans mon script PHP, je récupère cette requête (exactement la même, elle n'est pas généré via un algorithme) qui est stocké en base de données puis je la lance avec le script suivant :
Code:
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 59
| try {
$bdd = new PDO('mysql:host=' . SQL_HOST . ';dbname=' . SQL_DBASE, SQL_USER, SQL_PASS);
$bdd->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$bdd->query('SET session wait_timeout=120');
$bdd->query('SET session interactive_timeout=120');
} catch (PDOException $e) {
die('Error during the connection to the MYSQL database : ' . $e->getMessage());
}
$title['request'] = 'select killer as idPlayer FROM
(SELECT v.idPlayer as victim, v.name as vicName,k.idPlayer as killer, k.name as kilName, count(*) as number
FROM stats_players v
LEFT OUTER JOIN stats_events e ON v.idPlayer = e.idPlayerVictim
LEFT OUTER JOIN stats_players k ON e.idPlayer = k.idPlayer
WHERE e.type="PVP"
GROUP BY v.idPlayer,k.idPlayer
HAVING COUNT(*) > 3 ORDER BY COUNT(*) DESC) AS T
group by killer
order by count(*) DESC, sum(number) DESC
LIMIT 1';
$playerList = request_db($bdd,$title['request']);
var_dump($playerList);
function request_db($bdd, $request, $txt = '') {
try {
if (isset($_GET['debug']) && $_GET['debug'] == 'request') {
echo $request . '<br>';
// logfile('requete : ' . $request);
}
$timeReqStart = microtime(true);
$result = $bdd->query($request);
$timeReqEnd = microtime(true);
$timeReq = $timeReqEnd - $timeReqStart;
if ($txt != '') {
echo $txt . '<br>';
}
if (preg_match("/^SELECT/", $request)) { /* Return the ID of the last request (INSERT ONLY) */
$res_tab = $result->fetchAll();
$result->closeCursor();
return $res_tab;
} else if (preg_match("/^INSERT/", $request) || preg_match("/^UPDATE/", $request)) { /* All that not insert return table */
echo 'Time Process request : ' . number_format($timeReq, 3) . ' sec <br>';
return $bdd->lastInsertId();
}
} catch (Exception $e) {
echo 'Error while contacting the database. Please contact the administrator. <br>';
logfile($request);
logfile('request error :' . $e->getMessage());
if (isset($_GET['debug'])) {
echo 'request : ' . $request . '<br>';
die('Error during the request to the MYSQL database : <br>' . $e->getMessage());
}
}
} |
Le var_dump me retourne un 'null'. (pour rappel cette même requête me retournait bien un valeur sous phpMyAdmin.)
Du coup j'ai testé mon script avec les requêtes suivantes :
1. Requête sans sous-requête
Résultat : OK (elle me retourne bien des valeurs)
Code:
1 2 3 4 5 6 7
| SELECT v.idPlayer as victim, v.name as vicName,k.idPlayer as killer, k.name as kilName, count(*) as number
FROM stats_players v
LEFT OUTER JOIN stats_events e ON v.idPlayer = e.idPlayerVictim
LEFT OUTER JOIN stats_players k ON e.idPlayer = k.idPlayer
WHERE e.type="PVP"
GROUP BY v.idPlayer,k.idPlayer
HAVING COUNT(*) > 3 ORDER BY COUNT(*) DESC |
2. Requête avec sous-requete mais avec un affichage simple
Résultat : KO (var_dump retourne 'null')
Code:
1 2 3 4 5 6 7 8
| select T.* FROM
(SELECT v.idPlayer as victim, v.name as vicName,k.idPlayer as killer, k.name as kilName, count(*) as number
FROM stats_players v
LEFT OUTER JOIN stats_events e ON v.idPlayer = e.idPlayerVictim
LEFT OUTER JOIN stats_players k ON e.idPlayer = k.idPlayer
WHERE e.type="PVP"
GROUP BY v.idPlayer,k.idPlayer
HAVING COUNT(*) > 3 ORDER BY COUNT(*) DESC) AS T |
Du coup j'ai l'impression que le problème vient de la sous-requête mais aucune idée pourquoi et je n'ai aucune idée de ce que je dois changer pour que cela fonctionne... Si vous avez une idée lumineuse, je suis preneur.
Merci d'avance,