MaP*_*aPo 2 php sqlite ajax pdo
对于我的家用温度传感器,我使用的是带有 php、sqlite、PDO 和 HTML 的树莓派。
我在 sqlite 中创建了一个表
使用
BEGIN;
CREATE TABLE waarden (datum TEXT, tijd TEXT, zone TEXT, lucht REAL, temperatuur REAL);
COMMIT;
Run Code Online (Sandbox Code Playgroud)
我使用 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;
?>
Run Code Online (Sandbox Code Playgroud)
问题是,当我查看浏览器响应时,值似乎返回了两次。一次使用其适当的字段名称,一次使用其列索引。(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":"00:06","1":"00:06","zone":"kelder","2":"kelder","lucht":"53.1","3" :"53.1","temperatuur":"24.3","4":"24.3"}, {"datum":"20170601","0":"20170601","tijd":"00:11"," 1":"00:11","区域":"kelder","2":"kelder","lucht":"53.1","3":"53.1","temperatuur":"24.2","4":"24.2"},
我怎样才能避免这种情况。我已经尝试了几种最终可以工作的转换,但这只是修补了一些缺陷而没有解决原因?
有什么建议
像这样设置默认的获取模式
$db->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_OBJ);
Run Code Online (Sandbox Code Playgroud)
或者
$db->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_ASSOC);
Run Code Online (Sandbox Code Playgroud)
在运行提取之前
$db->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_ASSOC);
foreach($result as $row) {
array_push($result_array, $row);
}
Run Code Online (Sandbox Code Playgroud)
或者fetchAll()使用准备好的和参数化的语句替换为单行,以减轻SQL 注入攻击
$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);
Run Code Online (Sandbox Code Playgroud)
fetchAll(PDO::FETCH_ASSOC) 控制如何返回结果的参数。