0

ユーザーが入力した郵便番号を取得する PHP PDO/SQLite を使用してスクリプトを作成しています。この距離関数を使用すると、特定の半径内およびその他の基準内のすべての場所が返されます。私は最初に通常のクエリメソッドを使用してそれを書きましたが、うまくいきました。しかし、準備/実行メソッドでサニタイズすることをお勧めします。私がそれをしたとき、半径検索が壊れました。他のすべての基準は正常に機能し、場所を (距離関数を使用せずに) ストレート マッチに変更した場合も同様に機能しました。しかし、カスタム関数と準備/実行を使用すると... radius 関数は常に true を返します。他の誰かがこれを経験しましたか?

このコードは機能します:

db->sqliteCreateFunction('distance', function () {
    if (count($geo = array_map('deg2rad', array_filter(func_get_args(), 'is_numeric'))) == 4) {
        return round(acos(sin($geo[0]) * sin($geo[2]) + cos($geo[0]) * cos($geo[2]) * cos($geo[1] - $geo[3])) * 6378.14, 3);
    }
    return null;
}, 4);

$searches=array();
if(isset($_POST['specialty'])) {
    $searches['specialty'] = "specialtyID = $_POST[specialty]";
}
if (isset($_POST['name'])) {
    $searches['name'] = "name LIKE \"%$_POST[name]%\"";
}
if (isset($_POST['postalCode'])) {
    // leaving out code that sets $lat,$lon
    $searches['postalCode'] = "distance('$lat','$lon',lat,lon)<:$_POST[postalCodeRadius]";
}

$query="SELECT * FROM providers WHERE ".implode(" AND ",$searches);
$result = db->query($query)->fetchAll();

このコードは、postalCode では機能しません (ただし、専門分野と名前では機能します)。

// leaving out same create function code

$searches=array();
$postdata=array();
if(isset($_POST['specialty'])) {
    $searches['specialty'] = "specialtyID = :specialty";
    $postdata['specialty']=$_POST['specialty'];
}
if (isset($_POST['name'])) {
    $searches['name'] = "name LIKE \"%$_POST[name]%\"";
    $postdata['name']="%$_POST[name]%";
}
if (isset($_POST['postalCode'])) {
    // leaving out code that sets $lat,$lon
    $searches['postalCode'] = "distance('$lat','$lon',lat,lon)<:postalCodeRadius";
    $postdata['postalCodeRadius']=$_POST['postalCodeRadius'];
}

$sth = $primecare_db->prepare("SELECT * FROM providers WHERE ".implode(" AND ",$searches));
$sth->execute($postdata);
$result = $sth->fetchAll();
4

0 に答える 0