Ansicht:   

#454376

MagicBird

Berlin,
26.05.2022, 15:11:48

php mysql, oh der schlauch ist lang (web.coding)

Hallo Forum,

Seid tagen versuche ich mein Fehler zufinden.
Ich empfange mit einem NodeMCU und einer 433MHz RX meine Fernbedinung und lasse entsprechend dann den Status ändern.

Nun habe ich aber auch eine 2 Fernbedinung und wollte die Codeauslesen und dann aus der Tabelle nehmen und in die controltbl setzten.

aber mein Script schreibt die für dieTabelle ungekannten Codes nicht.

<?php

require_once '../include/config.include.php';
require_once '../include/mysql_connect.include.php';
require_once '../include/mqtt_connect.include.php';
require_once '../include/date_time.include.php';

require "../vendor/autoload.php";

if ($_GET['rxcode'] == true) {
  $sql = "SELECT * FROM $controltbl WHERE oncode = ".$_GET['rxcode']."";
  foreach ($pdo->query($sql) as $row)
  if ($row['oncode'] == $_GET['rxcode']) {
    $mqtt = new \PhpMqtt\Client\MQTTClient($server, $port, $clientId);
    $mqtt->connect();
    $mqtt->publish($row['mqtt_msg'] ,$row['mqtt_status_on'] , $row['mqtt_qos']);
    $mqtt->close();
    $sql = "UPDATE $controltbl SET status = '1' WHERE oncode = ".$_GET['rxcode']."";
    $pdo->exec($sql);
    $sql = "INSERT INTO $recievedtbl (id, codecs, date, time) VALUES (NULL, '".$_GET['rxcode']."', '$date', '$time')";
    $pdo->exec($sql);
    }
  else {
    $sql = "INSERT INTO $unknowtbl (id, code, date, time) VALUES (NULL, '".$_GET['rxcode']."', '$date', '$time')";
    $pdo->exec($sql);
    }
  $sql = "SELECT * FROM $controltbl WHERE offcode = ".$_GET['rxcode']."";
  foreach ($pdo->query($sql) as $row)
  if ($row['offcode'] == $_GET['rxcode']) {
    $mqtt = new \PhpMqtt\Client\MQTTClient($server, $port, $clientId);
    $mqtt->connect();
    $mqtt->publish($row['mqtt_msg'] , $row['mqtt_status_off'], $row['mqtt_qos']);
    $mqtt->close();                                                             
    $sql = "UPDATE $controltbl SET status = '0' WHERE offcode = ".$_GET['rxcode']."";
    $pdo->exec($sql);
    $sql = "INSERT INTO $recievedtbl (id, codecs, date, time) VALUES (NULL, '".$_GET['rxcode']."', '$date', '$time')";
    $pdo->exec($sql);
    }
  else {
    $sql = "INSERT INTO $unknowtbl (id, code, date, time) VALUES (NULL, '".$_GET['rxcode']."', '$date', '$time')";
    $pdo->exec($sql);
    }
  }
else {
  echo "Digga rxcode Variable setzten!";
  }
require_once '../include/mysql_disconnect.include.php';

?>



Nun hatte ich das ganze Script schon in prepared Statmente umgebaut als pspad ein Fehlermeldung bracht. na super.

Warum vergleichen die Abfragen nicht richtig.

dankeLars

#454377

MudGuard zur Homepage von MudGuard

München,
26.05.2022, 15:20:23

@ MagicBird

php mysql, oh der schlauch ist lang

>

<?php
> if ($_GET['rxcode'] == true) {
> $sql = "SELECT * FROM $controltbl WHERE oncode = ".$_GET['rxcode']."";
> 



oh-oh. Daten vom Kunden ohne Prüfung des Werts und ohne Escaping in's SQL zu übernehmen ist - ich sag's mal vorsichtig - mutig ...

Welchen Typ haben die Spalten oncode, offcode?
Was steht tatsächlich in $_GET['rxcode'] drin?

Du machst keinerlei Fehlerbehandlung bei den SQL-Kommandos. Das solltest Du aber machen, und dabei insbesondere dann auf ggf. auftretende Fehlermeldungen achten.

--
[image]
MudGuard
O-o-ostern

#454379

MagicBird

Berlin,
26.05.2022, 15:46:31

@ MudGuard

php mysql, oh der schlauch ist lang

Ja leider ist mir die fertige datei im pspad abgeraucht nun darf ich es neu machen.

ja der rxcode
id: 1095 - Code: 4461844 am 26.05.22 und um 11:02:41
so lasse ich mir die ausgabe anzeigen. die Nummer die ich besitze da passt es aber die neue Fernbedinung, der ESP reicht mir die nummer im IDE Monitor aber in dem PHP fliegen die wohl durch.

ich habe nun die ganzen Zeilen raus genommen und mal nur mit den if abfragen gespielt.

<?php

require_once '../include/config.include.php';
require_once '../include/mysql_connect.include.php';
require_once '../include/mqtt_connect.include.php';
require_once '../include/date_time.include.php';

require "../vendor/autoload.php";

if ($_GET['rxcode'] == true) {

  if ('1' == $_GET['rxcode']) {
echo "1<br>";
    }
  else  if ('2' == $_GET['rxcode']) {
echo "2<br>";
    }
  else {
echo "3<br>";
    }
  }
else {
  echo "Digga rxcode Variable setzten!";
  }
require_once '../include/mysql_disconnect.include.php';

?>



denke mal, werde nach dem rx= true (isset) vergleich dann erstmal schauen ob es die nummer gibt, sonst gleich durch und dann noch einmal prüfung wo befindet sich der code.

CREATE TABLE `control` (
`id` int(11) NOT NULL,
`areaname` varchar(255) NOT NULL,
`switchname` varchar(255) NOT NULL,
`icon` varchar(255) NOT NULL,
`status` int(1) NOT NULL,
`oncode` varchar(255) NOT NULL,
`offcode` varchar(255) NOT NULL,
`mqtt_msg` text NOT NULL,
`mqtt_status_on` text NOT NULL,
`mqtt_status_off` text NOT NULL,
`mqtt_qos` varchar(255) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

Lars

#454381

MagicBird

Berlin,
26.05.2022, 16:17:34

@ MagicBird

php mysql, oh der schlauch ist lang

hier ist schon feierabend, komme nicht bis zum unbekannt...


require "../vendor/autoload.php";

if ($_GET['rxcode'] == true) {
  $statement = $pdo->prepare("SELECT * FROM $controltbl WHERE oncode = :oncode OR offcode = :offcode");
  $statement->execute(array('oncode' => $_GET['rxcode'], 'offcode' => $_GET['rxcode']));   
  while($row = $statement->fetch()) {
    if ($_GET['rxcode'] == $row['oncode']) {
      echo "on";
    }
    else if ($_GET['rxcode'] == $row['offcode']) {
      echo "off";
    }
    else {
    echo "unbekannt";
    }

    }
  }
else {
  echo "Digga rxcode Variable setzten!";
  }
require_once '../include/mysql_disconnect.include.php';

?>

#454386

MudGuard zur Homepage von MudGuard

München,
26.05.2022, 18:36:58

@ MagicBird

php mysql, oh der schlauch ist lang

> [code]require "../vendor/autoload.php";
>
> if ($_GET['rxcode'] == true) {
> $statement = $pdo->prepare("SELECT * FROM $controltbl WHERE oncode =
> :oncode OR offcode = :offcode");
> $statement->execute(array('oncode' => $_GET['rxcode'], 'offcode' =>
> $_GET['rxcode']));

viel besser, durch die prepared statements sind die Werte escaped.

Aber Fehlerbehandlung ist immer noch keine vorhanden. execute liefert z.B. ein boolean zurück - false bei Fehler - dann kann man mit errorCode bzw. errorInfo genaueres zum Fehler erfahren.

--
[image]
MudGuard
O-o-ostern

#454387

MagicBird

Berlin,
26.05.2022, 19:49:04

@ MudGuard

php mysql, oh der schlauch ist lang


if ($_GET['rxcode'] == true) {
  $statement = $pdo->prepare("SELECT * FROM $controltbl WHERE oncode = :oncode OR offcode = :offcode");
  $statement->execute(array('oncode' => $_GET['rxcode'], 'offcode' => $_GET['rxcode']));
  $anzahl_user = $statement->rowCount();   
  while($row = $statement->fetch()) {
    if ($_GET['rxcode'] == $row['oncode']) {
      echo $_GET['rxcode'];
    }
    else if ($_GET['rxcode'] == $row['offcode']) {
      echo $_GET['rxcode'];
    } 
  }
}
else {
  echo "Digga rxcode Variable setzten!";
}
  
if ($anzahl_user == '0') {
  echo "eingetragen";
}



also mit der aussage konnte ich leider nichts anfangen, errorinfo...

lösung ist, einträge zählen selbst bei 0 ist es der prepared wurst und schreibt nicht.

Lars

Ansicht:   
Auf unserer Web-Seite werden Cookies eingesetzt, um diverse Funktionalitäten zu gewährleisten. Hier erfährst du alles zum Datenschutz