Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi MySQL & PHP-Problem (https://www.delphipraxis.net/143696-mysql-php-problem.html)

ecHo89 21. Nov 2009 11:40

Datenbank: MySQL von bplaced.net • Zugriff über: Delphi

MySQL & PHP-Problem
 
Hallo,

ich habe ein kleines PHP-Problem. Folgender Sachverhalt:
Ich hole schicke per
Delphi-Quellcode:
SendPostData(Ahttp: TIdHTTP; const AtoURL: string;
  const aParams: TStrings): string;
meine Daten an das PHP-Formular. Das funktioniert beim Eintragen wunderbar. Aber wie bekomm ich jetzt am geschicktesten das Ergebnis dann wieder zurück in meine App? Habs mir überlegt mit speichern in einer Datei und die dann per Delphi öffnen. Gibts einen besseren Weg?
Und außerdem soll das 2. SQL-Statement falsch sein. Beim Vergleich ID(aus meiner App) und Schluessel aus der Tabelle gibt es einen Fehler bzw. es funktioniert nicht wie gewollt.

Delphi-Quellcode:
$ID = strip_tags($_POST['Schluessel']);
$r_ergebnis = mysql_query("SELECT Schluessel,AnzahlReg,Seriennummer FROM Table WHERE [b]Schluessel='$ID'"[/b]);
Vielen Dank schonma im Voraus

jfheins 21. Nov 2009 11:45

Re: MySQL & PHP-Problem
 
Zitat:

Zitat von ecHo89
Aber wie bekomm ich jetzt am geschicktesten das Ergebnis dann wieder zurück in meine App? Habs mir überlegt mit speichern in einer Datei und die dann per Delphi öffnen. Gibts einen besseren Weg?

Joa ... einfach die Antwort vom PHP-Skript ausgeben lassen - das Internet ist ja schlißlich keine Einbahnstraße ;)

Zitat:

Und außerdem soll das 2. SQL-Statement falsch sein. Beim Vergleich ID(aus meiner App) und Schluessel aus der Tabelle gibt es einen Fehler bzw. es funktioniert nicht wie gewollt.
Welcher Fehler kommt denn? :glaskugel:

Und bevor du jetzt schreibst
Zitat:

$var is not a vlaid sql-resource
lasse dir mal das Ergebnis von mysql_error() ausgeben

ecHo89 21. Nov 2009 13:43

Re: MySQL & PHP-Problem
 
Funktioniert jetzt, danke, war wohl gestern bisschen spät :P

ecHo89 22. Nov 2009 00:47

Re: MySQL & PHP-Problem
 
SQL-Code:
$sql = mysql_query("SELECT AnzahlReg FROM Table WHERE Seriennummer='$Seriennummer'");
$val = mysql_fetch_assoc($sql);
$val++;
mysql_query("UPDATE " . $tablename . " SET AnzahlReg= " . $val[AnzahlReg] . " WHERE Seriennummer='" . $Seriennummer . "'"); oder
mysql_query("UPDATE " . $tablename . " SET AnzahlReg= " . $val['AnzahlReg'] . " WHERE Seriennummer='" . $Seriennummer . "'"); oder
mysql_query("UPDATE " . $tablename . " SET AnzahlReg= " . $val . " WHERE Seriennummer='" . $Seriennummer . "'"); oder
mysql_query("UPDATE " . $tablename . " SET AnzahlReg=$val WHERE Seriennummer='" . $Seriennummer . "'");
...
Was zum Teufel mache ich falsch? Beim 2. Beispiel (siehe Unten) funktioniert alles. Einziger unterschied Schluessel ist varchar und AnzahlReg integer. Es soll einfach das Feld um 1 hochgezählt werden.


mysql_query("UPDATE " . $tabname . " SET Schluessel = '" . $Schluessel . "' WHERE Seriennummer = '" . $Seriennummer ."'");

Valle 22. Nov 2009 02:45

Re: MySQL & PHP-Problem
 
Im ersten UPDATE-Statement fehlen die Anführungszeichen im Array-Index. Leider lässt PHP das trotzdem zu, aber es ist falsch. Im zweiten ist alles richtig. Im dritten fehlt der Index für das Array, d.h. welches Feld du aus dem vorherigen Select denn benutzen willst. Im vierten und letzten Statement ist der gleiche Fehler wie im dritten, nur dass du hier auf den String-Verknüpfungsoperator verzichtet hast.

Dennoch kleiner Tipp am Rande, falls du deine Seite noch etwas optimieren willst: :wink:

SQL-Code:
UPDATE my_table SET AnzahlReg = AnzahlReg + 1 WHERE Seriennummer = '123'
Liebe Grüße,
Valentin

Luckie 22. Nov 2009 02:50

Re: MySQL & PHP-Problem
 
Zitat:

Zitat von ecHo89
Was zum Teufel mache ich falsch?

Man könnte sich auch mal die Abfragen ausgeben lassen, um zu sehen, was man sich da zusammenbastelt.

ecHo89 22. Nov 2009 15:26

Re: MySQL & PHP-Problem
 
SQL-Code:
$sql = mysql_query("SELECT AnzahlReg FROM Table WHERE Seriennummer='$Seriennummer'");
$val = mysql_fetch_assoc($sql);

die($val['AnzahlReg']);
Das funktioniert.


SQL-Code:
$sql = mysql_query("SELECT Key FROM Table2 WHERE Key='$Seriennummer'");
$val = mysql_fetch_assoc($sql);

die($val['Key']);
Warning: mysql_fetch_assoc() expects parameter 1 to be resource, boolean given in /users/echo/www/ValidateKey.php on line 11

</span>

Ich weiß echt nicht wo da der Fehler liegen sollte... Table2-> NR: int, Key: varchar(8)

Gibts eig. ne bessere Möglichkeit zuschaun ob ein Wert in einer Tabelle existiert, z.b. IN oder ähnliches?

SendPostData(Ahttp: TIdHTTP; const AtoURL: string;
const aParams: TStrings): string;
Gibt mir per die(); die Antwort aus dem PHP-Skript. Andere Möglichkeit gibts in dem Sachverhalt nicht?

Edit: Key sieht mir wie n reserviertes Wort aus. Aber mit ner Alternativefunktionierts auch nicht (ja hab auch an die Struktur der Tabelle gedacht)

jfheins 22. Nov 2009 15:35

Re: MySQL & PHP-Problem
 
Ja, es gibt eine Möglichkeit: mysql_num_rows() gibt dir die Anzahl der Zeilen zurück, die im Ergebnis enthalten sind.

Desweiteren ist eigentlich echo die bevorzugte Ausgabemethode, die() ist eher für Fehlermeldungen (Fehlermeldung ausgeben und sofort beenden)

Also z.B.
Code:
$sql = mysql_query('SELECT Key FROM Table2 WHERE Key="' . $_POST['Seriennummer'] . '"');
if(mysql_num_rows($sql) == 1)
{
$val = mysql_fetch_assoc($sql);
echo $val['Key'];
}
else
{
  die('Fehler: ' . mysql_error())
}
P.S.: Hast du eigentlich register_globals eingeschaltet?

ecHo89 22. Nov 2009 16:55

Re: MySQL & PHP-Problem
 
register_globals ist mir unbekannt.
kann man mit echo auch Daten an Delphi zurückgeben? Dachte das funktioniert nur bei direkten Aufruf im Browser?

Aufruf aus Delphi: SendPostData(Ahttp: TIdHTTP; const AtoURL: string;
const aParams: TStrings): string;

Matze 22. Nov 2009 16:57

Re: MySQL & PHP-Problem
 
Zitat:

Zitat von ecHo89
kann man mit echo auch Daten an Delphi zurückgeben? Dachte das funktioniert nur bei direkten Aufruf im Browser?

Ich vermute, du nutzt "IdHTTP.Post()". Der Rückgabewert ist das, was auch der Browser auswertet (echo-Ausgaben, HTML-Code, den du ausgibst etc).

Delphi-Quellcode:
Str := IdHTTP.Post(Url);

ecHo89 22. Nov 2009 22:08

Re: MySQL & PHP-Problem
 
Ahh, danke Matze.

jfheins:

Delphi-Quellcode:
$val = mysql_fetch_assoc($sql);
echo $val['Key']; oder die($val['Key']);
funktioniert wie bereits erwähnt nicht. Mir fällt auch kein Grund ein wieso es beim anderen nach genau dem gleichen Schema funktioniert...

Matze 23. Nov 2009 06:53

Re: MySQL & PHP-Problem
 
Guten Morgen

Zitat:

Zitat von ecHo89
SQL-Code:
$sql = mysql_query("SELECT Key FROM Table2 WHERE Key='$Seriennummer'");
$val = mysql_fetch_assoc($sql);

die($val['Key']);
Warning: mysql_fetch_assoc() expects parameter 1 to be resource, boolean given in /users/echo/www/ValidateKey.php on line 11

</span>

Ich weiß echt nicht wo da der Fehler liegen sollte... Table2-> NR: int, Key: varchar(8)

Hier fällt mir sofort auf, dass "Key" durch den Syntax-Highlighter hervorgehoben wird. Du kannst mal versuchen, anstelle von "Key" einen anderen Namen zu verwenden. Nicht, dass MySQL das als "PRIMARY KEY" o.ä. interpretiert.
Das würde auch erklären, wieso es bei deinem anderen Aufruf mit dem gleichen Aufbau (aber anderen Spaltennamen) funktioniert.

Grüße, Matze

ecHo89 23. Nov 2009 07:58

Re: MySQL & PHP-Problem
 
Ja, das ist mir auch schon aufgefallen. Habs auch vorgestern mal getestet mit anderer Spalte Key2.
Werde jetzt nocheinmal systemmatisch von vorne bis hinten alles durchgehen und schauen, dass nirgends Key benutzt wird.
Mal schaun... -.-

Phoenix 23. Nov 2009 08:19

Re: MySQL & PHP-Problem
 
Zitat:

Zitat von ecHo89
SQL-Code:
mysql_query("UPDATE " . $tablename . " SET AnzahlReg= " . $val[AnzahlReg] . " WHERE Seriennummer='" . $Seriennummer . "'");

Du weisst schon das genau das einer der am häufigsten genannten Gründe ist, warum PHP-Anwendungen als unsicher gelten?

Stelle Dir mal vor, der User gibt als Seriennummer in Deiner Delphi-Anwendung folgendes ein:
Code:
123'; DELETE FROM TABLE Table2;
Das Statement was bei raus kommt ist folgendes:
SQL-Code:
UPDATE tblBlaBlubb SET AnzahlReg= 5 WHERE Seriennummer='123';
DELETE FROM TABLE table2;
Das erste Statement liefert noch nichtmal einen Fehler, es wird einfach kein Datensatz gefunden. Das zweite Statement löscht mal kurzerhand den Inhalt einer Deiner Tabellen.

Wenn Du Dich wunderst wie man an die Tabellen kommt: Man kann den Netzwerkverkehr und damit das abgefragte PHP-Script recht einfach mittels Netzwerk-Sniffern herausfinden. Mit anderen Befehlen die man direkt an Dein PHP-Script schicken kann (also ohne Umweg über Deine Delphi-Anwendung) kann man z.B. anstelle des DELETE FROM Befehls erstmal ein SHOW TABLES; absetzen. In der Fehlerausgabe Deines Scriptes sieht man dann schön alle zur verfügung stehenden Tabellen. Und dann kann man die sich sogar komplett ausgeben lassen und findet sogar alle zur Verfügung stehenden Seriennummern heraus. Und man kann sogar ein UPDATE laufen lassen, dass die Registierung wieder auf 0 setzt.

Mach Dir bitte Gedanken ob das so gewollt ist oder ob Du vielleicht ein bisschen mehr Aufwand in parametrisierte Statements stecken willst, mit denen Du so eine SQL-Injection vermeiden könntest.

ecHo89 23. Nov 2009 19:05

Re: MySQL & PHP-Problem
 
Dachte man kann nur direkte Eingaben per php manipulieren. Aber wenn das Passwort für die Datenbank (im Delphi-Quelltext zum connecten zur DB) mitgesnifft werden kann, dann is das schlecht. Hab mal ein bisschen gesucht, aber nichts gescheites zu dem Stichwort gefunden. Hat jemand ne gute Quelle?

Valle 23. Nov 2009 19:08

Re: MySQL & PHP-Problem
 
Zitat:

Zitat von ecHo89
Dachte man kann nur direkte Eingaben per php manipulieren. Hab mal ein bisschen gesucht, aber nichts gescheites zu dem Stichwort gefunden. Hat jemand ne gute Quelle?

Die Sache nennt man SQL Injection. Dazu findet man bei einschlägigen Suchmaschinen oder Online Enzyklopädien einiges. ;-)

Edit:// @Phoenix: Die mysql_query Funktion lässt nur ein Query (auch durch Semikolon getrennt) zu. Dein Beispiel gibt einfach nur einen Syntax-Fehler. ;-) Aber das Prinzip ist natürlch korrekt.

Liebe Grüße,
Valle

jfheins 23. Nov 2009 19:39

Re: MySQL & PHP-Problem
 
Die einfachste Möglichkeit:
Code:
<?php
$sql = mysql_query('SELECT Key FROM Table2 WHERE Key="' . mysql_real_escape($_POST['Seriennummer']) . '"') or die(mysql_error());
if(mysql_num_rows($sql) == 1)

  $val = mysql_fetch_assoc($sql);
  echo $val['Key'];

else

  die('Fehler: Falsche Ergebnismenge')
}
?>


Alle Zeitangaben in WEZ +1. Es ist jetzt 23:53 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz