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 : 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
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 : 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());
        }
    }
}
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 : 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
2. Requête avec sous-requete mais avec un affichage simple
Résultat : KO (var_dump retourne 'null')
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
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,