Die PHP-PDO-Select-Abfrage gibt doppelte Werte zurück

Lesezeit: 2 Minuten

Für meinen Inhome-Temperatursensor verwende ich ein Himbeer-Pi mit PHP, SQLite, PDO und HTML.

Ich habe eine Tabelle in SQLite erstellt

Verwenden

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

Mein rpi mit DHT22 zeichnet alles gut auf, also habe ich eine Webseite erstellt, die über AJAX auf die Daten zugreift, indem ich die folgende php.file verwende

<?php
function datumConversie($datum){    
    $delen = explode("https://stackoverflow.com/",$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;
?>

Das Problem ist, dass, wenn ich in die Browser-Antwort schaue, es scheint, dass Werte zweimal zurückgegeben werden. Einmal mit ihrem entsprechenden Feldnamen und einmal mit ihrem Spaltenindex. (0 ist datum, 1 ist tijd usw.). Siehe unten

{“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″,”zone”:”kelder”,”2″:”kelder”,”lucht”:”53.1″,”3″:”53.1″,”temperatuur”:”24.2″,” 4″:”24,2″},

Wie kann ich das vermeiden. Ich habe mehrere Konvertierungen ausprobiert, die am Ende funktionieren können, aber das ist nur das Patchen eines Fehlers, ohne die Ursache anzugehen?

Irgendwelche Vorschläge

Benutzer-Avatar
RiggsFolly

Stellen Sie den Standardabrufmodus so ein

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

Oder

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

bevor der Abruf ausgeführt wird

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

Oder durch einen Einzeiler ersetzen fetchAll() und verwenden Sie auch vorbereitete und parametrisierte Anweisungen, um SQL-Injection-Angriffe abzuwehren

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

Der Parameter zu fetchAll(PDO::FETCH_ASSOC) steuert, wie Ergebnisse zurückgegeben werden.

  • Das ging schnell, danke. $db->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_OBJ) hinzugefügt; Jetzt ist alles perfekt! Danke

    – MaPo

    1. Juni 2017 um 12:17 Uhr


  • Es ist erwähnenswert, dass das obige Beispiel für OP-Code anfällig für SQL-Injection ist. Es ist immer besser, vorbereitete Anweisungen zu verwenden, auch wenn Sie wissen/vertrauen, wo die Variable ist $waarde kommt von.

    – Ecarrizo

    1. Juni 2017 um 12:40 Uhr


  • @ecarrizo Stimmt, ich war nur faul. Geändert

    – RiggsFolly

    1. Juni 2017 um 15:29 Uhr

Versuchen Sie diesen Beispielcode …

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

1018640cookie-checkDie PHP-PDO-Select-Abfrage gibt doppelte Werte zurück

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy