PHP Button mit Zwei Funktionen

TomHaland

Cadet 1st Year
Registriert
Dez. 2021
Beiträge
12
Hallo,

ich habe ein Bearbeitungsfeld mit Speicherbutton.
Das funktioniert.
Nun kann ich abgespeicherte Daten dort wieder aufrufen. das funktioniert auch.

Ich möchte nun meinen Speicherbutten mit einem UPDATE SQL Befehl belegen, für den Fall, dass ich das aufgerufenen ändern möchte.

Meine Idee: Ich habe den Zeilen id's verpasst.
Nun bekomme ich es einfach nicht hin diese in einen if else einzubauen:
Mein Versuch war von der Art

if(!isset($_POST ['id']))
{SQL Speichern}
else{SQL Update}

Bin ich da auf dem Holzpfad?
 
Es gibt hier insgesamt 3 Hauptfehlerquellen, die Du untersuchen solltest:
1. Benutzt Du gesonderte Formulare für die Neuanlage und das Update?
2. Hast Du abhängig von Neuanlage bzw. Update ein einziges Formular, in dem das Feld mit dem Namen id nur ausgegeben wird, falls es ein Update ist?
3. Vermischst Du im Formular die Attribute name und id und Deine isset Prüfung läuft damit gegen etwas falsches?
Eventuell solltest Du Deinen Code (sieht ja schwer nach PHP aus) posten, dann kann Dir leichter geholfen werden.
 
Hi...

In dem grundsätzlichen Bezug grad' auch nach vorig Beigetragenem hinsichtlich auf Prüfungsargumente ist vllt. auch eine if-else-Abfrage nicht so zielführend, sondern eher der switch-Befehl mit einem case-Konstrukt.​

Btw.:
chris221177 schrieb:
[...] sieht ja schwer nach PHP aus [...]
Ja, hat er doch im Titel geschrieben.
 
Hallo zusammen,
ich habe inzwischen etwas geändert und mein Problemliegt wohl in der UPDATE Anweisung.
Die wird nicht ausgeführt, funktioniert aber in der shell mit Konstanten belegt.
Erkennt jemand den Fehler ??

if(!empty($_POST['id'])){

$user = $_SESSION['username'];
$sql = "UPDATE Inventar SET User = '$user', Abteilung ='$abt', Einrichtung ='$invent', Telefon ='$phone' WHERE ID =". $_GET['id'];

$stmt =db_conn ->query($sql);
}else{
Speichern funktioniert}
 
Kann's sein, dass nur ein schließendes Anführungszeichen in der Update-Zeile hinter der GET-Variable fehlt?

Korrigierter Code:
PHP:
if(!empty($_POST['id'])){

$user = $_SESSION['username'];
$sql = "UPDATE Inventar SET User = '$user', Abteilung ='$abt', Einrichtung ='$invent', Telefon ='$phone' WHERE ID =". $_GET['id']";

$stmt =db_conn ->query($sql);
}else{
Speichern funktioniert}
 
@TomHaland Etwas Offtopic, aber du solltest dich auch dringend mit dem Thema SQL Injections beschäftigen, sonst bist du nicht länger alleine in deiner Datenbank.

https://de.wikipedia.org/wiki/SQL-Injection

PHP PDO bietet hier tolle Möglichkeiten sowas abzufangen.

Edit:
User007 schrieb:
Kann's sein, dass nur ein schließendes Anführungszeichen in der Update-Zeile hinter der GET-Variable fehlt?
Ne, eigentlich nicht. $var2 = "foo" . $var1; ist völlig legitim.
 
  • Gefällt mir
Reaktionen: [ChAoZ], sp00n.82, sandreas und 2 andere
@User007: ich denke mal, dass ist hinter dem letzten Gleichheitszeichen. Also so hat es zumindest an anderer Stelle funktioniert.

@Der Lord: Danke, das Problem ist mir bekannt, aber eins nach dem anderen.;) Multitasking ist nicht meine Stärke
 
Was heißt Multitasking, man sollte es lediglich von Beginn an richtig umsetzen, da sonst solcher Code oftmals genau so einfach unverändert online bleibt und damit jede Menge Potenzial bietet dir deine DB zu kapern. Nur ein gut gemeinter Ratschlag. :)

Ansonsten hat @chris221177 schon genau die richtigen Fragen gestellt. Diese mal in Ruhe durchgehen.Ansonsten hast du auch nicht konkret beschrieben was nicht klappt. Kommen Fehlermeldungen? Syntaxfehler? Logische Fehler? :)
 
  • Gefällt mir
Reaktionen: sp00n.82
TomHaland schrieb:
ich denke mal, dass ist hinter dem letzten Gleichheitszeichen.
Ach, verflixt...ja, richtig - das ist mir i-wie entgangen, dass das ja die regulär schließenden Anführungszeichen sind. 🤷‍♂️
 
Danke euch.
also es lag an fehlenden "" mit "'$user'" funktioniert es prima.

Das mit dem Code einfügen ist gar nicht so einfach. Zum einen arbeite ich nicht auf dem Rechner, mit dem ich online bin. Zum anderen kann ich da nicht einmal per Stick so einfach Daten übertragen.

Daher poste ich gerade nur Bruchstücke.
Aber ich bin dabei mir einen anderen Rechner zu besorgen, dann wird das künftig unkomplizierter.
 
Schau auch mal in Richtung UPSERT. Das ist genau für das im OP angesprochene Problem da.
 
Häng mal an deine URL folgendes an:

Code:
?id=0%20OR%20ID%20%3E%200

Code:
0 OR ID > 0
Dann siehst du recht schnell, dass der Kommentar von @Der Lord sehr wichtig ist... dann wird die ganze Tabelle überschrieben... und das ist nicht das schlimmste, was man machen könnte...
 
  • Gefällt mir
Reaktionen: [ChAoZ], sp00n.82 und Der Lord
@sandreas : Da hast Du mich evtl missverstanden, mir ist die Wichtigkeit bewusst. ich fühle mich nur überfordert, wenn ich mich JETZT darum kümmere. Zuerst wollte ich es funktionsfähig haben, dann kümmere ich mich um das Thema Sicherheit. Mir taugt das;)
 
Du hast auch einmal $_POST['id'] und einmal $_GET['id']. Die beiden Werte müssen nicht übereinstimmen, das könnte evtl. zu unerwarteten Inkonsistenzen führen. Bei abgesendeten Formularen hast du in der Regel ja nur POST, also beschränke dich darauf.
Oder falls die Variable id im Formular etwas anderes bedeutet als die Variable id in der Url, dann benenne sie auch entsprechend (zb user_id oder entry_id, etc).

Und ja, beschäftige dich unbedingt mit Prepared Statements (PDO).
Wenn dir das erstmal zu viel ist, dann parse zumindest mal die Werte, zb mit $id = (int) $_POST['id']; oder $id = intval($_POST['id']); und verwende das dann im SQL Statement.
Vertraue niemals Werten, die von außerhalb kommen.
 
  • Gefällt mir
Reaktionen: sandreas
Also Prepared Statements mit PDO zu benutzen ist inzwischen SO einfach, da lohnt es sich gar nicht, was anderes wegen Einfachheit zu machen...
Ich finde sogar, dass es dadurch deutlich übersichtlicher wird.
PHP:
// dieses konstrukt hier sorgt dafüf, dass id immer einen gültigen int wert hat, ohne eine PHP Notice zu riskieren
$id = (int)($_POST['id'] ?? 0);
if($id > 0){
    $user = $_SESSION['username'];
    $sql = "UPDATE Inventar SET User = :user, Abteilung = :abt, Einrichtung =:invent, Telefon = :phone WHERE ID = :id";
    $stmt = $dbh->prepare($sql);
    $stmt->execute([
        'user' => $user,
        'abt' => $abt,
        'invent' => $invent,
        'phone' => $phone,
        'id' => $id,
    ]);
}else{
    // Speichern funktioniert
}
 
  • Gefällt mir
Reaktionen: sp00n.82
Zurück
Oben