IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

PHP & Base de données Discussion :

Optimiser requêtes api de jeux et gestion bdd


Sujet :

PHP & Base de données

  1. #1
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2022
    Messages
    42
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Juin 2022
    Messages : 42
    Par défaut Optimiser requêtes api de jeux et gestion bdd
    Bonjour, je récupère correctement en base de données les noms des joueurs et leur meilleur trophée correspondant du hall des légendes provenant de l'api clash royale. Mais cela est trop long a être rempli du coup le délais d'affichage sur mon site finit par être dépassé. Le problème vient du nombre de requêtes que je suis obligé de faire me semble t-il. Avez-vous une idée pour tenter de résoudre ce problème. Merci d'avance car je suis dans une impasse.
    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
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    <?php
     
    function fetch_data($urls, $token) {
        $multi = curl_multi_init();
        $curl_array = array();
        $result = array();
     
        foreach ($urls as $i => $url) {
            $curl_array[$i] = curl_init($url);
     
            $headr = array();
            $headr[] = "Accept: application/json";
            $headr[] = "Authorization: Bearer " . $token;
     
            curl_setopt($curl_array[$i], CURLOPT_HTTPHEADER, $headr);
            curl_setopt($curl_array[$i], CURLOPT_SSL_VERIFYHOST, false);
            curl_setopt($curl_array[$i], CURLOPT_SSL_VERIFYPEER, false);
            curl_setopt($curl_array[$i], CURLOPT_RETURNTRANSFER, 1);
     
            curl_multi_add_handle($multi, $curl_array[$i]);
        }
     
        $running = null;
        do {
            curl_multi_exec($multi, $running);
        } while ($running > 0);
     
        foreach ($urls as $i => $url) {
            $result[$i] = json_decode(curl_multi_getcontent($curl_array[$i]), true);
            curl_multi_remove_handle($multi, $curl_array[$i]);
        }
     
        curl_multi_close($multi);
        return $result;
    }
     
    $token = ""; 
     
    // Configuration de la base de données
    $servername = "localhost";
    $username = "";
    $password = "";
    $dbname = "";
     
    // Créer une connexion à la base de données
    $conn = new mysqli($servername, $username, $password, $dbname);
     
    // Vérifier la connexion
    if ($conn->connect_error) {
        die("La connexion à la base de données a échoué : " . $conn->connect_error);
    }
     
    // URL de base pour obtenir les données des joueurs
    $base_url = 'https://api.clashroyale.com/v1/players/';
     
    // Liste des tags des clans
    $clan_tags = array('#clantag1', '#clantag2', '#clantag3', '#clantag4');
     
    // Liste des tags des joueurs des 4 clans
    $player_tags = array();
     
    // Boucle à travers chaque clan pour obtenir les tags des joueurs
    foreach ($clan_tags as $clan_tag) {
        // Construire l'URL complète pour obtenir les données du clan
        $clan_url = 'https://api.clashroyale.com/v1/clans/' . urlencode($clan_tag);
     
        // Effectuer la requête Curl pour obtenir les données du clan
        $clan_data = fetch_data(array($clan_url), $token);
     
        // Assurez-vous que les données du clan sont valides
        if (!empty($clan_data) && isset($clan_data[0]['memberList'])) {
            $member_list = $clan_data[0]['memberList'];
     
            // Boucle à travers la liste des membres pour obtenir les tags des joueurs
            foreach ($member_list as $member) {
                $player_tag = $member['tag'];
                $player_tags[] = $player_tag;
            }
        }
    }
     
    // Boucle à travers chaque joueur
    foreach ($player_tags as $player_tag) {
        // Construire l'URL complète pour chaque joueur
        $player_url = $base_url . urlencode($player_tag);
     
        // Effectuer la requête Curl pour obtenir les données du joueur
        $player_data = fetch_data(array($player_url), $token);
     
        // Assurez-vous que les données du joueur sont valides
        if (!empty($player_data) && isset($player_data[0])) {
            $player_info = $player_data[0];
     
            // Vérifiez si la clé "bestPathOfLegendSeasonResult" existe
            if (isset($player_info['bestPathOfLegendSeasonResult'])) {
                $bestPathOfLegendSeasonResult = $player_info['bestPathOfLegendSeasonResult'];
     
                // Vérifiez si la clé "trophies" existe et que les trophées sont différents de zéro
                if (isset($bestPathOfLegendSeasonResult['trophies']) && $bestPathOfLegendSeasonResult['trophies'] != 0) {
                    $new_trophies = $bestPathOfLegendSeasonResult['trophies'];
     
                    // Vérifiez d'abord si le joueur existe déjà en base de données
                    $player_name = isset($player_info['name']) ? mysqli_real_escape_string($conn, $player_info['name']) : 'N/A';
                    $check_sql = "SELECT * FROM joueurs WHERE nom = '$player_name'";
                    $check_result = $conn->query($check_sql);
     
                    if ($check_result->num_rows > 0) {
                        // Le joueur existe déjà en base de données, vérifiez si les trophées ont changé
                        $existing_player = $check_result->fetch_assoc();
                        $existing_trophies = $existing_player['trophées'];
     
                        if ($existing_trophies != $new_trophies) {
                            // Les trophées ont changé, mettez à jour la valeur en base de données
                            $update_sql = "UPDATE joueurs SET trophées = '$new_trophies' WHERE nom = '$player_name'";
                            if ($conn->query($update_sql) === FALSE) {
                                echo "Erreur lors de la mise à jour des données du joueur : " . $conn->error;
                            }
                        }
                    } else {
                        // Le joueur n'existe pas encore en base de données, insérez-le
                        $insert_sql = "INSERT INTO joueurs (nom, trophées) VALUES ('$player_name', '" . mysqli_real_escape_string($conn, $new_trophies) . "')";
                        if ($conn->query($insert_sql) === FALSE) {
                            echo "Erreur lors de l'insertion des données du joueur : " . $conn->error;
                        }
                    }
                }
            } else {
                // Le joueur n'a pas de données de trophées ou elles sont à zéro
                // Vous pouvez ajouter une logique ici pour gérer ces cas, si nécessaire
            }
        }
    }
     
    // Suppression des joueurs qui ne sont plus membres d'un clan
    $delete_sql = "DELETE FROM joueurs WHERE nom NOT IN (SELECT DISTINCT nom FROM joueurs)";
    if ($conn->query($delete_sql) === FALSE) {
        echo "Erreur lors de la suppression des joueurs non membres de clans : " . $conn->error;
    }
     
    // Fermer la connexion à la base de données
    $conn->close();
     
    ?>
    Sur ma page web ça bloque à la ligne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    } while ($running > 0);
    avec le message
    Fatal error: Maximum execution time of 120 seconds exceeded in C:\xampp\htdocs\***** - PHP\scriptcrfullpathlegend.php on line 26

  2. #2
    Expert confirmé
    Avatar de Séb.
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    5 313
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 313
    Billets dans le blog
    17
    Par défaut
    fetch_data() prévoit de lancer des requêtes en parallèle, mais les appels à fetch_data() contiennent toujours un tableau de 1 élément
    D'ailleurs en retour tu n'exploites que le 1er élément obtenu et ignore les éventuels suivants
    => Le curl_multi_init() de fetch_data() est inutile, la complexité induite pourrait donc être évitée

    Là comme ça, je ne vois rien d'anormal (mais je suis loin de maîtriser cURL).
    Si tu pouvais générer un nouveau jeton API pour test et me l'envoyer en message privé, je pourrais reproduire la situation et peut-être apporter une solution.

  3. #3
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2022
    Messages
    42
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Juin 2022
    Messages : 42
    Par défaut
    J'ai fait la modification. Je récupère bien les informations en base de données mais le site mouline. Quand j'ai 4 tag de clan ça mouline jusqu'à dépasser le temps imparti. Si je mets qu'un tagclan, pas d'erreur sur ma page web mais le site mouline pour afficher les infos. Et ça m'embête de générer un jeton api et de le passer. L'api est gratuite si vous voulez la tester.
    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
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    <?php
     
    function fetch_data($url, $token) {
        $curl = curl_init($url);
     
        $headers = array(
            "Accept: application/json",
            "Authorization: Bearer " . $token,
        );
     
        curl_setopt($curl, CURLOPT_HTTPHEADER, $headers);
        curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, false);
        curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false);
        curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
     
        $result = curl_exec($curl);
     
        if (curl_errno($curl)) {
            // Gérer les erreurs Curl ici si nécessaire
            echo "Erreur Curl : " . curl_error($curl);
        }
     
        curl_close($curl);
     
        return json_decode($result, true);
    }
     
    $token = ""; // Remplacez par votre token
     
    // Configuration de la base de données
    $servername = "localhost";
    $username = "";
    $password = "";
    $dbname = "";
     
     
    // Créer une connexion à la base de données
    $conn = new mysqli($servername, $username, $password, $dbname);
     
    // Vérifier la connexion
    if ($conn->connect_error) {
        die("La connexion à la base de données a échoué : " . $conn->connect_error);
    }
     
    // URL de base pour obtenir les données des joueurs
    $base_url = 'https://api.clashroyale.com/v1/players/';
     
    // Liste des tags des clans
    $clan_tags = array('#tagclan1');
     
    // Liste des tags des joueurs des 4 clans
    $player_tags = array();
     
    // Boucle à travers chaque clan pour obtenir les tags des joueurs
    foreach ($clan_tags as $clan_tag) {
        // Construire l'URL complète pour obtenir les données du clan
        $clan_url = 'https://api.clashroyale.com/v1/clans/' . urlencode($clan_tag);
     
        // Effectuer la requête Curl pour obtenir les données du clan
        $clan_data = fetch_data($clan_url, $token);
     
        // Assurez-vous que les données du clan sont valides
        if (!empty($clan_data) && isset($clan_data['memberList'])) {
            $member_list = $clan_data['memberList'];
     
            // Boucle à travers la liste des membres pour obtenir les tags des joueurs
            foreach ($member_list as $member) {
                $player_tag = $member['tag'];
                $player_tags[] = $player_tag;
            }
        }
    }
     
    // Boucle à travers chaque joueur
    foreach ($player_tags as $player_tag) {
        // Construire l'URL complète pour chaque joueur
        $player_url = $base_url . urlencode($player_tag);
     
        // Effectuer la requête Curl pour obtenir les données du joueur
        $player_data = fetch_data($player_url, $token);
     
        // Assurez-vous que les données du joueur sont valides
        if (!empty($player_data)) {
            $player_info = $player_data;
     
            // Vérifiez si la clé "bestPathOfLegendSeasonResult" existe
            if (isset($player_info['bestPathOfLegendSeasonResult'])) {
                $bestPathOfLegendSeasonResult = $player_info['bestPathOfLegendSeasonResult'];
     
                // Vérifiez si la clé "trophies" existe et que les trophées sont différents de zéro
                if (isset($bestPathOfLegendSeasonResult['trophies']) && $bestPathOfLegendSeasonResult['trophies'] != 0) {
                    $new_trophies = $bestPathOfLegendSeasonResult['trophies'];
     
                    // Vérifiez d'abord si le joueur existe déjà en base de données
                    $player_name = isset($player_info['name']) ? mysqli_real_escape_string($conn, $player_info['name']) : 'N/A';
                    $check_sql = "SELECT * FROM joueurs WHERE nom = '$player_name'";
                    $check_result = $conn->query($check_sql);
     
                    if ($check_result->num_rows > 0) {
                        // Le joueur existe déjà en base de données, vérifiez si les trophées ont changé
                        $existing_player = $check_result->fetch_assoc();
                        $existing_trophies = $existing_player['trophées'];
     
                        if ($existing_trophies != $new_trophies) {
                            // Les trophées ont changé, mettez à jour la valeur en base de données
                            $update_sql = "UPDATE joueurs SET trophées = '$new_trophies' WHERE nom = '$player_name'";
                            if ($conn->query($update_sql) === FALSE) {
                                echo "Erreur lors de la mise à jour des données du joueur : " . $conn->error;
                            }
                        }
                    } else {
                        // Le joueur n'existe pas encore en base de données, insérez-le
                        $insert_sql = "INSERT INTO joueurs (nom, trophées) VALUES ('$player_name', '" . mysqli_real_escape_string($conn, $new_trophies) . "')";
                        if ($conn->query($insert_sql) === FALSE) {
                            echo "Erreur lors de l'insertion des données du joueur : " . $conn->error;
                        }
                    }
                }
            } else {
                // Le joueur n'a pas de données de trophées ou elles sont à zéro
                // Vous pouvez ajouter une logique ici pour gérer ces cas, si nécessaire
            }
        }
    }
     
    // Suppression des joueurs qui ne sont plus membres d'un clan
    $delete_sql = "DELETE FROM joueurs WHERE nom NOT IN (SELECT DISTINCT nom FROM joueurs)";
    if ($conn->query($delete_sql) === FALSE) {
        echo "Erreur lors de la suppression des joueurs non membres de clans : " . $conn->error;
    }
     
     
    // Sélectionner les données des joueurs depuis la base de données, triées par trophées décroissants
    $sql = "SELECT nom, trophées FROM joueurs ORDER BY trophées DESC";
    $result = $conn->query($sql);
     
    // Vérifier si des données ont été trouvées
    if ($result->num_rows > 0) {
        echo '<table>';
        echo '<tr><th>Nom</th><th>Trophées</th></tr>';
     
        // Afficher les données dans un tableau
        while ($row = $result->fetch_assoc()) {
            echo '<tr>';
            echo '<td>' . $row['nom'] . '</td>';
            echo '<td>' . $row['trophées'] . '</td>';
            echo '</tr>';
        }
     
        echo '</table>';
    } else {
        echo "Aucune donnée de joueur trouvée.";
    }
     
    // Fermer la connexion à la base de données
    $conn->close();
     
    ?>

  4. #4
    Expert confirmé
    Avatar de Séb.
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    5 313
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 313
    Billets dans le blog
    17
    Par défaut
    Quand j'ai 4 tag de clan ça mouline jusqu'à dépasser le temps imparti
    Ça mouline/bloque à quel niveau maintenant ?
    La page peut ne rien afficher à cause de mécanismes de mise en tampon ou d'une erreur qui serait cachée (voir log des erreurs).
    Tu peux laisser une trace horodatée dans un fichier pour voir exactement ce qui est exécuté.
    Peut-être simplement le WS qui limite le nombre de requêtes à la seconde.

    function log_trace($message)
    {
        file_put_contents(
            __DIR__ . '/trace.log',
            sprintf("[%s] %s\r\n", date('Y-m-d H:i:s.u'), $message),
            FILE_APPEND,
        );
    }
    Ex. :

    log_trace('Appel au WS /clans');
    $clan_data = fetch_data($clan_url, $token);
    log_trace('Réponse du WS /clans');



    Concernant le jeton de test, pas de soucis, je comprends, mais il ne faudra pas t'attendre à ce que je m'inscrive sur un site tiers pour faire des tests

  5. #5
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2022
    Messages
    42
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Juin 2022
    Messages : 42
    Par défaut
    Donc les infos s'affichent bien sur mon site web. J'avais oublié de recopier la création de table que j'ai mis à jour ci dessus. Mais le site mouline toujours pour actualiser.

  6. #6
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2022
    Messages
    42
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Juin 2022
    Messages : 42
    Par défaut
    Donc la bdd ne se remplit pas avec les crons que j'ai fait. Quand j'ai transféré ma bdd en ligne sur hostinger, le résultat s'est affiché sur ma page web, mais si je la vide, elle ne se reconstruit pas. Merci déjà pour les infos.
    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
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    <?php
    // Inclure les fonctions fetch_data et log_trace ici (comme dans votre code d'origine).
    function fetch_data($url, $token) {
        $curl = curl_init($url);
     
        $headers = array(
            "Accept: application/json",
            "Authorization: Bearer " . $token,
        );
     
        curl_setopt($curl, CURLOPT_HTTPHEADER, $headers);
        curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, false);
        curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false);
        curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
     
        $result = curl_exec($curl);
     
        if (curl_errno($curl)) {
            // Gérer les erreurs Curl ici si nécessaire
            echo "Erreur Curl : " . curl_error($curl);
        }
     
        curl_close($curl);
     
        return json_decode($result, true);
    }
     
    function log_trace($message) {
        file_put_contents(
            __DIR__ . '/trace.log',
            sprintf("[%s] %s\r\n", date('Y-m-d H:i:s.u'), $message),
            FILE_APPEND
        );
    }
     
    $token = ""; // Remplacez par votre token
     
    // Configuration de la base de données
    $servername = "localhost";
    $username = "";
    $password = "";
    $dbname = "";
     
    // Créer une connexion à la base de données
    $conn = new mysqli($servername, $username, $password, $dbname);
     
    // Vérifier la connexion
    if ($conn->connect_error) {
        die("La connexion à la base de données a échoué : " . $conn->connect_error);
    }
     
    // URL de base pour obtenir les données des joueurs
    $base_url = 'https://api.clashroyale.com/v1/players/';
     
    // Liste des tags des clans
    $clan_tags = array('#tagclan1', '#tagclan2', '#tagclan3', '#tagclan4');
     
    // Liste des tags des joueurs des 4 clans
    $player_tags = array();
     
    // Boucle à travers chaque clan pour obtenir les tags des joueurs
    foreach ($clan_tags as $clan_tag) {
        // Construire l'URL complète pour obtenir les données du clan
        $clan_url = 'https://api.clashroyale.com/v1/clans/' . urlencode($clan_tag);
     
        log_trace('Appel au WS /clans'); // Journalisation de l'appel au WS /clans
        $clan_data = fetch_data($clan_url, $token);
        log_trace('Réponse du WS /clans'); // Journalisation de la réponse du WS /clans
     
        // Effectuer la requête Curl pour obtenir les données du clan
        $clan_data = fetch_data($clan_url, $token);
     
        // Assurez-vous que les données du clan sont valides
        if (!empty($clan_data) && isset($clan_data['memberList'])) {
            $member_list = $clan_data['memberList'];
     
            // Boucle à travers la liste des membres pour obtenir les tags des joueurs
            foreach ($member_list as $member) {
                $player_tag = $member['tag'];
                $player_tags[] = $player_tag;
            }
        }
    }
     
    // Insérer les tags des joueurs dans une table
    if (!empty($player_tags)) {
        // Supprimer les tags précédents de la table (pour éviter les doublons)
        $conn->query("TRUNCATE TABLE tags_joueurs");
     
        // Insérer les nouveaux tags
        foreach ($player_tags as $player_tag) {
            $conn->query("INSERT INTO tags_joueurs (tag) VALUES ('$player_tag')");
        }
    }
     
    // Fermer la connexion à la base de données
    $conn->close();
    ?>
    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
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    <?php
    // Inclure les fonctions fetch_data et log_trace ici (comme dans votre code d'origine).
    function fetch_data($url, $token) {
        $curl = curl_init($url);
     
        $headers = array(
            "Accept: application/json",
            "Authorization: Bearer " . $token,
        );
     
        curl_setopt($curl, CURLOPT_HTTPHEADER, $headers);
        curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, false);
        curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false);
        curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
     
        $result = curl_exec($curl);
     
        if (curl_errno($curl)) {
            // Gérer les erreurs Curl ici si nécessaire
            echo "Erreur Curl : " . curl_error($curl);
        }
     
        curl_close($curl);
     
        return json_decode($result, true);
    }
     
    function log_trace($message) {
        file_put_contents(
            __DIR__ . '/trace.log',
            sprintf("[%s] %s\r\n", date('Y-m-d H:i:s.u'), $message),
            FILE_APPEND
        );
    }
     
    $token = ""; // Remplacez par votre token
     
    // Configuration de la base de données
    $servername = "localhost";
    $username = "";
    $password = "";
    $dbname = "";
     
    // Créer une connexion à la base de données
    $conn = new mysqli($servername, $username, $password, $dbname);
     
    // Vérifier la connexion
    if ($conn->connect_error) {
        die("La connexion à la base de données a échoué : " . $conn->connect_error);
    }
     
    // Récupérer les X premiers tags des joueurs à traiter depuis la table
    $max_tags_to_process = 25; // Remplacez X par le nombre souhaité
    $tags_to_process = array();
     
    $result = $conn->query("SELECT * FROM tags_joueurs LIMIT $max_tags_to_process");
     
    if ($result->num_rows > 0) {
        while ($row = $result->fetch_assoc()) {
            $tags_to_process[] = $row['tag'];
        }
    }
     
    // Boucle à travers les tags à traiter
    foreach ($tags_to_process as $player_tag) {
        // Construire l'URL complète pour chaque joueur
        $base_url = 'https://api.clashroyale.com/v1/players/';
        $player_url = $base_url . urlencode($player_tag);
     
        // Effectuer la requête Curl pour obtenir les données du joueur
        $player_data = fetch_data($player_url, $token);
     
        // Assurez-vous que les données du joueur sont valides
        if (!empty($player_data)) {
            $player_info = $player_data;
     
            // Vérifiez si la clé "bestPathOfLegendSeasonResult" existe
            if (isset($player_info['bestPathOfLegendSeasonResult'])) {
                $bestPathOfLegendSeasonResult = $player_info['bestPathOfLegendSeasonResult'];
     
                // Vérifiez si la clé "trophies" existe et que les trophées sont différents de zéro
                if (isset($bestPathOfLegendSeasonResult['trophies']) && $bestPathOfLegendSeasonResult['trophies'] != 0) {
                    $new_trophies = $bestPathOfLegendSeasonResult['trophies'];
     
                    // Vérifiez d'abord si le joueur existe déjà en base de données
                    $player_name = isset($player_info['name']) ? mysqli_real_escape_string($conn, $player_info['name']) : 'N/A';
                    $check_sql = "SELECT * FROM joueurs WHERE nom = '$player_name'";
                    $check_result = $conn->query($check_sql);
     
                    if ($check_result->num_rows > 0) {
                        // Le joueur existe déjà en base de données, vérifiez si les trophées ont changé
                        $existing_player = $check_result->fetch_assoc();
                        $existing_trophies = $existing_player['trophées'];
     
                        if ($existing_trophies != $new_trophies) {
                            // Les trophées ont changé, mettez à jour la valeur en base de données
                            $update_sql = "UPDATE joueurs SET trophées = '$new_trophies' WHERE nom = '$player_name'";
                            if ($conn->query($update_sql) === FALSE) {
                                echo "Erreur lors de la mise à jour des données du joueur : " . $conn->error;
                            }
                        }
                    } else {
                        // Le joueur n'existe pas encore en base de données, insérez-le
                        $insert_sql = "INSERT INTO joueurs (nom, trophées) VALUES ('$player_name', '" . mysqli_real_escape_string($conn, $new_trophies) . "')";
                        if ($conn->query($insert_sql) === FALSE) {
                            echo "Erreur lors de l'insertion des données du joueur : " . $conn->error;
                        }
                    }
                }
            } else {
                // Le joueur n'a pas de données de trophées ou elles sont à zéro
                // Vous pouvez ajouter une logique ici pour gérer ces cas, si nécessaire
            }
     
            // Supprimer le tag traité de la table
            $conn->query("DELETE FROM tags_joueurs WHERE tag = '$player_tag'");
        }
    }
     
    // Fermer la connexion à la base de données
    $conn->close();
    ?>
    j'ai bien les appels et réponse ws/ clans pour mes 2 crons dans trace.log

  7. #7
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2022
    Messages
    42
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Juin 2022
    Messages : 42
    Par défaut
    Ma bdd ne se remplit pas. Help please...

  8. #8
    Expert confirmé
    Avatar de Séb.
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    5 313
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 313
    Billets dans le blog
    17
    Par défaut
    Ça mouline
    Rien ne s'affiche
    La base reste vide

    As-tu procédé au débugage comme préconisé ?

  9. #9
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2022
    Messages
    42
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Juin 2022
    Messages : 42
    Par défaut
    Donc maintenant j'ai créé deux tâches crons sur hostinger. 2 bash.sh appellent mes 2 fichiers .php. Je précise que j'ai testé ces 2 fichiers .php en insérant leur lien directement dans ma page html. La base de données se remplit alors correctement. (Et ensuite avec un autre fichier .php, je récupère les résultats sur ma page web.)

    Quand je les utilise comme crons sur hostinger, la base de données ne se remplit pas...
    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
    60
    61
    62
    63
    64
    65
    66
    67
    68
    <?php
     
    error_reporting(E_ALL);
    ini_set('display_errors', 1);
     
    include_once 'fonctions_partagees.php'; // Inclusion des fonctions partagées
     
    $token = ""; // Remplacez par votre token
     
    // Configuration de la base de données
    $servername = "localhost";
    $username = "";
    $password = "";
    $dbname = "";
     
    // Créer une connexion à la base de données
    $conn = new mysqli($servername, $username, $password, $dbname);
     
    // Vérifier la connexion
    if ($conn->connect_error) {
        die("La connexion à la base de données a échoué : " . $conn->connect_error);
    }
     
    // URL de base pour obtenir les données des joueurs
    $base_url = 'https://api.clashroyale.com/v1/players/';
     
    // Liste des tags des clans
    $clan_tags = array('#tagclan1', '#tagclan2', '#tagclan3', '#tagclan4');
     
    // Liste des tags des joueurs des 4 clans
    $player_tags = array();
     
    // Boucle à travers chaque clan pour obtenir les tags des joueurs
    foreach ($clan_tags as $clan_tag) {
        // Construire l'URL complète pour obtenir les données du clan
        $clan_url = 'https://api.clashroyale.com/v1/clans/' . urlencode($clan_tag);
     
        log_trace('Appel au WS /clans'); // Journalisation de l'appel au WS /clans
        // Effectuer la requête Curl pour obtenir les données du clan
        $clan_data = fetch_data($clan_url, $token);
        log_trace('Réponse du WS /clans'); // Journalisation de la réponse du WS /clans
     
        // Assurez-vous que les données du clan sont valides
        if (!empty($clan_data) && isset($clan_data['memberList'])) {
            $member_list = $clan_data['memberList'];
     
            // Boucle à travers la liste des membres pour obtenir les tags des joueurs
            foreach ($member_list as $member) {
                $player_tag = $member['tag'];
                $player_tags[] = $player_tag;
            }
        }
    }
     
    // Insérer les tags des joueurs dans une table
    if (!empty($player_tags)) {
        // Supprimer les tags précédents de la table (pour éviter les doublons)
        $conn->query("TRUNCATE TABLE tags_joueurs");
     
        // Insérer les nouveaux tags
        foreach ($player_tags as $player_tag) {
            $conn->query("INSERT INTO tags_joueurs (tag) VALUES ('$player_tag')");
        }
    }
     
    // Fermer la connexion à la base de données
    $conn->close();
    ?>
    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
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    <?php
     
    error_reporting(E_ALL);
    ini_set('display_errors', 1);
     
    include_once 'fonctions_partagees.php'; // Inclusion des fonctions partagées
     
    $token = ""; // Remplacez par votre token
     
    // Configuration de la base de données
    $servername = "localhost";
    $username = "";
    $password = "";
    $dbname = "";
     
    // Créer une connexion à la base de données
    $conn = new mysqli($servername, $username, $password, $dbname);
     
    // Vérifier la connexion
    if ($conn->connect_error) {
        die("La connexion à la base de données a échoué : " . $conn->connect_error);
    }
     
    // Récupérer les X premiers tags des joueurs à traiter depuis la table
    $max_tags_to_process = 200; // Remplacez X par le nombre souhaité
    $tags_to_process = array();
     
    $result = $conn->query("SELECT * FROM tags_joueurs LIMIT $max_tags_to_process");
     
    if ($result->num_rows > 0) {
        while ($row = $result->fetch_assoc()) {
            $tags_to_process[] = $row['tag'];
        }
    }
     
    // Boucle à travers les tags à traiter
    foreach ($tags_to_process as $player_tag) {
        // Construire l'URL complète pour chaque joueur
        $base_url = 'https://api.clashroyale.com/v1/players/';
        $player_url = $base_url . urlencode($player_tag);
     
        log_trace('Appel au WS /players'); // Journalisation de l'appel au WS /players
        // Effectuer la requête Curl pour obtenir les données du joueur
    $player_data = fetch_data($player_url, $token);
    log_trace('Réponse du WS /players'); // Journalisation de la réponse du WS /players
     
        // Assurez-vous que les données du joueur sont valides
        if (!empty($player_data)) {
            $player_info = $player_data;
     
            // Vérifiez si la clé "bestPathOfLegendSeasonResult" existe
            if (isset($player_info['bestPathOfLegendSeasonResult'])) {
                $bestPathOfLegendSeasonResult = $player_info['bestPathOfLegendSeasonResult'];
     
                // Vérifiez si la clé "trophies" existe et que les trophées sont différents de zéro
                if (isset($bestPathOfLegendSeasonResult['trophies']) && $bestPathOfLegendSeasonResult['trophies'] != 0) {
                    $new_trophies = $bestPathOfLegendSeasonResult['trophies'];
     
                    // Vérifiez d'abord si le joueur existe déjà en base de données
                    $player_name = isset($player_info['name']) ? mysqli_real_escape_string($conn, $player_info['name']) : 'N/A';
                    $check_sql = "SELECT * FROM joueurs WHERE nom = '$player_name'";
                    $check_result = $conn->query($check_sql);
     
                    if ($check_result->num_rows > 0) {
                        // Le joueur existe déjà en base de données, vérifiez si les trophées ont changé
                        $existing_player = $check_result->fetch_assoc();
                        $existing_trophies = $existing_player['trophées'];
     
                        if ($existing_trophies != $new_trophies) {
                            // Les trophées ont changé, mettez à jour la valeur en base de données
                            $update_sql = "UPDATE joueurs SET trophées = '$new_trophies' WHERE nom = '$player_name'";
                            if ($conn->query($update_sql) === FALSE) {
                                echo "Erreur lors de la mise à jour des données du joueur : " . $conn->error;
                            }
                        }
                    } else {
                        // Le joueur n'existe pas encore en base de données, insérez-le
                        $insert_sql = "INSERT INTO joueurs (nom, trophées) VALUES ('$player_name', '" . mysqli_real_escape_string($conn, $new_trophies) . "')";
                        if ($conn->query($insert_sql) === FALSE) {
                            echo "Erreur lors de l'insertion des données du joueur : " . $conn->error;
                        }
                    }
                }
            } else {
                // Le joueur n'a pas de données de trophées ou elles sont à zéro
                // Vous pouvez ajouter une logique ici pour gérer ces cas, si nécessaire
            }
     
            // Supprimer le tag traité de la table
            $conn->query("DELETE FROM tags_joueurs WHERE tag = '$player_tag'");
        }
    }
     
    // Fermer la connexion à la base de données
    $conn->close();
    ?>
    Et la page fonctions_partagees.php
    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
    <?php
    function fetch_data($url, $token) {
        $curl = curl_init($url);
     
        $headers = array(
            "Accept: application/json",
            "Authorization: Bearer " . $token,
        );
     
        curl_setopt($curl, CURLOPT_HTTPHEADER, $headers);
        curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, false);
        curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false);
        curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
     
        $result = curl_exec($curl);
     
        if (curl_errno($curl)) {
            // Gérer les erreurs Curl ici si nécessaire
            echo "Erreur Curl : " . curl_error($curl);
        }
     
        curl_close($curl);
     
        return json_decode($result, true);
    }
     
    function log_trace($message) {
        file_put_contents(
            __DIR__ . '/trace.log',
            sprintf("[%s] %s\r\n", date('Y-m-d H:i:s.u'), $message),
            FILE_APPEND
        );
    }
     
    // Autres fonctions partagées si nécessaire
    // ...
     
    ?>

  10. #10
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2022
    Messages
    42
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Juin 2022
    Messages : 42
    Par défaut
    Sujet résolu. Je n'avais pas changé l'adresse du proxy pour l'api En local c'est une autre adresse. Tout marche, tout baigne.

Discussions similaires

  1. optimisation: requête bdd ou $_SERVER
    Par aze555666 dans le forum Langage
    Réponses: 3
    Dernier message: 10/08/2012, 19h57
  2. [ Optimisation ] Requête, parametrages BDD
    Par onipif dans le forum MS SQL Server
    Réponses: 9
    Dernier message: 27/10/2006, 15h44
  3. Gestion bdd en intranet
    Par Furox dans le forum C++
    Réponses: 1
    Dernier message: 19/07/2005, 08h11
  4. optimisation requête
    Par alex2205 dans le forum Décisions SGBD
    Réponses: 5
    Dernier message: 09/02/2005, 14h15
  5. optimisation requête SQL!!! help!!
    Par anathem62 dans le forum Requêtes
    Réponses: 2
    Dernier message: 24/05/2004, 16h26

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo