Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/273.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php GPS坐标的最佳MySQL数据库格式类型是什么?_Php_Mysql_Database_Decimal_Rounding - Fatal编程技术网

Php GPS坐标的最佳MySQL数据库格式类型是什么?

Php GPS坐标的最佳MySQL数据库格式类型是什么?,php,mysql,database,decimal,rounding,Php,Mysql,Database,Decimal,Rounding,我有一个脚本,它将纬度和经度插入MySQL数据库。我已将这些行指定为: `gpslat` DECIMAL(11,4) NOT NULL , `gpslong` DECIMAL(11,4) NOT NULL , 出于某种原因,当我传递字符串gpslat=45.7834和gpslong=78.7834时,我在数据库中得到一个值,而没有完整的字符串gpslat=45.0000和gpslong=78.0000 你知道为什么这不仅仅是发送完整的值吗 PHP添加: function upload($

我有一个脚本,它将纬度和经度插入MySQL数据库。我已将这些行指定为:

`gpslat` DECIMAL(11,4)  NOT NULL ,
`gpslong` DECIMAL(11,4)  NOT NULL ,
出于某种原因,当我传递字符串
gpslat=45.7834
gpslong=78.7834
时,我在数据库中得到一个值,而没有完整的字符串
gpslat=45.0000
gpslong=78.0000

你知道为什么这不仅仅是发送完整的值吗


PHP添加:

function upload($lat, $long) {

if (gpsData['error']==0) {
    $result = query("INSERT INTO gpsTable(gpslat,gpslong) VALUES('%d','%d')",$lat,$long);
}
在这种情况下,我将
$lat
$long
值传递为
$lat=45.7834
$long=78.7834

查询功能:

function query() {
global $link;
$debug = false;

//get the sql query
$args = func_get_args();
$sql = array_shift($args);

//secure the input
for ($i=0;$i<count($args);$i++) {
    $args[$i] = urldecode($args[$i]);
    $args[$i] = mysqli_real_escape_string($link, $args[$i]);
}

//build the final query
$sql = vsprintf($sql, $args);

if ($debug) print $sql;

//execute and fetch the results
$result = mysqli_query($link, $sql);
if (mysqli_errno($link)==0 && $result) {

    $rows = array();

    if ($result!==true)
    while ($d = mysqli_fetch_assoc($result)) {
        array_push($rows,$d);
    }

    //return json
    return array('result'=>$rows);

} else {

    //error
    return array('error'=>'Database error');
}
}
函数查询(){
全球美元联系;
$debug=false;
//获取sql查询
$args=func_get_args();
$sql=数组移位($args);
//保护输入
对于($i=0;$i$行);
}否则{
//错误
返回数组('error'=>'Database error');
}
}

由于您在查询中使用的是
%d
,并且在PHP上没有使用该格式的MySQL调用(MySQLi使用
,PDO使用实名),因此我假设您的
查询
函数正在使用
sprintf
函数来构建SQL查询。(更新:我从您的更新中看出我是对的。)

根据,a
%d
表示(我的重点):

参数被视为一个整数,并以(有符号)十进制数表示

要使用的正确格式字符串为
%f

该参数被视为一个浮点数,并表示为一个浮点数(区域设置感知)

(或者,如果不希望输入具有区域设置意识,请改用
%F
。)



(在任何情况下,如果您从用户(或用户控制的设备)接受此数据,您确实应该使用参数化查询(文档为,),而不是滚动您自己的SQL查询生成器。)

您确定PHP代码不是问题所在吗?如果您使用的是参数化查询(您应该这样做),那么参数的类型是否正确?向我们展示你使用的代码可能会有所帮助。检查这个链接@TheClouds我不认为这与当前帖子有任何关系,他的专栏类型是正确的。普雷斯托,请添加用于为表提供数据的php代码,以及用于检索数据的php代码。如果您正在进行大量基于位置的工作,您可能会对使用“原始”十进制字段而不是“原始”十进制字段感兴趣。@OlivierH我添加了具有插入查询的php。非常好!非常感谢。是的,我同意我需要使用参数化查询。从长远来看,我会清理它,只是现在就尝试构建基本结构。我上传了
query
函数,如果您对查询参数化有任何快速建议,我将不胜感激。否则,我将审查你的参考资料,并在长期内清理它。再次感谢!查看准备好的(即参数化的)
mysqli\uu
查询。问题是使用<代码>准备< /COD>和<代码> BIDPARPARM 方法。谢谢,我会检查出来并把它们全部清理干净。另一个建议:除非你在坐标上做数学运算(甚至是在那时),否则你可以考虑把它们存储为字符串而不是浮点。它使用了更多的存储空间,但避免了使用无法以浮点格式精确表示的值时可能遇到的任何精度问题。@GeminiDomino只要在列定义上设置正确的精度(在本问题中,该定义指定为小数点后4位),精度就不是问题。