hello,

J'ai une requête un peu complexe qui fonctionne parfaitement avec des valeurs en dur.
Seulement je voudrai utiliser des paramètres pour les passer et les lier à la requête.

C'est ici que ça coince, ça ne fonctionne pas.

Ce que je fais

  public function getPlacesAroundMe($latFromUser, $lngFromUser, $radiusFromUser) {

    $places = DB::select("
      SELECT  z.name,
              z.city,
              z.lat, z.lng,
              p.distance_unit
                * DEGREES(ACOS(COS(RADIANS(p.latpoint))
                * COS(RADIANS(z.lat))
                * COS(RADIANS(p.longpoint) - RADIANS(z.lng))
                + SIN(RADIANS(p.latpoint))
                * SIN(RADIANS(z.lat)))) AS distance_in_km
      FROM places AS z

      JOIN (   
      SELECT  
              ? AS latpoint,  
              ? AS longpoint,
              ? AS radius,      
              111.045 AS distance_unit
      ) 
      AS p 
      ON 1=1
      WHERE z.lat
      BETWEEN p.latpoint  - (p.radius / p.distance_unit)
      AND p.latpoint  + (p.radius / p.distance_unit)
      AND z.lng
      BETWEEN p.longpoint - (p.radius / (p.distance_unit * COS(RADIANS(p.latpoint))))
      AND p.longpoint + (p.radius / (p.distance_unit * COS(RADIANS(p.latpoint))))

      ORDER BY distance_in_km
      LIMIT 15
    ", 

    [$latFromUser, $lngFromUser, $radiusFromUser]
    );

    return response()->json($places);
  }

L'erreur renvoyée par Laravel

SQLSTATE[42S22]: Column not found: 1054 Champ 'p.latpoint' inconnu

Si vous avez une idée du problème, votre aide est la bienvenue.

2 réponses


FactureHero.com
Auteur
Réponse acceptée

Non rien à voir, la requête fonctionne parfaitement bien avec des valeurs en dur.

J'ai identifié le problème : Ca ne vient pas de Laravel mais de PDO, qui pour des raisons de sécurité ne permet pas de binder des paramètres sur des nom table ou des des noms de champs (seulement sur des values).

Problème résolu de cette façon : J'ai crée une function qui retourne la requête, et je l'utilise dans la fonction getPlacesAroundMe()
http://stackoverflow.com/questions/182287/can-php-pdo-statements-accept-the-table-or-column-name-as-parameter


private function buildQueryPlacesAroundMe($latFromUser, $lngFromUser, $radiusFromUser) {
      // Ici ma reqête avec les paramètres $latFromUser, $lngFromUser, $radiusFromUser
      return $sql;
    }

public function getPlacesAroundMe($latFromUser, $lngFromUser, $radiusFromUser) {
    $places = DB::select(self::buildQueryPlacesAroundMe($latFromUser, $lngFromUser, $radiusFromUser));  
    return response()->json($places);
  }

Ton p.latpoint n'existe pas dans ta base de données !!