2016-12-08 9 views
2

Я пытаюсь создать с использованием Phinx. Но я получаю следующее сообщение об ошибке:PHP/Phinx - Вставка долготы/широты вызывает ошибку объекта геометрии объекта PDO Ошибка

[PDOException]                           
SQLSTATE[22003]: Numeric value out of range: 1416 Cannot get geometry object from data you send to the GEOMETRY field 

Вот мой seeders/CitySeeder.php класс. Поле geo_coords использует POINT тип данных:

<?php 

use Phinx\Seed\AbstractSeed; 

class CitySeeder extends AbstractSeed 
{ 
    public function run() 
    { 
     $data = [ 
      [ 
       'name' => 'birmingham', 
       'geo_coords' => 'POINT(0 0)' 
      ], 
      [ 
       'name' => 'london', 
       'geo_coords' => 'POINT(0 0)' 
      ], 
      [ 
       'name' => 'liverpool', 
       'geo_coords' => 'POINT(0 0)' 
      ], 
      [ 
       'name' => 'manchester', 
       'geo_coords' => 'POINT(40 -100)' 
      ], 
     ]; 

     $cityTable = $this->table('city'); 
     $cityTable->insert($data)->save(); 
    } 
} 

что странно, потому что если я вхожу, что вручную в базу данных она работает.

Должна ли форматироваться долгота/широта определенным образом? Я попытался использовать массив, а пробел разделил формат long lat, но я все равно получаю ту же ошибку. Я даже дошел до исходного кода, но не нашел ничего полезного.

Любая помощь будет высоко оценена.

Редактировать

Я проверил код из библиотеки Phinx, где происходит ошибка:

public function insert(Table $table, $row) 
{ 
    $this->startCommandTimer(); 
    $this->writeCommand('insert', array($table->getName())); 

    $sql = sprintf(
     "INSERT INTO %s ", 
     $this->quoteTableName($table->getName()) 
    ); 

    $columns = array_keys($row); 
    $sql .= "(". implode(', ', array_map(array($this, 'quoteColumnName'), $columns)) . ")"; 
    $sql .= " VALUES (" . implode(', ', array_fill(0, count($columns), '?')) . ")"; 

    $stmt = $this->getConnection()->prepare($sql); 

    $stmt->execute(array_values($row)); 
    $this->endCommandTimer(); 
} 

Данные из array_values($sql) в момент неудачи:

array(2) { 
    [0]=> 
     string(10) "birmingham" 
    [1]=> 
     string(26) "POINT(0 0)" 
} 

И задан запрос после $sql:

string(55) "INSERT INTO `city` (`name`, `geo_coords`) VALUES (?, ?)" 

При выполнении следующих после prepare(): die(var_dump($stmt->debugDumpParams()));:

SQL: [55] INSERT INTO `city` (`name`, `geo_coords`) VALUES (?, ?) 
Params: 0 
NULL 

Logging запросов MySQL показывает следующее:

2016-12-12T12:53:12.721287Z 12 Query INSERT INTO `city` (`name`, `geo_coords`) VALUES ('birmingham', 'POINT(0, 0)') 

Я считаю, что это неправильно, потому что POINT вставляется как строка?

+0

Возможно Южный полюс -90 градусов, так -100 не может существовать: -? –

+0

Но он отлично работает, если я пишу SQL-запрос для вставки 'POINT (40 -100)'. Даже если я вхожу в «POINT (10, 10)», например, я получаю ту же ошибку. – BugHunterUK

+0

Трудно сказать, что все равно. У нас есть ошибка MySQL, но только PHP-код для проверки. –

ответ

1

Решил проблему с помощью следующих действий:

<?php 

use Phinx\Seed\AbstractSeed; 

class CitySeeder extends AbstractSeed 
{ 
    public function run() 
    { 
     $data = [ 
      [ 
       'name' => 'birmingham', 
       'geo_coords' => [0, 0], 
      ], 
      [ 
       'name' => 'london', 
       'geo_coords' => [0, 0], 
      ], 
      [ 
       'name' => 'liverpool', 
       'geo_coords' => [0, 0], 
      ], 
      [ 
       'name' => 'manchester', 
       'geo_coords' => [0, 0], 
      ], 
     ]; 

     $conn = $this->getAdapter()->getConnection(); 
     $sth = $conn->prepare('INSERT INTO city (`name`, `geo_coords`) VALUES (?, POINT(?, ?))'); 

     foreach($data as $key => $val) 
     { 
      $sth->execute([ 
       $val['name'], 
       $val['geo_coords'][0], 
       $val['geo_coords'][1]] 
      ); 
     } 
    } 
}