requete spéciale?

Répondre


Cette question est un moyen d’empêcher des soumissions automatisées de formulaires par des robots.
Smileys
:D :) :( :o :shock: :? 8-) :lol: :x :P :oops: :cry: :evil: :twisted: :roll: :wink: :!: :?: :idea: :arrow: :| :mrgreen: =D> #-o =P~ :^o :non: :priere: 8-|
Voir plus de smileys
  Revue du sujet
 

  Étendre la vue Revue du sujet : requete spéciale?

Re: requete spéciale?

par nestor94 » 28 nov. 2023, 15:21

Ok, je vois.
En fait, dans mon exemple, les coordonnées des tiles démarrent de '58.60' à '62.60' car elles sont extraites d'une map globale,...

Re: requete spéciale?

par ynx » 28 nov. 2023, 13:30

Dans l'exemple que j'ai proposé, les coordonnées des tiles doivent être uniques.
La première tile en haut à gauche doit avoir les coordonnées pos_x=0 et pos_y=0, la suivante pos_x=0 et pos_y=1, etc.

Exemple de données attendus avec mon exemple :
<?php

const TILE_WIDTH = 40;
const TILE_HEIGHT = 40;

$tiles = [
		['tile' => 'https://picsum.photos/40/40?random=1', 'pos_x' => 0, 'pos_y' => 0],
		['tile' => 'https://picsum.photos/40/40?random=2', 'pos_x' => 0, 'pos_y' => 1],
		['tile' => 'https://picsum.photos/40/40?random=3', 'pos_x' => 0, 'pos_y' => 2],
		['tile' => 'https://picsum.photos/40/40?random=4', 'pos_x' => 1, 'pos_y' => 0],
		['tile' => 'https://picsum.photos/40/40?random=5', 'pos_x' => 1, 'pos_y' => 1],
		['tile' => 'https://picsum.photos/40/40?random=6', 'pos_x' => 1, 'pos_y' => 2],
		['tile' => 'https://picsum.photos/40/40?random=7', 'pos_x' => 2, 'pos_y' => 0],
		['tile' => 'https://picsum.photos/40/40?random=8', 'pos_x' => 2, 'pos_y' => 1],
		['tile' => 'https://picsum.photos/40/40?random=9', 'pos_x' => 2, 'pos_y' => 2],
	];

?>
<h1>Test</h1>

<?php if (empty($tiles)) : // on vérifie si le tableau $tiles (avec un s) est vide ?>

    <p>Pas de tiles !</p>

<?php else : ?>

    <div style="position: relative;">

        <?php foreach ($tiles as $tile) : // pour chaque "tile" dans le tableau $tiles ?>
            <img src="<?= $tile['tile'] ?>" 
                style="position: absolute; top: <?= $tile['pos_x'] * TILE_WIDTH ?>px; left: <?= $tile['pos_y'] * TILE_HEIGHT ?>px;" 
                alt="">
        <?php endforeach; ?>

    </div>

<?php endif; ?>

Ce qui génère le code html suivant où chaque image est bien positionné en fonction des coordonnées :
<h1>Test</h1>

<div style="position: relative;">

  <img src="https://picsum.photos/40/40?random=1" style="position: absolute; top: 0px; left: 0px;" alt="">
  <img src="https://picsum.photos/40/40?random=2" style="position: absolute; top: 0px; left: 40px;" alt="">
  <img src="https://picsum.photos/40/40?random=3" style="position: absolute; top: 0px; left: 80px;" alt="">
  <img src="https://picsum.photos/40/40?random=4" style="position: absolute; top: 40px; left: 0px;" alt="">
  <img src="https://picsum.photos/40/40?random=5" style="position: absolute; top: 40px; left: 40px;" alt="">
  <img src="https://picsum.photos/40/40?random=6" style="position: absolute; top: 40px; left: 80px;" alt="">
  <img src="https://picsum.photos/40/40?random=7" style="position: absolute; top: 80px; left: 0px;" alt="">
  <img src="https://picsum.photos/40/40?random=8" style="position: absolute; top: 80px; left: 40px;" alt="">
  <img src="https://picsum.photos/40/40?random=9" style="position: absolute; top: 80px; left: 80px;" alt="">

</div>
https://jsfiddle.net/z6nsxve4/

Il faudrait revoir tes données et/ou apporter plus de précision car je ne comprends pas pourquoi tes tiles n'ont pas de coordonnées uniques.

Re: requete spéciale?

par or 1 » 27 nov. 2023, 20:57

Re: requete spéciale?

par nestor94 » 27 nov. 2023, 20:15

Alors, à l'affichage je n'ai que le nom du pays.
le "print_r" m'affiche bien le nom des tiles avec leurs coordonnées.

Array ( [0] => Array ( [tile] => /relief/tile_plage.gif [0] => /relief/tile_plage.gif [pos_x] => 60 [1] => 60 [pos_y] => 61 [2] => 61 ) [1] => Array ( [tile] => /relief/tile_peage.gif [0] => /relief/tile_peage.gif [pos_x] => 60 [1] => 60 [pos_y] => 60 [2] => 60 ) [2] => Array ( [tile] => /relief/tile_prairie.gif [0] => /relief/tile_prairie.gif [pos_x] => 61 [1] => 61 [pos_y] => 61 [2] => 61 ) [3] => Array ( [tile] => /relief/tile_prairie.gif [0] => /relief/tile_prairie.gif [pos_x] => 62 [1] => 62 [pos_y] => 60 [2] => 60 ) [4] => Array ( [tile] => /relief/tile_rocher.gif [0] => /relief/tile_rocher.gif [pos_x] => 62 [1] => 62 [pos_y] => 61 [2] => 61 ) [5] => Array ( [tile] => /relief/tile_mer_hiver.gif [0] => /relief/tile_mer_hiver.gif [pos_x] => 59 [1] => 59 [pos_y] => 62 [2] => 62 ) [6] => Array ( [tile] => /relief/tile_mer_hiver.gif [0] => /relief/tile_mer_hiver.gif [pos_x] => 60 [1] => 60 [pos_y] => 62 [2] => 62 ) [7] => Array ( [tile] => /relief/tile_plage.gif [0] => /relief/tile_plage.gif [pos_x] => 59 [1] => 59 [pos_y] => 61 [2] => 61 ) [8] => Array ( [tile] => /relief/tile_poste_frontiere.gif [0] => /relief/tile_poste_frontiere.gif [pos_x] => 58 [1] => 58 [pos_y] => 60 [2] => 60 ) [9] => Array ( [tile] => /relief/tile_chemin.gif [0] => /relief/tile_chemin.gif [pos_x] => 59 [1] => 59 [pos_y] => 60 [2] => 60 ) [10] => Array ( [tile] => /relief/tile_mer_hiver.gif [0] => /relief/tile_mer_hiver.gif [pos_x] => 58 [1] => 58 [pos_y] => 62 [2] => 62 ) [11] => Array ( [tile] => /relief/tile_poste_frontiere.gif [0] => /relief/tile_poste_frontiere.gif [pos_x] => 58 [1] => 58 [pos_y] => 61 [2] => 61 ) [12] => Array ( [tile] => /relief/tile_mer_hiver.gif [0] => /relief/tile_mer_hiver.gif [pos_x] => 62 [1] => 62 [pos_y] => 62 [2] => 62 ) [13] => Array ( [tile] => /relief/tile_grue_chantier.gif [0] => /relief/tile_grue_chantier.gif [pos_x] => 61 [1] => 61 [pos_y] => 62 [2] => 62 ) )


le code source (clic droit sur la page ) affiche ceci....
<h1>JAWHA</h1>


     <div style="position: relative;">

                    <img src="/relief/tile_plage.gif" 
                style="position: absolute; top: 2400px; left: 2440px;" 
                alt="">
                    <img src="/relief/tile_peage.gif" 
                style="position: absolute; top: 2400px; left: 2400px;" 
                alt="">
                    <img src="/relief/tile_prairie.gif" 
                style="position: absolute; top: 2440px; left: 2440px;" 
                alt="">
                    <img src="/relief/tile_prairie.gif" 
                style="position: absolute; top: 2480px; left: 2400px;" 
                alt="">
                    <img src="/relief/tile_rocher.gif" 
                style="position: absolute; top: 2480px; left: 2440px;" 
                alt="">
                    <img src="/relief/tile_mer_hiver.gif" 
                style="position: absolute; top: 2360px; left: 2480px;" 
                alt="">
                    <img src="/relief/tile_mer_hiver.gif" 
                style="position: absolute; top: 2400px; left: 2480px;" 
                alt="">
                    <img src="/relief/tile_plage.gif" 
                style="position: absolute; top: 2360px; left: 2440px;" 
                alt="">
                    <img src="/relief/tile_poste_frontiere.gif" 
                style="position: absolute; top: 2320px; left: 2400px;" 
                alt="">
                    <img src="/relief/tile_chemin.gif" 
                style="position: absolute; top: 2360px; left: 2400px;" 
                alt="">
                    <img src="/relief/tile_mer_hiver.gif" 
                style="position: absolute; top: 2320px; left: 2480px;" 
                alt="">
                    <img src="/relief/tile_poste_frontiere.gif" 
                style="position: absolute; top: 2320px; left: 2440px;" 
                alt="">
                    <img src="/relief/tile_mer_hiver.gif" 
                style="position: absolute; top: 2480px; left: 2480px;" 
                alt="">
                    <img src="/relief/tile_grue_chantier.gif" 
                style="position: absolute; top: 2440px; left: 2480px;" 
                alt="">
        
    </div>
les 2440px ou 2480px 8-|

Re: requete spéciale?

par ynx » 27 nov. 2023, 16:43

Que veux dire "ca n'affiche toujours rien" ?

Tu as une page toute blanche ?

Tu as une page avec uniquement le titre et le message "Pas de tiles !" ?

Tu as une page avec uniquement le titre ? Qu'est-ce qui s'affiche dans le code source de la page depuis le navigateur (clique-droit -> Afficher le code source) ?

As tu essayé de décommenter la ligne //print_r($tiles); pour voir si tableau $tiles contient bien les bonnes données ?

Re: requete spéciale?

par nestor94 » 27 nov. 2023, 16:16

Salut, merci pour le code corrigé et expliqué.
J'ai effectué les quelques vérifs pour chaque step important, mais ça n'affiche toujours rien :cry:

C'est ci-dessous que le soucis doit être, pourtant ? #-o
<?php foreach ($tiles as $tile) : // pour chaque "tile" dans le tableau $tiles ?>
            <img src="<?= $tile['tile'] ?>" 
                style="position: absolute; top: <?= $tile['pos_x'] * TILE_WIDTH ?>px; left: <?= $tile['pos_y'] * TILE_HEIGHT ?>px;" 
                alt="">
        <?php endforeach; ?>

Re: requete spéciale?

par ynx » 27 nov. 2023, 13:42

Attention au nommage des variables (ne pas confondre le tableau $tiles et chaque élément $tile).
N'hésites pas à ajouter des echo/print_r/var_dump sur les variables dans ton code pour mieux comprendre son éxecution.
<?php

const TILE_WIDTH = 40;
const TILE_HEIGHT = 40;

/** @var \PDO $bdd */
$pdostat = $bdd->prepare("SELECT situation_pays FROM membres WHERE id=:id");
$pdostat->bindvalue(':id', $idMembreSession, PDO::PARAM_INT);
$pdostat->execute();
$membreSession = $pdostat->fetch();  

// Si $membreSession est vide, la variable $situation_pays n'est pas définie,
// il faut lui définir une valeur par défaut :
$situation_pays = '';

if (!empty($membreSession)) { 
	$situation_pays = $membreSession['situation_pays'];
}

// Attention aux injections sql : pas de variable php dans une requête sql !
// On utilise bindValue ou le tableau dans execute pour définir les valeurs des paramètres :
$pdostat = $bdd->prepare("SELECT tile, pos_x, pos_y FROM map WHERE pays_name=:pays");
$pdostat->bindvalue(':pays', $situation_pays, PDO::PARAM_STR);
$pdostat->execute();

//$tile = $pdostat->fetchAll();
//$pos_x= $pdostat->fetchAll();
//$pos_y= $pdostat->fetchAll();

// La méthode fetchAll retourne toutes les lignes du résultat de la requête dans un tableau,
// cette méthode ne doit être appelée qu'une seule fois.
// On récupère le retour de la fonction fetchAll dans un tableau nommé $tiles (au pluriel avec un s) :
$tiles = $pdostat->fetchAll();

// pour voir/déboguer le tableau :
//print_r($tiles);
?>
<h1><?= htmlspecialchars($situation_pays) ?></h1>

<?php if (empty($tiles)) : // on vérifie si le tableau $tiles (avec un s) est vide ?>

    <p>Pas de tiles !</p>

<?php else : ?>

    <div style="position: relative;">

        <?php foreach ($tiles as $tile) : // pour chaque "tile" dans le tableau $tiles ?>
            <img src="<?= $tile['tile'] ?>" 
                style="position: absolute; top: <?= $tile['pos_x'] * TILE_WIDTH ?>px; left: <?= $tile['pos_y'] * TILE_HEIGHT ?>px;" 
                alt="">
        <?php endforeach; ?>

    </div>

<?php endif; ?>

Re: requete spéciale?

par nestor94 » 26 nov. 2023, 01:02

Merci ynx, ta solution me parait plus intéressante en terme d'affichage.
Je me suis permis de modifier un peu ton script mais est ce que les coordonnées pos_x et pos_y sont prises en compte?
car rien ne s'affiche excepté le nom du pays.
const TILE_WIDTH = 40;
const TILE_HEIGHT = 40;
/** @var \PDO $bdd */
$pdostat = $bdd->prepare("SELECT situation_pays FROM membres WHERE id=:id");
$pdostat->bindvalue(':id',$idMembreSession ,PDO::PARAM_INT);
$pdostat->execute();
$membreSession = $pdostat->fetch();  
if (!empty($membreSession )) { 
$situation_pays = $membreSession['situation_pays'];
}
$pdostat = $bdd->prepare("SELECT tile, pos_x, pos_y FROM map WHERE pays_name='$situation_pays'");
$pdostat->execute();
$tile = $pdostat->fetchAll();
$pos_x= $pdostat->fetchAll();
$pos_y= $pdostat->fetchAll();
?>
<h1><?= htmlspecialchars($situation_pays) ?></h1>

<?php if (empty($tile)) : ?>

    <p>Pas de tiles !</p>

<?php else : ?>

    <div style="position: relative;">

        <?php foreach ($tile as $tile) : ?>
            <img src="<?= $tile['tile'] ?>" 
                style="position: absolute; top: <?= $tile['pos_x'] * TILE_WIDTH ?>px; left: <?= $tile['pos_y'] * TILE_HEIGHT ?>px;" 
                alt="">
        <?php endforeach; ?>

    </div>

<?php endif; ?>


pour info:

Image

Re: requete spéciale?

par ynx » 23 nov. 2023, 19:57

Puisque tu connais les coordonnées de chaque tile (et les dimensions, je suppose), au lieu d'utiliser un tableau html, une alternative pourrait être le positionnement absolu en css.

L'idée est d'afficher toutes les balises html <img> des tiles en position absolute dans un div conteneur en position relative.
Puis pour chaque tile, calculer les propriétés css top et left pour positionner l'image dans le conteneur en fonction de pos_x, pos_y et des dimensions :
- la tile avec pos_x=0 et pos_y=0 sera placée en haut à gauche du conteneur.
- la tile avec pos_x=0 et pos_y=1 sera placée à droite de la première.
- la tile avec pos_x=1 et pos_y=0 sera placée sous de la première, etc.

<?php

const TILE_WIDTH = 150;
const TILE_HEIGHT = 150;

$pays = $_GET['pays'] ?? 'France';

/** @var \PDO $bdd */
$pdostat = $bdd->prepare('SELECT tile, pos_x, pos_y FROM map WHERE pays_name=?');
$pdostat->execute([$pays]);
$tiles = $pdostat->fetchAll();
?>

<h1><?= htmlspecialchars($pays) ?></h1>

<?php if (empty($tiles)) : ?>

    <p>Pas de tiles !</p>

<?php else : ?>

    <div style="position: relative;">

        <?php foreach ($tiles as $tile) : ?>
            <img src="<?= $tile['tile'] ?>" 
                style="position: absolute; top: <?= $tile['pos_x'] * TILE_WIDTH ?>px; left: <?= $tile['pos_y'] * TILE_HEIGHT ?>px;" 
                alt="">
        <?php endforeach; ?>

    </div>

<?php endif; ?>

Re: requete spéciale?

par nestor94 » 22 nov. 2023, 17:31

ouf, parce que il y aura 2000 coordonnées éventuelles en table :shock:

Re: requete spéciale?

par two3d » 22 nov. 2023, 16:24

Non, tu dois le faire dans ta boucle while, comme je l'ai précédemment dit :
//lors de ta boucle while, ajoute les tiles dans le tableau:

$tableau[coordonnée x ici][coordonnée y ici] = "j'ajoute une title ici";
Regarde comment fonctionne les tableaux, tu comprendra mon message. ;)

Re: requete spéciale?

par nestor94 » 22 nov. 2023, 16:03

ok, je veux bien tenter d'y comprendre quelque chose mais je réitère ma question principale: dois je d'abord enter manuellement toutes mes coordonnées pos_x et pos_y?

Re: requete spéciale?

par two3d » 22 nov. 2023, 15:46

Je t'invite à apprendre comment manipuler les tableaux, la documentation officielle où tu pourra trouver pleins d'infos utiles est ici : https://www.php.net/manual/fr/language.types.array.php

Re: requete spéciale?

par nestor94 » 22 nov. 2023, 15:39

Quand tu dis "enregistre les x et y", il faut d'abord que je les rentre la dedans?
$tableau[coordonnée x ici][coordonnée y ici] = "j'ajoute une title ici";

Re: requete spéciale?

par two3d » 21 nov. 2023, 23:57

Il ya la solution avec un tableau multidimensionnel, enregistre les x et les y, puis affiche les en refaisant une boucle avec foreach().

Un exemple :
$tableau = [];

//lors de ta boucle while, ajoute les tiles dans le tableau:

$tableau[coordonnée x ici][coordonnée y ici] = "j'ajoute une title ici";