1

PDO バインディング パラメータに問題があります。設定されたパラメータは、データベースで実行されたときにクエリにプッシュされません。これは、MySQL でクエリをファイルに記録することで確認できました。

サーバーに対して実行すると、ログ ファイルに表示されます。

SELECT sg.locID, ( 3959 * acos( cos( radians(53.21333) ) * cos( radians( latitude ) ) * cos( radians( longitude ) - radians(-2.4354014) ) + sin( radians(53.21333) ) * sin( radians( latitude ) ) ) ) AS distance FROM location_geo sg HAVING distance < 1000 ORDER BY distance LIMIT 0 , 20

PHP/PDO内から実行した場合

SELECT
  sg.locID,
  ( 3959 * acos( cos( radians(NULL) ) * cos( radians( latitude ) ) * cos( radians( longitude ) - radians(NULL) ) + sin( radians(NULL) ) * sin( radians( latitude ) ) ) ) AS distance
FROM
  location_geo sg
HAVING
  distance < 1000
ORDER BY distance LIMIT 0, 20

これがPHPによって実行されるコードです

$lat = 53.21333;
$lng = -2.4354014;
$limit = 10;
$start = 0;

$query = "
    SELECT
      sg.locID,
      ( 3959 * acos( cos( radians(:latitude) ) * cos( radians( latitude ) ) * cos( radians( longitude ) - radians(:longitude) ) + sin( radians(:latitude) ) * sin( radians( latitude ) ) ) ) AS distance
    FROM
      location_geo sg
    HAVING
      distance < :radius
    ORDER BY distance LIMIT :start, :limit
";

$stm = Modules::db()->prepare($query);
$stm->bindValue(":radius", 1000, PDO::PARAM_INT);
$stm->bindParam(":latitude", $lat, PDO::PARAM_INT);
$stm->bindParam(":longitude", $lng, PDO::PARAM_INT);
$stm->bindParam(":start", $start, PDO::PARAM_INT);
$stm->bindParam(":limit", $limit, PDO::PARAM_INT);
$stm->execute();

これが私のテーブルです

CREATE TABLE `location_geo` (
  `locID` int(11) unsigned NOT NULL,
  `latitude` double DEFAULT NULL,
  `longitude` double DEFAULT NULL,
  PRIMARY KEY (`locID`)
)

ダミーデータ -

INSERT INTO `location_geo` (`locID`, `latitude`, `longitude`)
VALUES
    (1, 53.21333, -2.4354014),
    (2, 53.213435, -2.4345214);

bindParams を置き換えて、実行呼び出し内の配列にデータを入れようとしましたが、結果は同じです。

見逃した場合のために、緯度と経度の値は null のままです。PDO からのエラーはありません。

変。

4

2 に答える 2

1

デバッグの目的で、setAttribute()を使用します。たとえば、次のようになります。

setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_WARNING);

このようにして、エラーが発生したかどうか、およびエラーが何であるかがわかります。

于 2012-04-21T21:36:49.700 に答える
1

OK、生の PDO を使ったことはありませんが、ここにエラーがあると思います:

$stm->bindParam(":latitude", $lat, PDO::PARAM_INT);
$stm->bindParam(":longitude", $lng, PDO::PARAM_INT);

PDO::PARAM_INTFLOAT を渡す場合、なぜ INT であると言うのですか (これは、渡される値のタイプを示していると思います)。浮動小数点値は整数ではないため、おそらくそれがNULLに変換されている理由です...

于 2012-04-21T21:32:37.840 に答える