我在使用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)\')'
行
任何人都知道如何正确准备数据(不执行直接查询,因为需要存储更多数据)所以它可以正常处理?
如果您需要任何其他信息,请告诉我,我会提供。 谢谢!
答案 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并手动转义值。