2012-04-21 15 views
1

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

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

-

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`) 
) 

ダミーデータによって実行thatsのあります

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

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

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

奇妙です。なぜあなたはこのPDO::PARAM_INTがされている値の種類を言うことを私は推測それはINT(と言うん

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

答えて

1

私はsetAttribute()を使用します。たとえば、次のようになります。

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

このようにすると、エラーが発生したかどうかを知ることができます。

+0

悲しいことに、これは画面やログに何も表示されません。ありがとうございました –

+0

レベルを高レベルに設定してみてください:PDO :: ERRMODE_EXCEPTION – Mads

1

[OK]を、私は前に生のPDOを使用したことがないが、私はエラーがここにあると思いますあなたがFLOATに合格すれば?おそらく浮動小数点値は整数ではないので、NULLに変換されているのでしょう...

+0

floatのオプションはありません。PARAM_STRが同じ動作を返すので、設定することさえできます。 intオプションは、単一引用符で値を囲みません。これは、strオプションと同じです。しかし、これが問題になる可能性があることを指摘すると、私はこれについて調査します。ありがとう –

+0

これについては、あなたが調べるべきであることについて既にいくつかのトピックがあります:http://stackoverflow.com/questions/1335081/what-is-the-best-way-to-bind-decimal-double-float-values- with-pdo-in-phpなどです。おそらく、PDO :: PARAM_ *パラメータをスキップして '$ stm-> bindParam(":latitude "、$ lat);とするだけです。 –

+0

私は、その投稿に示唆されているように型を定義せずに試してみましたが、mysqlのクエリログに、値を単一引用符で囲んで、PARAM_STRと同じようにラップすることができます。緯度と経度の値はNULLのままです。私はこれを原因と見なすことができません:( –

関連する問題