[RESOLU] Comment différencier plusieurs persos/id?

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 : [RESOLU] Comment différencier plusieurs persos/id?

Re: Comment différencier plusieurs persos/id?

par nestor94 » 20 nov. 2021, 16:57

Je réouvre ce post car si le script d'origine est OK, il ne fonctionne plus sur la map "ville".
$idMembreSession = !empty($_SESSION['id']) ? $_SESSION['id'] : NULL;

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

$idMembreSelect = !empty($_GET['id']) ? $_GET['id'] : NULL;

$pdostat = $bdd->prepare("SELECT nom_ville FROM villes LEFT JOIN membres ON villes.pos_x_map = membres.pos_x_enter_ville AND villes.pos_y_map = membres.pos_y_enter_ville WHERE membres.id=:id");
$pdostat->bindvalue(':id',$idMembreSession, PDO::PARAM_INT);
$pdostat->execute();
$membreSession = $pdostat->fetch();    
if (!empty($membreSession)) { 
$nom_ville = $membreSession['nom_ville'];
}
// récupération en bdd du membre sélectionné dans l'url (si il est toujours à proximité du membre connecté en session et pas en vacances)
$pdostat = $bdd->prepare("SELECT * FROM membres WHERE id = :id AND (pos_x_ville =:pos_x_ville AND pos_y_ville =:pos_y_ville) AND vacance = 'OFF' AND situation='$nom_ville'");
$pdostat->bindvalue(':id', $idMembreSelect, PDO::PARAM_INT);
$pdostat->bindvalue(':pos_x_ville', $membreSession['pos_x_ville'], PDO::PARAM_INT);
$pdostat->bindvalue(':pos_y_ville', $membreSession['pos_y_ville'], PDO::PARAM_INT);
$pdostat->execute();
$membreSelect = $pdostat->fetch();
Les variables pos_x_ville et pos_y_ville ne passent pas.
Undefined index: pos_x_ville in C:\wamp64\www\action_ville_perso_id.php on line 24
( ! ) Notice: Undefined index: pos_y_ville in C:\wamp64\www\action_ville_perso_id.php on line 25

echo et var_dump donnent NULL...

Re: Comment différencier plusieurs persos/id?

par nestor94 » 31 août 2021, 23:04

Je cloture ce topic car l'affichage des avatars sur la map est OK.
Mille mercis pour les explications claires et bien expliquées.
je m'attelle maintenant aux fameuses interactions en espérant que cela ne coince pas trop.

Re: Comment différencier plusieurs persos/id?

par ynx » 30 août 2021, 11:40

Non il n'est pas nécessaire de renommer la colonne dans la bdd. La colonne id étant dans la table membres, on devine donc implicitement qu'il s'agit de l'identifiant d'un membre.

Re: Comment différencier plusieurs persos/id?

par nestor94 » 30 août 2021, 11:33

Merci pour tous ces conseils ainsi que les explications claires. je vais m'atteler à tout réécrire.

Re: Comment différencier plusieurs persos/id?

par nestor94 » 29 août 2021, 11:31

Merci pour tous ces conseils. je vais m'atteler à tout réécrire.
Un seul point que je dois éclairer: faut il modifier en table le id en idMembreSession?

Re: Comment différencier plusieurs persos/id?

par ynx » 21 août 2021, 18:21

Quelques conseils et exemples :

dans le fichier map.php :
<?php
// [...] 

// id du membre connecté en session
$idMembreSession = !empty($_SESSION['id']) ? $_SESSION['id'] : NULL;

// récupération en bdd du membre connecté en session
$pdostat = $bdd->prepare('SELECT * FROM membres WHERE id = :id');
$pdostat->bindvalue(':id', $idMembreSession, PDO::PARAM_INT);
$pdostat->execute();

$membreSession = $pdostat->fetch();

if (!empty($membreSession)) {
    // récupération en bdd des membres à la même position que le membre connecté en session
    $pdostat = $bdd->prepare("SELECT * FROM membres WHERE (pos_x = :pos_x AND pos_y = :pos_y) AND id != :id AND vacance = 'OFF'");
    $pdostat->bindvalue(':id', $idMembreSession, PDO::PARAM_INT);
    $pdostat->bindvalue(':pos_x', $membreSession['pos_x'], PDO::PARAM_INT);
    $pdostat->bindvalue(':pos_y', $membreSession['pos_y'], PDO::PARAM_INT);
    $pdostat->execute();

    while ($membreVoisin = $pdostat->fetch()) {
        echo '<a href="/action_perso_id.php?id=' . intval($membreVoisin['id']) . '"><img src="' . htmlentities($membreVoisin['avatar']) . '"></a>';
    }
}
?>
- // [...] : l'exemple n'est pas complet, il doit notamment avoir une instruction session_start() au début du fichier et une redirection si le l'utilisateur n'est pas connecté en session (voir sur le 2e exemple).

- Nommer plus précisément les variables par rapport à ce qu'elles représentent : $idMembreSession au lieu de $id, $membreSession au lieu du premier $resultat et $membreVoisin au lieu du deuxième $resultat

- Ne pas abuser des variables intermédiaires : les variables $sql ne sont pas utiles pour le moment, autant saisir directement la requête sql dans la méthode prepare().
Même chose pour $pos_x, $pos_y et $avatar, autant utiliser directement l'objet retourné par PDO avec $resultat['pox_x'], $resultat['pox_y'] et $resultat['avatar']. Ou après avoir renommé la variable $resultat : $membreSession['pos_x'] (la position x du membre connecté) ou $membreVoisin['avatar'] (l'avatar d'un membre voisin dans la boucle).

- Il ne faut pas injecter les variables php $pos_x et $pox_y dans la requête sql préparée. Il faut les passer en paramètre avec la méthode bindvalue() comme pour le paramètre :id.
Dans l'exemple au dessus, si les colonnes pox_x et pox_y dans la base de données ne sont pas des entiers, il faut corriger le 3e paramètre PDO::PARAM_INT.

Fichier action_perso_id.php :
<?php
session_start();
require_once 'config.php';

// id du membre connecté en session
$idMembreSession = !empty($_SESSION['id']) ? $_SESSION['id'] : NULL;

// récupération en bdd du membre connecté en session
$pdostat = $bdd->prepare('SELECT * FROM membres WHERE id = :id');
$pdostat->bindvalue(':id', $idMembreSession, PDO::PARAM_INT);
$pdostat->execute();

$membreSession = $pdostat->fetch();

if (empty($membreSession)) {
    // le membre n'est pas connecté ou n'existe plus, on redirige vers la page de connexion
    header('Location: /connexion.php');
    exit();
}

// identifiant du membre sélectionné dans l'url
$idMembreSelect = !empty($_GET['id']) ? $_GET['id'] : NULL;

// récupération en bdd du membre sélectionné dans l'url (si il est toujours à proximité du membre connecté en session et pas en vacances)
$pdostat = $bdd->prepare("SELECT * FROM membres WHERE id = :id AND (pos_x = :pos_x AND pos_y = :pos_y) AND vacance = 'OFF'");
$pdostat->bindvalue(':id', $idMembreSelect, PDO::PARAM_INT);
$pdostat->bindvalue(':pos_x', $membreSession['pos_x'], PDO::PARAM_INT);
$pdostat->bindvalue(':pos_y', $membreSession['pos_y'], PDO::PARAM_INT);
$pdostat->execute();

$membreSelect = $pdostat->fetch();
?>
<h1>ACTIONS SUR LE PERSO</h1>

<?php if (!$membreSelect) : ?>

    <p>Ce perso n'existe pas ou n'est plus à proximité.<p>
    
    <a href="/map.php">Vers la carte de jeu</a>

<?php else : ?>
    
    <h2>INTERACTIONS</h2>

    <a href="/voler.php?id=<?php echo intval($membreSelect['id']) ?>" title="VOL">VOLER</a>
    <a href="/attaquer.php?id=<?php echo intval($membreSelect['id']) ?>" title="ATTAQUE">ATTAQUER</a>
    <a href="/capturer.php?id=<?php echo intval($membreSelect['id']) ?>" title="CAPTURE">CAPTURER</a>

    <a href="/map.php">Vers la carte de jeu</a>

<?php endif; ?>
- Comme dans le précédent exemple, on récupère dans la bdd le membre connecté en session. Puis on redirige vers la page de connexion si l'utilisateur n'est pas connecté ou que le membre n'existe pas (l’exécution du script s'arrête ici dans ce cas).
Il faut corriger l'url dans l'instruction header() si la page de connexion n'est pas /connexion.php

- Avec la deuxième requête sql, on récupère en bdd le membre sélectionné dont l'identifiant est indiqué dans l'url (WHERE id = :id avec le paramètre :id auquel on bind la valeur de $idMembreSelect qui correspond à $_GET['id']).
On vérifie aussi que le membre sélectionné est bien à la même position que le membre connecté en session (AND (pos_x = :pos_x AND pos_y = :pos_y) avec les mêmes bind que le premier exemple) car l'internaute peut saisir n'importe quel identifiant dans l'url de son navigateur.

- Pour la partie html, l'exemple est très simplifié pour rendre le code plus clair (il manque notamment le doctype et les balises <html>, <head>, <body>, ect pour un exemple complet).
Tes balises <span> n'étaient pas fermés dans tes liens. Tu peux supprimer cette balise et mettre l'attribut title directement sur la balise <a> si les balises <span> n'ont pas d'autres utilités.
Tes balises <img> devraient avoir un attribut alt. Tu pourrais y renseigner le pseudo du membre lorsque tu affiche l'avatar par exemple.
Les balises <font> et <center> ne devraient plus être utilisées. Même chose pour pour les répétitions de <br> ou pour l'utilisation des balises <table> si celles-ci sont utilisées pour de la mise en page. Tu devrais utiliser une feuille de style css rendre ton code html plus simple et personnaliser l'affichage de ton site plus facilement.

Enfin, il serait plus simple pour ton projet (mais aussi pour l'utilisateur d'un point de vue ergonomie) de suivre le conseil de or1 et de proposer les actions pour chaque membre à proximité directement dans le fichier map.php.
Pour cela il faudra donc modifier la boucle qui parcours les membres à proximité (while ($membreVoisin ... dans mon premier exemple) afin d'afficher les liens qui devront désormais pointer vers /voler.php, /attaquer.php et /capturer.php à la place du lien qui pointe vers /action_perso_id.php.

Re: Comment différencier plusieurs persos/id?

par nestor94 » 20 août 2021, 16:24

:oops:
J'essaie de tester pour ne récupérer et afficher que l'avatar souhaité.

j'ai aussi essayé sur la fin du SELECT mais sans résultat valable.
je pense que c'est dans cette partie de "action_perso_id.php" qu'il faut récupérer le $_GET['id'] mais je ne vois pas comment.
$sql = "SELECT avatar FROM membres WHERE (pos_x=$pos_x AND pos_y=$pos_y) AND id!=id";
$pdostat = $bdd->prepare($sql);
$pdostat->bindvalue(':id',$id ,PDO::PARAM_INT);
$pdostat->execute();
while ($resultat = $pdostat->fetch())
{
$avatar = $resultat['avatar'];

Re: Comment différencier plusieurs persos/id?

par or 1 » 20 août 2021, 16:15

que fait cette ligne ?
$id = $_GET['id'];

Re: Comment différencier plusieurs persos/id?

par nestor94 » 20 août 2021, 16:13

Oui, c'est modifié dans map_détail, mais pas ensuite.
Je ne vois pas comment le coder dans le SELECT je suppose

Re: Comment différencier plusieurs persos/id?

par or 1 » 20 août 2021, 16:10

comme l'a dit ynx :
"Tu peux passer l'identifiant de l'utilisateur en paramètre afin de réaliser l'action sur l'utilisateur spécifié par ce paramètre :

echo '<a href="action_perso_id.php?id=' . $resultat['id'] . '"><img src="'.$avatar.'"></a>';"

Re: Comment différencier plusieurs persos/id?

par nestor94 » 20 août 2021, 16:06

Tu veux dire tout mettre sur map_détail??

"map_détail" (avec modif selon ynx)
<?php
$sql = "SELECT pos_x, pos_y FROM membres WHERE id=:id";
$pdostat = $bdd->prepare($sql);
$pdostat->bindvalue(':id',$id ,PDO::PARAM_INT);
$pdostat->execute();
$resultat = $pdostat->fetch();    
if (!empty($resultat )) { 
$pos_x = $resultat['pos_x'];
$pos_y = $resultat['pos_y'];
}
$sql = "SELECT * FROM membres WHERE (pos_x=$pos_x AND pos_y=$pos_y) AND id!=:id AND vacance= 'OFF'";
$pdostat = $bdd->prepare($sql);
$pdostat->bindvalue(':id',$id ,PDO::PARAM_INT);
$pdostat->execute();
while ($resultat = $pdostat->fetch())
{
$id= $resultat['id'];
$avatar = $resultat['avatar'];
echo '<a href="action_perso_id.php?id=' . $resultat['id'] . '"><img src="'.$avatar.'"></a>';
}
?>
action_perso_id (qui devrait afficher SEULEMENT l'avatar voulu) // c'est là que ça coince encore
<?php
session_start();
require_once 'config.php';
$id = !empty($_SESSION['id']) ? $_SESSION['id'] : NULL;
$sql = "SELECT pos_x, pos_y FROM membres WHERE id=:id";
$pdostat = $bdd->prepare($sql);
$pdostat->bindvalue(':id',$id ,PDO::PARAM_INT);
$pdostat->execute();
$resultat = $pdostat->fetch();    
if (!empty($resultat )) { 
$pos_x = $resultat['pos_x'];
$pos_y = $resultat['pos_y'];
}
$sql = "SELECT avatar FROM membres WHERE (pos_x=$pos_x AND pos_y=$pos_y) AND id!=id";
$pdostat = $bdd->prepare($sql);
$pdostat->bindvalue(':id',$id ,PDO::PARAM_INT);
$pdostat->execute();
while ($resultat = $pdostat->fetch())
{
$avatar = $resultat['avatar'];
$id = $_GET['id'];
?>
partie html
<table>
<tr><td colspan="3"><b><font size="3">INTERACTIONS</b></font></td></tr>
<tr><td><font size="3"><a href="voler.php"><span title="VOL">VOLER</a></font></td>
<td><font size="3"><a href="attaquer.php"><span title="ATTAQUE">ATTAQUER</a></font></td>
<td><font size="3"><a href="capturer.php"><span title="CAPTURE">CAPTURER</a></font></td></tr>
</table>
<br><br><center><a href="map.php">vers la carte de jeu</a></center>
</body>
</html>

Re: Comment différencier plusieurs persos/id?

par or 1 » 20 août 2021, 15:57

ou dans le code copié y-a-t il quelque chose qui va dans cette direction ?

d'un point de vue ergonomie, s'il n'y a que 3 actions, il vaudrait mieux au lieu de cliquer sur un avatar, cliquer sur quelque chose liée à l'action souhaitée et l'avatar choisi, soit une page en moins.

Re: Comment différencier plusieurs persos/id?

par nestor94 » 20 août 2021, 15:54

Oui, tout à fait.

Re: Comment différencier plusieurs persos/id?

par or 1 » 20 août 2021, 15:49

donc dans action_perso_id.php il faut choisir une de ces 3 actions ?

Re: Comment différencier plusieurs persos/id?

par nestor94 » 20 août 2021, 15:46

<table>
<tr><td colspan="3"><b><font size="3">INTERACTIONS</b></font></td></tr>
<tr><td><font size="3"><a href="voler.php"><span title="VOL">VOLER</a></font></td>
<td><font size="3"><a href="attaquer.php"><span title="ATTAQUE">ATTAQUER</a></font></td>
<td><font size="3"><a href="capturer.php"><span title="CAPTURE">CAPTURER</a></font></td></tr>
</table>