Optimiser requêtes api de jeux et gestion bdd

Résolu
Warren37 Messages postés 40 Date d'inscription vendredi 10 juin 2022 Statut Membre Dernière intervention 25 septembre 2023 - Modifié le 24 sept. 2023 à 10:17
Warren37 Messages postés 40 Date d'inscription vendredi 10 juin 2022 Statut Membre Dernière intervention 25 septembre 2023 - 25 sept. 2023 à 16:01

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.

<?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 

} 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
Windows / Firefox 117.0

A voir également:

10 réponses

Warren37 Messages postés 40 Date d'inscription vendredi 10 juin 2022 Statut Membre Dernière intervention 25 septembre 2023 3
Modifié le 24 sept. 2023 à 11:21

J'ai fait une 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.

<?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();
 
?>
0
jordane45 Messages postés 38145 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 25 avril 2024 4 650
24 sept. 2023 à 11:09

Bonjour,

Malheureusement pour toi, si l'api t'oblige à faire différents appels ( dans des boucles) pour récupérer les informations voulues, nous ne pourrons pas y faire grand chose.

Après.. la question à se poser est ... as tu réellement besoin du faire du "temps réel" ?

Perso, si tu as beaucoup de données à récupérer via les api .. moi je ferais en sorte de lancer la récupérer via des tâches crons. ( qui tourneraient une à deux fois par heures par exemple )

Eventuellement, je ferai même une sorte de file d'attente.

Par exemple :

- 1 ere cron : récupération de la liste des membres des clans

je stocke les tag des joureurs à traiter dans une table

- Puis, une cron qui prendrait les X premiers tags dans la table ... et irait chercher les infos des joueurs. ( en supprimant de la file, les tags des joueurs que la cron vient de traiter )

Cette cron pourrait ensuite être lancée toutes les minutes jusqu'à ce qu'il n'y ai plus de tag à traiter

puis retour à la première cron... etc ..etc...

La page de ton site n'aura plus que la partie "affichage" à gérer .. et pas l'import des données.


0
Warren37 Messages postés 40 Date d'inscription vendredi 10 juin 2022 Statut Membre Dernière intervention 25 septembre 2023 3
Modifié le 24 sept. 2023 à 13:17
<?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();
?>

et

<?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)) {
        // Traitement des données du joueur (comme dans votre code d'origine)

        // 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();
?>

Après à priori faut que j'utilise des services en ligne comme cron-job.org, EasyCron pour faire au plus simple... Mais je ne vois pas trop comment ça va s'afficher dans ma page web. Faut que je fasse juste une page php avec la table et les infos qui viennent de la bdd?

0
jordane45 Messages postés 38145 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 25 avril 2024 4 650
24 sept. 2023 à 13:29

Mais je ne vois pas trop comment ça va s'afficher dans ma page web. Faut que je fasse juste une page php avec la table et les infos qui viennent de la bdd?

oui

Au passage, tu pourrais gagner du temps dans ton script en ne faisant pas deux boucles

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) {
$base_url = 'https://api.clashroyale.com/v1/players/';

if ($result->num_rows > 0) {
    while ($row = $result->fetch_assoc()) {
        $player_tag = $row['tag'];
        //ici le code effectué dans ton foreach..
         // 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)) {
        // Traitement des données du joueur (comme dans votre code d'origine)
        
        //-----------------------------------
        //.... il faut stocker les données en bdd non ?
        //-----------------------------------

        // Supprimer le tag traité de la table
        $conn->query("DELETE FROM tags_joueurs WHERE tag = '$player_tag'");
       }



    }
}

0
Warren37 Messages postés 40 Date d'inscription vendredi 10 juin 2022 Statut Membre Dernière intervention 25 septembre 2023 3
24 sept. 2023 à 16:09

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.

0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Warren37 Messages postés 40 Date d'inscription vendredi 10 juin 2022 Statut Membre Dernière intervention 25 septembre 2023 3
Modifié le 24 sept. 2023 à 16:57

j'ai bien les appels et réponse ws/ clans pour mes 2 crons dans trace.log. Et Le code complet de mon 2ème cron est:

<?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();
?>
0
Warren37 Messages postés 40 Date d'inscription vendredi 10 juin 2022 Statut Membre Dernière intervention 25 septembre 2023 3
24 sept. 2023 à 17:01

Ma bdd ne se remplit pas. Help please...

0
jordane45 Messages postés 38145 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 25 avril 2024 4 650
24 sept. 2023 à 18:18

Déjà, ne faire qu'une seul fichier de connexion à ta bdd que tu pourras ensuite utiliser dans tous tes scripts

<?php
// Fichier de connexion à la bdd
// 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) {
    echo "La connexion à la base de données a échoué : " . $conn->connect_error;
    exit;
}else{
  echo " Connexion OK ! "  . PHP_EOL;  // ligne à retirer une fois que tu es sûr que ça marche
}

Bien s'assurer que tu as entré les bonnes informations de connexion à la bdd ( qui ne sont pas les mêmes que celles utilisées en local... voir les infos fournies par ton hébergeur !! )

Tu pourras tester ce script et voir si le message OK s'affiche bien.

Ensuite, dans tes autres codes, tu n'auras qu'à l'inclure

<?php

require_once "chemin/vers/tonFichier/connexion.php";

Puis, pour tes requêtes, il serait bien d'appliquer la forme ci-dessous pour t'assurer qu'elles fonctionnent et ne retournent pas d'erreur

$sql = "SELECT * FROM tags_joueurs LIMIT $max_tags_to_process";

if (!$conn->query($sql)) {
  echo "Erreur : " . $mysqli -> error . PHP_EOL;
  echo "Requête : " . $sql . PHP_EOL;
}

Pense également à activer l'affichage des erreurs PHP au début de chacun de tes scripts...

Voir ici :  https://forums.commentcamarche.net/forum/affich-37584947-php-gestion-des-erreurs-debogage-et-ecriture-du-code


0
Warren37 Messages postés 40 Date d'inscription vendredi 10 juin 2022 Statut Membre Dernière intervention 25 septembre 2023 3
Modifié le 25 sept. 2023 à 09:36

Ok je vais le faire. Mais je précise que si je remplis ma bdd moi même, le résultat s'affiche correctement sur mon site. Le token est le bon et les identifiants sont bons

0
Warren37 Messages postés 40 Date d'inscription vendredi 10 juin 2022 Statut Membre Dernière intervention 25 septembre 2023 3
Modifié le 25 sept. 2023 à 14:31

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...

<?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();
?>
<?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

<?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
// ...

?>
0
Warren37 Messages postés 40 Date d'inscription vendredi 10 juin 2022 Statut Membre Dernière intervention 25 septembre 2023 3
25 sept. 2023 à 16:01

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.

0