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"
Und die "index.php"
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);
?>
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 458023
Url: https://administrator.de/contentid/458023
Ausgedruckt am: 19.11.2024 um 05:11 Uhr
3 Kommentare
Neuester Kommentar
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
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
Was lernen wir daraus , schreibe keine Posts nach 0 Uhr 😁.