0

我正在使用 PHP PDO/SQLite 编写一个脚本,该脚本采用用户输入的邮政编码,并使用此距离函数返回某个半径内的所有位置和其他标准。我首先使用常规查询方法编写了它,并且效果很好。但后来我决定用准备/执行方法对其进行消毒是个好主意。当我这样做时,半径搜索中断了。所有其他标准都很好,如果我将位置更改为直接匹配(不使用距离函数),它也可以正常工作。但是如果我使用自定义函数和准备/执行...半径函数总是返回真。有没有其他人经历过这个?

此代码有效:

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();

此代码不适用于邮政编码(但适用于专业和姓名):

// 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