Php 首先在表中插入并更新经度和纬度

Php 首先在表中插入并更新经度和纬度,php,mysql,Php,Mysql,如何首先插入经度和纬度,然后在存在时更新它?我用代码中的查询语句进行了尝试,但我在第28行的C:\xampp\htdocs\bustracker\index.php中得到了这个错误Parse error:syntax error,意外的“Table”(T_STRING),但是如果删除了插入查询,我会得到输出Table exist <?php $json = '{"latitude":93.86898451,"longitude":40.66561387,"time":"27.04.2015

如何首先插入经度和纬度,然后在存在时更新它?我用代码中的查询语句进行了尝试,但我在第28行的C:\xampp\htdocs\bustracker\index.php中得到了这个错误
Parse error:syntax error,意外的“Table”(T_STRING)
,但是如果删除了插入查询,我会得到输出
Table exist

<?php
$json = '{"latitude":93.86898451,"longitude":40.66561387,"time":"27.04.2015 20:11:05","route":4}';
$data = json_decode ( $json );
$route = "route_" . $data->{'route'};
$latitude = $data->{'latitude'};
$longitude = $data->{'longitude'};
$recordingTime = $data->{'time'};

require 'connection.php';

// check whether route's table exist.
$results = $con->query ( "SHOW TABLES LIKE'" . $route . "'" ) or die ( mysqli_error () );

if (($results->num_rows) == 1) {
  //The error is in this query.
    $con->query ( "INSERT INTO ".$route."(latitude, longitude)
         VALUES(".$latitude.", ".$longitude.")
         ON DUPLICATE KEY UPDATE
         latitude = ".$latitude.", 
         longitude = ".$longitude) or die ( $con->error );

echo "Table exist";  
} else {
  $con->query ( "CREATE TABLE " . $route . "
       (id INT(11) NOT NULL AUTO_INCREMENT PRIMARY KEY,
     latitude FLOAT(10,6) NOT NULL, 
     longitude FLOAT(10,6) NOT NULL,
     created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP)" ) or die ( $con->error );

  echo "table was craeted";
}

?>

下面是一个示例,说明如何将准备好的语句绑定占位符一起使用。对于调试动态生成的SQL,将生成的SQL文本分配给一个变量通常会有所帮助,然后可以显示该文本以进行调试

  $sql = "INSERT INTO `".$route."`(latitude, longitude, created_at)
          VALUES( ? , ? , NOW() )
          ON DUPLICATE KEY 
          UPDATE latitude = VALUES(latitude)
               , longitude = VALUES(longitude)";

  #var_dump($sql); # for debugging
  $stmt = $con->prepare($sql) or die ( $con->error );
  $stmt->bind_param("ss",$latitude,$longitude);
  $stmt->execute();

  $stmt->close();
在这个例子中,我们需要确保
$route
是一个有效的标识符;这里有可能通过
$route
的值进行SQL注入。(我们无法为标识符提供绑定占位符。)

现在还不清楚insert将如何抛出“复制键”异常;我们看不到哪些列集被定义为主键或唯一键


我们可以使用特殊的values()函数,在更新时引用插入表达式的值列表中的值,如上所示。我们不必在语句中提供“latitude”值的多个副本。

您有语法错误
longitude=“.$longitude.”)或die($con->error)
$longitude
Hi@tree之后删除
”。在IDE中很容易发现PHP语法错误-尝试Eclipse、NetBeans或PHP Storm之类的方法。我已经删除了它,但这行
longitude=“.longitude.”中还有另一个错误($con->error)或die($con->error)
您能用代码的最新副本更新问题吗?注意,上面提到的语法错误是PHP错误,不是SQL错误。@tree:仍然有一个伪双引号字符
。您删除了圆点,但留下了双引号。(Augwa最初的评论指出有两个字符需要删除。)这是一个PHP语法错误,而不是SQL错误。您的代码似乎易受SQL注入攻击。最佳实践是使用绑定占位符准备语句。否则,在将潜在的不安全字符串包含在SQL文本中之前,需要对其进行正确转义。更新时
中的表达式可以引用值列表中的值,例如
latitude=values(latitude)
。只有一个问题,在我的案例中,我可以将我的
纬度
列作为唯一键吗?