[RESOLU] SOUCIS REQUETE

Eléphant du PHP | 342 Messages

27 nov. 2024, 02:20

Bonjour,

je souhaiterai que ma requète teste si une donnée est présente entre "plusieurs positions"
<?php
$pdostat = $bdd->prepare("SELECT nom_lieu FROM galaxie LEFT JOIN membres ON galaxie.pos_x= membres.pos_x BETWEEN membres.pos_x+50  AND galaxie.pos_y= membres.pos_y BETWEEN membres.pos_y+50 WHERE membres.id=:id");
$pdostat->bindvalue(':id',$idMembreSession ,PDO::PARAM_INT);
$pdostat->execute();
$membreSession = $pdostat->fetch(); 
$nom_lieu= $membreSession['nom_lieu'];
if($nom_lieu !=' bla bla bla')
{
bla bla bla...
}
?>

Avatar du membre
Mammouth du PHP | 1525 Messages

27 nov. 2024, 02:56

Ta syntaxe "BETWEEN" est incorrecte : galaxie.pos_x= membres.pos_x BETWEEN

Lien doc SQL BETWEEN (sql.sh)

Ça devrait résoudre le problème, à tester :
$pdostat = $bdd->prepare("
    SELECT nom_lieu 
    FROM galaxie 
    LEFT JOIN membres ON (
        galaxie.pos_x BETWEEN membres.pos_x - 50 AND membres.pos_x + 50 
        AND galaxie.pos_y BETWEEN membres.pos_y - 50 AND membres.pos_y + 50
    ) 
    WHERE membres.id = :id
");
Ou en isolant les conditions AND :
$pdostat = $bdd->prepare("
    SELECT nom_lieu 
    FROM galaxie 
    LEFT JOIN membres ON (
        galaxie.pos_x BETWEEN (membres.pos_x - 50 AND membres.pos_x + 50 )
        AND
        galaxie.pos_y BETWEEN (membres.pos_y - 50 AND membres.pos_y + 50)
    ) 
    WHERE membres.id = :id
");

Eléphant du PHP | 342 Messages

27 nov. 2024, 21:49

Les deux requètes ne retournent pas d'erreur mais ne font pas le job :?

Avatar du membre
Mammouth du PHP | 1525 Messages

27 nov. 2024, 23:38

Il se peut que tu n'ai aucun enregistrement dans la base de données.

Essaye en augmentant les pos_y et pos_x pour filtrer large.

nom_lieu existe ? Vérifie l'orthographe, fait des tests sans BETWEEN pour t'assurer que ta des résultats, puis filter ensuite.

C'est parti pour un debugging :D

Eléphant du PHP | 342 Messages

02 déc. 2024, 19:19

$pdostat = $bdd->prepare("SELECT nom_lieu FROM galaxie LEFT JOIN membres ON galaxie.pos_x BETWEEN (membres.pos_x - 50 AND membres.pos_x + 50 )   AND   galaxie.pos_y BETWEEN (membres.pos_y - 50 AND membres.pos_y + 50) )  WHERE membres.id = :id");
$pdostat->bindvalue(':id',$idMembreSession ,PDO::PARAM_INT);
$membreSession = $pdostat->fetch(); 
$nom_lieu= $membreSession['nom_lieu'];
if ($nom_lieu !='SATELLITE')
{
	header('Location:radio_hs.php');
	exit;
}
nom_lieu est OK, j'ai positionné le joueur "test" une case juste à coté et cela renvoie à chaque fois vers le header. :?

Mammouth du PHP | 2680 Messages

02 déc. 2024, 20:06

debugger, c'est exécuter la requête dans phpmyadmin. car tant qu'elle ne retourne pas ce qui est attendu dans phpmyadmin, cela ne fonctionnera pas dans une page web.

Avatar du membre
Mammouth du PHP | 1525 Messages

02 déc. 2024, 20:06

A toi de jouer, débug au mieux chef ! :D

Lors d'un débug, on ne met pas de redirections, seulement des infos concernant les résultats de la requête, tu peux utiliser var_dump() ou print_r().

Eléphant du PHP | 342 Messages

09 déc. 2024, 19:25

La requête fonctionne à présent en appelant la table "satellites" plutot que la map de jeu (galaxie) car sur cette dernière, il y avait plusieurs 'nom_lieu' différents...
$pdostat = $bdd->prepare ("SELECT nom FROM satellites LEFT JOIN membres ON satellites.pos_x BETWEEN membres.pos_x - 10 AND membres.pos_x + 10   AND satellites.pos_y BETWEEN membres.pos_y - 10 AND membres.pos_y + 10 WHERE membres.id =:id");
$pdostat->bindvalue(':id',$idMembreSession ,PDO::PARAM_INT);
$pdostat->execute();
$membreSession = $pdostat->fetch(); 
if (!empty($membreSession)) { 
$nom= $membreSession['nom'];
}
if ($nom !='SAT-')
{
	header('Location:radio_hs.php');
	exit;
}

Avatar du membre
Mammouth du PHP | 1525 Messages

09 déc. 2024, 21:27

;) passe en résolu si c'est bon pour toi