2017-06-01 94 views
1

对于我的inhome温度传感器,我使用的是使用php,sqlite,PDO和HTML的树莓派。PHP PDO选择查询返回双精度值

我已经创建源码

表使用

BEGIN; 
CREATE TABLE waarden (datum TEXT, tijd TEXT, zone TEXT, lucht REAL, temperatuur REAL); 
COMMIT; 

我与DHT22 RPI记录一切细所以没有我创建了一个网页,使用以下php.file访问通过AJAX数据

<?php 
function datumConversie($datum){  
    $delen = explode('/',$datum,3); 
    $geconverteerd = $delen[2].$delen[0].$delen[1]; 
    return $geconverteerd; 
} 
ini_set('display_errors', 'On'); 
error_reporting(E_ALL | E_STRICT); 

$db = new PDO("sqlite:/home/pi/sensor.db"); 
$result_array = array(); 
$date = $_POST["datepicker"]; 
$waarde = datumConversie($date); 
$tijd=""; 
$temperatuur=""; 
$query = "SELECT datum, tijd, zone,lucht, temperatuur FROM waarden WHERE datum = $waarde"; 
$result = $db->query($query); 

foreach($result as $row) 
{ 
    array_push($result_array, $row); 
} 
echo json_encode($result_array); 
$db = null; 
?> 

问题是,当我在浏览器响应看来,值返回两次。一次使用适当的字段名称,一次使用它们的列索引。 (0表示数据,1表示tijd等)。见下面

{“datum”:“20170601”,“0”:“20170601”,“tijd”:“00:01”,“1”:“00:01”,“zone”:“kelder” “2”:“kelder”,“lucht”:“53.0”,“3”:“53.0”,“temperatuur”:“24.3”,“4”:“24.3”}, {“datum”:“20170601 ”, “0”: “20170601”, “tijd”: “0点06分”, “1”: “0点06分”, “区”: “kelder”, “2”: “kelder”, “卢赫特”: “53.1”,“3”:“53.1”,“temperatuur”:“24.3”,“4”:“24.3”}, {“datum”:“20170601”,“0”:“20170601”“tijd” : “0点11分”, “1”: “0点11分”, “区”: “kelder”, “2”: “kelder”, “卢赫特”: “53.1”, “3”: “53.1”,” temperatuur“:”24.2“,”4“:”24.2“},

我该如何避免这种情况。我已经尝试了几次转换,最终可以正常工作,但这只是修补了一些缺陷而没有解决原因?

任何建议

回答

2

设置默认的提取模式,像这样

$db->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_OBJ); 

或者

$db->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_ASSOC); 

运行前取

$db->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_ASSOC); 
foreach($result as $row) { 
    array_push($result_array, $row); 
} 

或者使用一个内衬更换fetchAll()和使用的准备和参数化的语句,以及以减轻SQL Injection Attack

$query = "SELECT datum, tijd, zone,lucht, temperatuur 
      FROM waarden 
      WHERE datum = :datum"; 
$result->prepare($query); 

$result->execute([':datum'=>$waarde]); 

$result_array = $result->fetchAll(PDO::FETCH_ASSOC); 

的参数fetchAll(PDO::FETCH_ASSOC)控制如何结果将被退回。

+0

真快,谢谢。 已添加 $ db-> setAttribute(PDO :: ATTR_DEFAULT_FETCH_MODE,PDO :: FETCH_OBJ); 现在一切都很完美!谢谢 – MaPo

+0

值得一提的是,上面的OP代码示例易受SQL注入的影响。即使你知道/信任变量'$ waarde'来自哪里,它总是更好地使用准备好的语句。 – ecarrizo

+1

@ecarrizo真的,我只是懒惰。修订 – RiggsFolly

1

试试这个示例代码...

$sth = $db->prepare("SELECT datum, tijd, zone,lucht, temperatuur FROM waarden WHERE datum = :datum"); 
$sth->execute(array('datum' => $waarde)); 
$result = $sth->fetchAll(PDO::FETCH_ASSOC); 

echo '<pre>'; 
print_r($result); 
echo '</pre>';