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.
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);
}
SQLSTATE[42S22]: Column not found: 1054 Champ 'p.latpoint' inconnu
Si vous avez une idée du problème, votre aide est la bienvenue.
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);
}