gechger
Goto Top

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

Content-Key: 99766

Url: https://administrator.de/contentid/99766

Printed on: April 23, 2024 at 14:04 o'clock

Member: dog
dog Oct 20, 2008 at 14:52:20 (UTC)
Goto Top
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:
//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);
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.
Member: dog
dog Oct 20, 2008 at 15:19:08 (UTC)
Goto Top
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.
Member: gechger
gechger Oct 20, 2008 at 17:51:28 (UTC)
Goto Top
Hallo Max,

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.

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.

Außerdem hast Du völlig Recht. In meinem Anfängerstadium bin ich froh, überhaupt Ergebnisse zu erzielen. Über Sicherheitskonzepte kann ich mir jetzt noch keinen Überblick verschaffen. Meine Scripts dienen dazu, meinen Kollegen im Feld die Arbeit zu erleichtern, öffentlich zugängig werden sie nicht sein. Diese Scripts werden in einem htaccess geschützen Bereich liegen.
Dennoch werde ich mit zunehmender Erfahrung sicher auch Scripts entwickeln, die unseren Kunden zur Verfügung gestellt werden können. Dann muß ich mit Sicherheit mehr über die Risiken wissen.

Ich setze Deine Vorschläge erst mal um und beschäftige mich danach mit meinem nächsten Schritt zur Vollendung dieses Scripts. Die ausgegebenen Daten sind noch nicht übersichtlich, ich muß mit irgendwelchen String-Optionen noch Ordnung da rein bringen. Da weiss ich zwar auch noch nicht wie, aber man kann ja erstmal googeln.

Übrigens, in welchem Forum hätte ich meine Frage besser gepostet?

Schöne Grüße
Christof
Member: dog
dog Oct 20, 2008 at 18:20:56 (UTC)
Goto Top
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.

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 face-smile
Member: gechger
gechger Oct 21, 2008 at 08:44:02 (UTC)
Goto Top
Stimmt. Mit Deiner Erklärung wird das Ganze klarer.