ketanest112
Goto Top

SQL Syntax Error beim Escapen

Hallo zusammen,

nach nahezu 4 Stunden Eigenrecherche frag ich mal euch, ich komme nicht weiter.
Ich möchte mit meinem RasPi eine kleine Steuerung für eine Gartenbewässerung bauen, wofür ich diverse Wetterdaten über APIs in eine MariaDB Datenbank schreiben will.
Ich muss dazu sagen, besonders professionell programmieren tu ich nicht, aber für meine Zwecke reicht es.
Ich benutze PHP 7.3 und MariaDB 10.1.38.
Ich habe in meinen Scripts per MySQLi eine Verbindung erzeugt, die funktioniert auch wunderbar. Insert, Update, Delete, etc. funktioniert alles, ABER:
Nur, wenn ich nicht escape. Benutze ich die Methode $this->db->real_escape_string($query), schmeißt er mir einen Syntaxfehler.
Interessanterweise kriege ich selbigen, wenn ich über PHPMyAdmin den Query eingebe. Ich tippe daher darauf, dass es gar nicht an meinen Programmierkünsten liegt, sondern ich nur irgendwas an der DB umstellen muss...
Anbei angehängt meine Scripte. Die SQL_MODE Variablen habe ich schon abgefragt, ein NO_BACKSLASH_ESCAPES ist nicht dabei.

EDIT: Charset habe ich schon gechect, das stimmt soweit mit der DB überein (er zieht sich das Charset ja ohnehin über die DB-Connection).

Die Datei "db.php"
<?php
class db{
        private $db = null;
        private $host;
        private $user;
        private $pass;
        private $dbname;
        public function __construct($host, $user, $pass, $dbname){
                $this->host = $host;
                $this->user = $user;
                $this->pass = $pass;
                $this->dbname = $dbname;
        }
        private function connect(){
                $this->db = new mysqli($this->host, $this->user, $this->pass, $this->dbname);
                if($this->db->connect_errno){
                        echo "Fehler bei der Datenbankverbindung: ". $this->db->connect_error;  
                }else{
                        echo "DBconnect erfolgreich!";  
                }
        }
        public function insupdel($q){
                $this->connect();
                $q = $this->db->real_escape_string($q);
                echo $q;
                $this->db->query($q);
                if($this->db->errno){
                        return array("SUCCESS" => FALSE, "ERROR" => $this->db->error);  
                }else{
                        return array("SUCCESS" => TRUE);  
                }
        }
        public function select($q){
                $this->connect();
                $q = $this->db->real_escape_string($q);
                $this->result = $this->db->query($q);
                if($this->db->errno){
                        return array("SUCCESS" => FALSE, "ERROR" => $this->db->error);  
                }else{
                        $ret = array();
                        while($row = $this->db->fetch_assoc()){
                                $ret = $row;
                        }
                        return $ret;
                }
        }
}

?>

Und die "index.php"
<?php
error_reporting(E_ALL);
ini_set('display_errors', 'On');  
require_once("db.php");  
if($_GET['apikey']!="XXXXXXXXX"){  
        exit();
}
$db = new db("192.168.31.11", "weather", "XXXXXXXXXX", "weather");  
$res = $db->insupdel("INSERT INTO wetterdaten_json (quelle, timestamp, json_obj) VALUES ('asfd', 12345, 'asdf');");  
var_dump($res);
?>

Content-ID: 458023

Url: https://administrator.de/contentid/458023

Ausgedruckt am: 19.11.2024 um 05:11 Uhr

139920
Lösung 139920 02.06.2019 aktualisiert um 09:27:21 Uhr
Goto Top
Eigentlich ganz einfach, du maskierst den kompletten SQL Befehl statt nur die eigentlichen Daten und das führt logischerweise zur Exception da du ja auch die Hochkommata um die Daten maskierst.
https://stackoverflow.com/questions/37636126/can-i-use-mysql-real-escape ...
Ich würde dir stattdessen heutzutage zu Prepared Statements mit PDO raten.
https://www.php.net/manual/de/pdo.prepared-statements.php
ketanest112
ketanest112 02.06.2019 um 09:28:09 Uhr
Goto Top
Hallo shellschrubber,

danke für den Hinweis, auf den stackoverflow-thread bin ich zwar gestern auch gestoßen, aber irgendwie habe ich es nicht ganz gerafft...
Ich war wohl nicht mehr ganz auf dem Damm...

Jetzt kann ichs auch logisch nachvollziehen.

Da ich zum Arbeiten mit Prepared Statements meinen Code komplett überarbeiten müsste, hab ich einfach ne Funktion zum escapen in die db.php eingebaut. Jetzt geht es super!

Grüße
Ketanest
139920
139920 02.06.2019 um 10:47:55 Uhr
Goto Top
Was lernen wir daraus , schreibe keine Posts nach 0 Uhr 😁.