2017-06-01 86 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>';