准备在数据库中插入ST_GeomFromText的数据(Codeigniter + MySql)

时间:2017-04-21 17:17:14

标签: php mysql codeigniter

我在使用Codeigniter在数据库中插入数据时遇到问题。我有这个测试种子功能

$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)\')'

中的单引号(')

任何人都知道如何正确准备数据(不执行直接查询,因为需要存储更多数据)所以它可以正常处理?

如果您需要任何其他信息,请告诉我,我会提供。 谢谢!

2 个答案:

答案 0 :(得分: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 :(得分: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并手动转义值。