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
Lorsque je la lance sous PhpMyAdmin, elle retourne bien une valeur, jusqu'ici tout va bien.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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
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 :
Le var_dump me retourne un 'null'. (pour rappel cette même requête me retournait bien un valeur sous phpMyAdmin.)
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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()); } } }
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)
2. Requête avec sous-requete mais avec un affichage simple
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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
Résultat : KO (var_dump retourne 'null')
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.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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
Merci d'avance,
Partager