我有一个脚本,它将纬度和经度插入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');
}
}
由于您在查询中使用%d
,并且PHP上没有使用该格式的MySQL调用(MySQLi使用?
,PDO使用实名),因此我假设您的query
函数使用sprintf
函数来构建SQL查询。(更新:我从你的更新中看到我是对的。)
根据sprintf
的文件,%d
的意思是(强调矿):
参数被视为整数,并显示为(带符号)十进制数。
您要使用的正确格式字符串是%f
:
该参数被视为float,并显示为浮点数(区域设置感知)。
(或者,如果您不希望输入具有区域设置意识,请改用%F
。)
(在任何情况下,如果您接受来自用户(或来自用户控制的设备)的数据,那么您确实应该使用参数化查询(MySQLi、PDO的文档),而不是滚动自己的SQL查询生成器。)