3

codeigniter からデータベース構文エラーが発生し、この SQL クエリを生成しています。

SELECT `code`, `latitude`, `longitude` FROM (`postcodes`) WHERE `latitude` `BETWEEN 55`.`8616 AND 56`.`1508` AND `longitude` `BETWEEN '-3`.`9507' AND '-3`.`6131'` AND `code` LIKE 'FK%'

経度と緯度にあってはならない場所に「」を追加するという問題が見られると思います。

このクエリを生成するコードは次のとおりです。

 function get_zips_in_range($zip, $range, $sort=1, $include_base=true)
{
    //get base postcode details
    $details = $this->get_zip_point($zip);

    if( ! $details)
    {
        return false;
    }

    //get the first 2 letters of the postcode
    $str = substr($zip, 0, 2);

    //find max - min lat / long for radius and zero point and query
    //only zips in that range.
    $lat_range = $range/69.172;
    $lon_range = abs($range/(cos($details->latitude) * 69.172));
    $min_lat = number_format($details->latitude - $lat_range, "4", ".", "");
    $max_lat = number_format($details->latitude + $lat_range, "4", ".", "");
    $min_lon = number_format($details->longitude - $lon_range, "4", ".", "");
    $max_lon = number_format($details->longitude + $lon_range, "4", ".", "");

    //build the sql query
    $this->CI->db->select("code, latitude, longitude");

    if( !$include_base)
    {
        $this->CI->db->where("code <>", $zip);
    }

    $this->CI->db->where("latitude BETWEEN '$min_lat' AND '$max_lat'");
    $this->CI->db->where("longitude BETWEEN '$min_lon' AND '$max_lon'");
    $this->CI->db->like('code', $str, 'after');    
    $result = $this->CI->db->get("postcodes");

    if($result->num_rows() < 1)
    {
        $this->set_last_error("SQL error in get_zips_in_range");
        return false;
    }
4

4 に答える 4

3

CI 2.1.1 にバグがあります https://github.com/EllisLab/CodeIgniter/issues/1469

2.1.2 がリリースされるまでは、2.1.0 に戻すことが最善の解決策です

于 2012-06-14T13:49:31.213 に答える
1

さて、次のことをチェックしてください、

$this->CI->db->where("latitude BETWEEN $min_lat AND $max_lat");
$this->CI->db->where("longitude BETWEEN $min_lon AND $max_lon");

構文は別として、次のようにレンダリングされますwhere latitude BETWEEN $min_lat AND $max_lat AND longitude BETWEEN $min_lon AND $max_lon

ここで、何が問題なのかを尋ねます。

問題は、私たちがそれを作っている方法を照会することです

それは次のように行うことができます

$this->CI->db->where("(latitude BETWEEN $min_lat AND $max_lat)");
$this->CI->db->where("(longitude BETWEEN $min_lon AND $max_lon)");

したがって、レンダリングされwhere (latitude BETWEEN $min_lat AND $max_lat) AND (longitude BETWEEN $min_lon AND $max_lon)、うまくいけば、これで問題が解決します。

引用する必要はありません。

于 2012-06-15T11:32:08.780 に答える
1

CodeIgniter は自動的にバックティックを追加して、より安全なクエリを作成します。これを無効にする場合は、次のようにパラメーター FALSE を追加できます。

$this->CI->db->where("latitude BETWEEN '$min_lat' AND '$max_lat'", FALSE);
于 2012-06-15T11:14:33.437 に答える
0
$this->CI->db->where("latitude BETWEEN '$min_lat' AND '$max_lat'");
$this->CI->db->where("longitude BETWEEN '$min_lon' AND '$max_lon'")

シンプルを取り除く'

$this->CI->db->where("latitude BETWEEN $min_lat AND $max_lat");
$this->CI->db->where("longitude BETWEEN $min_lon AND $max_lon")
于 2012-06-14T12:20:54.870 に答える