PHP PDO Select 查询返回双精度值

Posted

技术标签:

【中文标题】PHP PDO Select 查询返回双精度值【英文标题】:PHP PDO Select query returns double values 【发布时间】:2017-11-02 13:40:01 【问题描述】:

对于我的家用温度传感器,我使用的是带有 php、sqlite、PDO 和 html 的树莓派。

我已经在 sqlite 中创建了一个表

使用

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 等)。见下文

"基准":"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", "基准":"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", "基准":"20170601","0":"20170601","tijd":"00:11","1":"00:11","zone":"kelder","2":" kelder","lucht":"53.1","3":"53.1","temperatuur":"24.2","4":"24.2",

我怎样才能避免这种情况。我已经尝试了几种最终可以工作的转换,但这只是修补了一些缺陷而没有解决原因?

任何建议

【问题讨论】:

【参考方案1】:

像这样设置默认获取模式

$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) 的参数控制返回结果的方式。

【讨论】:

这很快,谢谢。添加了 $db->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_OBJ);现在一切都很完美!谢谢 值得一提的是,上面的 OP 代码示例很容易受到 SQL 注入的攻击。即使您知道/相信变量 $waarde 的来源,使用准备好的语句总是更好。 @ecarrizo 是的,我只是懒惰。修改【参考方案2】:

试试这个示例代码...

$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>';

【讨论】:

以上是关于PHP PDO Select 查询返回双精度值的主要内容,如果未能解决你的问题,请参考以下文章

sql查询双精度-null> 0不返回任何记录

PHP PDO mySQL 查询返回列名和整数

如何正确使用 PDO 对象进行参数化 SELECT 查询

PDO 不从 mysql 查询返回结果

PHP PDO Update语句总是返回0行受影响的rowCount()

来自函数返回数组的 PHP PDO 参数