warnmeldungen bei php in formularen
Ich habe ein Eingabeformular das zunächst noch leer ist und bekomme Warnmeldungen
Hallo Forum,
ich habe ein Eingabeformular geschrieben, welches auch schon funktioniert. Was mich aber stört :
Warning: mysql_connect() [function.mysql-connect]: Access denied for user 'ODBC'@'XXXXXXXXXX.XXX.XXXXXX.de' (using password: NO) in
C:\xampp\htdocs\mzdaten\flag.php on line 50
Warning: mysql_fetch_row(): supplied argument is not a valid MySQL result resource in C:\xampp\htdocs\mzdaten\flag.php on line 71
Warning: mysql_fetch_array(): supplied argument is not a valid MySQL result resource in C:\xampp\htdocs\mzdaten\flag.php on line 83
Wenn das Script aufgerufen wird und noch keine Eingaben erfolgt sind, die EIngabefelder also leer sind, bekomme ich diese Warnungen.
Wie kann ich diese Warnungen vermeiden? Ein User würde dadurch mächtig irritiert.
Dies ist mein Script:
<!DOCTYPE HTML PUBLIC "-W3CDTD HTML 4.01 TransitionalEN"
<html>
<head>
<title>Kunden Daten Flag ändern</title>
<meta name="author" content="MobilZeit GmbH">
<meta content="MobilZeit GmbH" name="GENERATOR">
</head>
<body bgcolor="#D3D3D3"> <font color="#291455">
<?php
Verbindung zur Datenbank mit den Kundendaten herstellen
$host = "xxxx.xxx.xxx";
$user = "dboxxxxxxx";
$kennwort = "xxxxxx";
$dbname = "dbxxxxxx";
$tabelle ="xxxxxxx";
Verbindung mit der Datenbank
$cldb = mysql_connect($host, $user, $kennwort); or die(mysql_error());
mysql_select_db($dbname);
Variablen, die durch das Eingabeformular gefüllt werden
$kundenname=$_POST["kundenname"];
Script, welches ausgeführt werden soll
$sql = ("SELECT * FROM kddaten where name='$kundenname'");
Ausgabe der abgefragten Informationen...
$result=mysql_Query ($sql);
...und Ausgabe in ein Array
$row = mysql_fetch_row($result);
$user1 = "$row[5]"; Inhalte des Arrays, die Indexnummern per ECHO abgefragt, liefert genaue Informationen
$kennwort1 = "$row[3]";
$dbname1 = "$row[2]";
$tabelle1 ="$row[4]";
$anmeldung="$row[6]";
Verbindung zur Datenbank des Kunden, ausgelesen aus dem Array
$host2 = "$host";
$user2 = "$user1";
$kennwort2 = "$kennwort1";
$dbname2 = "$dbname1";
$tabelle2 ="$tabelle1";
Verbindung zur Kundendatenbank
$cldb = mysql_connect($host2, $user2, $kennwort2); or die(mysql_error());
mysql_select_db($dbname2);
Übernahme aus dem Eingabefeld
$tagvon=$_POST["tagvon"];
$monatvon=$_POST["monatvon"];
$jahrvon=$_POST["jahrvon"];
$tagbis=$_POST["tagbis"];
$monatbis=$_POST["monatbis"];
$jahrbis=$_POST["jahrbis"];
$datumvon=$jahrvon."-".$monatvon."-".$tagvon." 00:00:00";
$datumbis=$jahrbis."-".$monatbis."-".$tagbis." 00:00:00";
$sql1 = ("SELECT * FROM $tabelle2 where datum > '$datumvon' and datum < '$datumbis' ");
Ausgabe der abgefragten Informationen...
$abfrage=mysql_Query ($sql1);
...und Ausgabe in ein Array
$row1 = mysql_fetch_row($abfrage);
$idintern = "$row1[1]";Inhalte des Arrays, die Indexnummern per ECHO abgefragt, liefert genaue Informationen
$werte = "$row1[2]";
$datum = "$row1[3]";
$flag ="$row1[4]";
Ausgabe der Informationen
$abfrage = mysql_db_query($dbname2,$sql1); or die(mysql_error());
?>
<table rules=row>
<?
while($array = mysql_fetch_array($abfrage)){
?>
<tr>
<td><?= $array[werte]; ?></td>
</tr>
<?
} // ENDE while($array = mysql_fetch_array($abfrage)) {
?>
</table>
<table>
<form action="flag.php" method="post">
<tr>
<td>Kunde</td>
<td><input name="kundenname"></td>
<td>Tag von</td>
<td><input name="tagvon" size="2" ></td>
<td>Monat von</td>
<td><input name="monatvon" size="2" ></td>
<td>Jahr von</td>
<td><input name="jahrvon" size="4" ></td>
<td>Tag bis</td>
<td><input name="tagbis" size="2" ></td>
<td>Monat bis</td>
<td><input name="monatbis" size="2" ></td>
<td>Jahr bis</td>
<td><input name="jahrbis" size="4" ></td>
</tr>
<td>
<input type="submit" value="Absenden"><br>
</td>
<td><input type="reset" value="Abbrechen">
</td>
</tr>
</table>
</form>
</body>
</html>
<?
mysql_close();
?>
Danke für jeden Tip
Christof
Hallo Forum,
ich habe ein Eingabeformular geschrieben, welches auch schon funktioniert. Was mich aber stört :
Warning: mysql_connect() [function.mysql-connect]: Access denied for user 'ODBC'@'XXXXXXXXXX.XXX.XXXXXX.de' (using password: NO) in
C:\xampp\htdocs\mzdaten\flag.php on line 50
Warning: mysql_fetch_row(): supplied argument is not a valid MySQL result resource in C:\xampp\htdocs\mzdaten\flag.php on line 71
Warning: mysql_fetch_array(): supplied argument is not a valid MySQL result resource in C:\xampp\htdocs\mzdaten\flag.php on line 83
Wenn das Script aufgerufen wird und noch keine Eingaben erfolgt sind, die EIngabefelder also leer sind, bekomme ich diese Warnungen.
Wie kann ich diese Warnungen vermeiden? Ein User würde dadurch mächtig irritiert.
Dies ist mein Script:
<!DOCTYPE HTML PUBLIC "-W3CDTD HTML 4.01 TransitionalEN"
<html>
<head>
<title>Kunden Daten Flag ändern</title>
<meta name="author" content="MobilZeit GmbH">
<meta content="MobilZeit GmbH" name="GENERATOR">
</head>
<body bgcolor="#D3D3D3"> <font color="#291455">
<?php
Verbindung zur Datenbank mit den Kundendaten herstellen
$host = "xxxx.xxx.xxx";
$user = "dboxxxxxxx";
$kennwort = "xxxxxx";
$dbname = "dbxxxxxx";
$tabelle ="xxxxxxx";
Verbindung mit der Datenbank
$cldb = mysql_connect($host, $user, $kennwort); or die(mysql_error());
mysql_select_db($dbname);
Variablen, die durch das Eingabeformular gefüllt werden
$kundenname=$_POST["kundenname"];
Script, welches ausgeführt werden soll
$sql = ("SELECT * FROM kddaten where name='$kundenname'");
Ausgabe der abgefragten Informationen...
$result=mysql_Query ($sql);
...und Ausgabe in ein Array
$row = mysql_fetch_row($result);
$user1 = "$row[5]"; Inhalte des Arrays, die Indexnummern per ECHO abgefragt, liefert genaue Informationen
$kennwort1 = "$row[3]";
$dbname1 = "$row[2]";
$tabelle1 ="$row[4]";
$anmeldung="$row[6]";
Verbindung zur Datenbank des Kunden, ausgelesen aus dem Array
$host2 = "$host";
$user2 = "$user1";
$kennwort2 = "$kennwort1";
$dbname2 = "$dbname1";
$tabelle2 ="$tabelle1";
Verbindung zur Kundendatenbank
$cldb = mysql_connect($host2, $user2, $kennwort2); or die(mysql_error());
mysql_select_db($dbname2);
Übernahme aus dem Eingabefeld
$tagvon=$_POST["tagvon"];
$monatvon=$_POST["monatvon"];
$jahrvon=$_POST["jahrvon"];
$tagbis=$_POST["tagbis"];
$monatbis=$_POST["monatbis"];
$jahrbis=$_POST["jahrbis"];
$datumvon=$jahrvon."-".$monatvon."-".$tagvon." 00:00:00";
$datumbis=$jahrbis."-".$monatbis."-".$tagbis." 00:00:00";
$sql1 = ("SELECT * FROM $tabelle2 where datum > '$datumvon' and datum < '$datumbis' ");
Ausgabe der abgefragten Informationen...
$abfrage=mysql_Query ($sql1);
...und Ausgabe in ein Array
$row1 = mysql_fetch_row($abfrage);
$idintern = "$row1[1]";Inhalte des Arrays, die Indexnummern per ECHO abgefragt, liefert genaue Informationen
$werte = "$row1[2]";
$datum = "$row1[3]";
$flag ="$row1[4]";
Ausgabe der Informationen
$abfrage = mysql_db_query($dbname2,$sql1); or die(mysql_error());
?>
<table rules=row>
<?
while($array = mysql_fetch_array($abfrage)){
?>
<tr>
<td><?= $array[werte]; ?></td>
</tr>
<?
} // ENDE while($array = mysql_fetch_array($abfrage)) {
?>
</table>
<table>
<form action="flag.php" method="post">
<tr>
<td>Kunde</td>
<td><input name="kundenname"></td>
<td>Tag von</td>
<td><input name="tagvon" size="2" ></td>
<td>Monat von</td>
<td><input name="monatvon" size="2" ></td>
<td>Jahr von</td>
<td><input name="jahrvon" size="4" ></td>
<td>Tag bis</td>
<td><input name="tagbis" size="2" ></td>
<td>Monat bis</td>
<td><input name="monatbis" size="2" ></td>
<td>Jahr bis</td>
<td><input name="jahrbis" size="4" ></td>
</tr>
<td>
<input type="submit" value="Absenden"><br>
</td>
<td><input type="reset" value="Abbrechen">
</td>
</tr>
</table>
</form>
</body>
</html>
<?
mysql_close();
?>
Danke für jeden Tip
Christof
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 99766
Url: https://administrator.de/forum/warnmeldungen-bei-php-in-formularen-99766.html
Ausgedruckt am: 22.04.2025 um 10:04 Uhr
5 Kommentare
Neuester Kommentar
Hallo,
mal abgesehen davon, dass das hier das falsche Forum ist hat dein Script eine schwerwiegende Probleme.
Aber um auf deine konkrete Fragestellung einzugehen:
Natürlich kommen die Fehlermeldungen, weil eben noch keine Werte eingegeben sind. Dein Code:
Wird aber in jedem Fall ausgeführt und da liegt das Problem:
Du machst keine Prüfungen ob wirklich etwas vom Formular gesendet wurde.
Du solltest zumindest mit isset() oder empty() prüfen ob die Werte überhaupt belegt sind, bevor du die Datenbankabfrage absendest.
mal abgesehen davon, dass das hier das falsche Forum ist hat dein Script eine schwerwiegende Probleme.
Aber um auf deine konkrete Fragestellung einzugehen:
Natürlich kommen die Fehlermeldungen, weil eben noch keine Werte eingegeben sind. Dein Code:
//Variablen, die durch das Eingabeformular gefüllt werden
$kundenname=$_POST["kundenname"];
//Script, welches ausgeführt werden soll
$sql = ("SELECT * FROM kddaten where name='$kundenname'");
//Ausgabe der abgefragten Informationen...
$result=mysql_Query ($sql);
Du machst keine Prüfungen ob wirklich etwas vom Formular gesendet wurde.
Du solltest zumindest mit isset() oder empty() prüfen ob die Werte überhaupt belegt sind, bevor du die Datenbankabfrage absendest.
So, ich habe an deinem Script mal ein paar kleine Änderungen gemacht:
http://pastie.org/private/urrccuhqwytpwwxetuygw
Dennoch würde ich es auch so nicht produktiv einsetzen!
Hier ein paar Tipps:
- Wenn möglich einfache Anführungszeichen statt doppelte verwenden. Die Doppelten sind nur relevant wenn ein String eine Variable enthält - sonst kosten sie nur Rechenleistung.
- Regel 1 der Webprogrammierung: ALLES was aus Richtung User kommt muss geprüft werden. Wenn du das übergehst kannst du enorme Sicherheitsprobleme kriegen (siehe dazu SQL-Injection). Darum habe ich einige kleine Änderungen gemacht: Der String wird jetzt auf Steuerzeichen für SQL überprüft und die unschädlich gemacht und für die Zahlenwerte wird geprüft, dass sie in korrekten Wertebereichen sind.
- Du deklarierst viele Variablen doppelt (z.B. $host2, das aber immer genau den selben wert wie $host hat)
- or die(mysql_error()); ist als Abbruchkondition zwar zum Entwickeln okay, aber deine Benutzer sollte NIE Mysql-Fehlermeldungen zu gesicht bekommen (du solltest sie natürlich protokollieren)
- Verwende <?php statt <? oder <?= da momentan nicht wirklich klar ist, wie lange es diese Abkürzung noch geben wird und sie ohnehin nicht auf jedem Server funktioniert.
Ich würde dir empfehlen noch eine Lektüre über PHP-Sicherheit anzuschaffen wie es einige am Markt gibt, da erfahrungsgemäß die üblichen Lehrbücher das total umgehen, was zu haufenweise Sicherheitsproblemen führt.
http://pastie.org/private/urrccuhqwytpwwxetuygw
Dennoch würde ich es auch so nicht produktiv einsetzen!
Hier ein paar Tipps:
- Wenn möglich einfache Anführungszeichen statt doppelte verwenden. Die Doppelten sind nur relevant wenn ein String eine Variable enthält - sonst kosten sie nur Rechenleistung.
- Regel 1 der Webprogrammierung: ALLES was aus Richtung User kommt muss geprüft werden. Wenn du das übergehst kannst du enorme Sicherheitsprobleme kriegen (siehe dazu SQL-Injection). Darum habe ich einige kleine Änderungen gemacht: Der String wird jetzt auf Steuerzeichen für SQL überprüft und die unschädlich gemacht und für die Zahlenwerte wird geprüft, dass sie in korrekten Wertebereichen sind.
- Du deklarierst viele Variablen doppelt (z.B. $host2, das aber immer genau den selben wert wie $host hat)
- or die(mysql_error()); ist als Abbruchkondition zwar zum Entwickeln okay, aber deine Benutzer sollte NIE Mysql-Fehlermeldungen zu gesicht bekommen (du solltest sie natürlich protokollieren)
- Verwende <?php statt <? oder <?= da momentan nicht wirklich klar ist, wie lange es diese Abkürzung noch geben wird und sie ohnehin nicht auf jedem Server funktioniert.
Ich würde dir empfehlen noch eine Lektüre über PHP-Sicherheit anzuschaffen wie es einige am Markt gibt, da erfahrungsgemäß die üblichen Lehrbücher das total umgehen, was zu haufenweise Sicherheitsproblemen führt.
Zitat von @gechger:
als Anfänger im php ist mir die Bedeutung der Funktion isset()
noch nicht so richtig klar geworden. Werde mich mal näher damit
beschäftigen müssen.
als Anfänger im php ist mir die Bedeutung der Funktion isset()
noch nicht so richtig klar geworden. Werde mich mal näher damit
beschäftigen müssen.
isset() gibt nur an ob eine Variable gesetzt ist oder nicht.
Doppelte Deklarierung hielt ich für notwendig, weil ich zwei
Sachen durchführen will:
Im ersten Schritt will ich eine Datenbank abfragen, die ich angelegt
habe. Dort drin befinden sich alle Zugangsdaten zu den Datenbanken
unserer Kunden. Ein Mitarbeiter soll die nicht kennen, also verbinde
ich mich ersteinmal mit dieser Datenbank , um aufgrund des
eingegebenen Kundennamen im Formular dessen Zugangsdaten zu erhalten.
Diese schreibe ich in ein Array. Danach will ich in die
Kundendatenbank (mit den ermittelten Zugangsdaten) und bestimmte
Informationen abrufen.
Deshalb habe ich den zweiten Zugang mit anderen Variablen
gewählt, um Fehlinformationen zu vermeiden. Sie sehen zwar
ähnlich aus, dienen aber zum Zugang zu unterschiedlichen
Datenbanken.
Naja, im Script passiert z.B. folgendes (um mal den Weg einer Variablen zurückzuverfolgen):
mysql_fetch() -> $row[5] -> $user1 -> $user2 -> mysql_connect();
Du holst also hier einen Datensatz aus der Datenbank, weist ihm $user1 zu, dann im nächsten Schritt aber gleich $user2 - $user1 benutzt du zu keinem Zeitpunkt.
In der Zeit, in der du nur also nur eine Variable gebraucht hättest, hast du sie 2x dupliziert, verwendest also mehr Speicher, als sein müsste.
Auch $host2 könntest du dir sparen, da es ja auf den selben Wert wie $host verweist.
Übrigens, in welchem Forum hätte ich meine Frage besser
gepostet?
Sorry, ich habe beim Überfliegen "Windows Server" als Forum gesehen, während der Beitrag in "Entwicklung » Programmiersprachen » PHP (Hypertext Preprocessor)" gehört - aber er ist ja schon in Entwicklung, ich nehm alles zurück