2017-04-21 137 views
2

我在使用Codeigniter將數據插入數據庫時​​遇到問題。我有這個測試種子功能準備在數據庫中插入ST_GeomFromText的數據(Codeigniter + MySql)

$latitude = rand(45.500000 * 1000000, 46.400000 * 1000000)/1000000; 
$longitude = rand(13.600000 * 1000000, 15.500000 * 1000000)/1000000; 
$data = array(
    'unique_id' => '12319334', 
    'latitude' => $latitude, 
    'longitude' => $longitude, 
    'coordinates' => "ST_GeomFromText('POINT($latitude $longitude)')", 
); 
$locationId = $this->Locations->insert($data); 

而且這是在模型插入功能

function insert($data, $tableName = "") 
    { 
     if ($tableName == "") { 
      $tableName = $this->table; 
     } 
     $this->db->insert($tableName, $data); 
     return $this->db->insert_id(); 
    } 

這是發生

INSERT 
INTO 
    `locations`(
    `unique_id`, 
    `latitude`, 
    `longitude`, 
    `coordinates` 
) 
VALUES(
    'ZTE1NGY2YT', 
    45.990292, 
    14.948462, 
    'ST_GeomFromText(\'POINT(45.582315 14.821478)\')' 
) 

錯誤我得到的是Cannot get geometry object from data you send to the GEOMETRY field

查詢在phpmyadmin中進行了一些測試後,我找出了插入這種數據的查詢應該是這樣的

INSERT 
INTO 
    `locations`(
    `unique_id`, 
    `latitude`, 
    `longitude`, 
    `coordinates` 
) 
VALUES(
    'ZTE1NGY2YT', 
    45.990292, 
    14.948462, 
    ST_GeomFromText('POINT(45.582315 14.821478)') 
) 

所以,在某種程度上,我需要得到'ST_GeomFromText(\'POINT(45.582315 14.821478)\')'

任何人有知道如何正確地準備數據(不執行直接查詢,因爲有很多驅除掉單引號(')更多的數據存儲)所以它可以正確處理?

如果您需要任何其他信息,請讓我知道,我會提供。 謝謝!

回答

1

其實,這做到了

$this->db->set('coordinates', "ST_GeomFromText('POINT($latitude $longitude)')", false); 

所以我在我的模型做了一個小黑客(我知道它不漂亮,但它現在工程)和數據插入..

function insert($data, $tableName = "") 
    { 
     foreach ($data as $key => $value) { 
      if ($key == 'coordinates') { 
       $this->db->set('coordinates', $value, false); 
       unset($data['coordinates']); 
      } 
     } 
     if ($tableName == "") { 
      $tableName = $this->table; 
     } 
     $this->db->insert($tableName, $data); 
     return $this->db->insert_id(); 
    } 
+1

可能會更好做:'if(isset($ data ['coordinates'])){$ this-> db-> set('coordinates',$ data ['coordinates'],false); unset($ data ['coordinates']);}' – cwallenpoole

+0

好想法! :D thx –

0

不幸的是,CodeIgniter的數據庫轉義邏輯假定模式是field_name => rendered data。這意味着你不能使用諸如NOW()MD5()ST_GeomFromText之類的東西。 You can see the logic here:

foreach ($data as $key => $val) 
    { 
     $fields[] = $this->escape_identifiers($key); 
     $values[] = $this->escape($val); 
    } 

我已經成功的最好的辦法是extend the DB driver並有模型調用自定義的功能。另一種選擇是退回到原始SQL並手動轉義值。

+0

我做了它與$ this-> db->設置 檢查我的答案 –