Notice: Undefined index: id

Also wenn du schon Ahnung von PHP (und Zeit) hast. Würde ich dir vielleicht auch zu Viedo2Brain - PHP 5 (Das ist eine DVD kein Buch) raten.

Viele Beispiele
Gut Verständlich
 
Also. Wenn das ganze für Übungszwecke ist will ich dir mal bisschen genauer alles Erklären. Alle Codes sind kommentiert.

Für die Aufbereitung von sicheren Variablen kann ich dir diese Funktion empfehlen.
Sie sorgt dafür dass keine Ungültigen Inhalte geschrieben werden die Den SQL Code manipulieren.

Wenn sonst jemand in der URL "id='; DROP TABLE `users`; #"aufruft wird der SQL Query zu:

SELECT * FROM `$tab` WHERE `id`=''; DROP TABLE `users`; #'

Kann eine kritische Sicherheitslücke sein. Diese Funktion sorgt
dafür dass solche Eingaben unterbunden werden.

PHP:
function mysql_prepare_string($Param, $resource=null)
{
	// String holen
	$string = $Param;
	
	// Je nach aktivierten Modulen Quotes und Slashes entfernen
    if(get_magic_quotes_gpc()) 
	{
        if(ini_get('magic_quotes_sybase')) 
		{
            $string =  str_replace("''", "'", $string);
        } 
		else 
		{
            $string = stripslashes($string);
        }
    } 
    // Wenn keine Resource angegeben wurde
    if(is_null($resource))
    {
		// Mysql-Escape Funktion ohne Resource ausführen
		return mysql_real_escape_string($string);	
    }
    else
    {
		// Mysql-Escape Funktion mit Resource ausführen
		return mysql_real_escape_string($string, $resource);	
    }
}

Der PHP-Teil für das Formular könntest du so machen. Ich hab mal ne vollständige Version gemacht
damit du draus lernen kannst.

PHP:
<?php
error_reporting(E_ALL);
require("inc/wmaconfig.inc.php");
require("inc/wmafunc1.php");

// Daten speichern
if($_SERVER['REQUEST_METHOD'] == 'POST') // Beim Senden vom Formular
{
	$error = ''; // Fehlervariable
	
	// Variablen holen und Vorbereiten
	// (trim löscht unnötige Leerzeichen)
	$vorname = mysql_prepare_string(trim($_POST['vorname']);
	$nachname = mysql_prepare_string(trim($_POST['nachname']);
	$strasse = mysql_prepare_string(trim($_POST['strasse']);
	$plz = mysql_prepare_string(trim($_POST['plz']);
	$telnr = mysql_prepare_string(trim($_POST['telnr']);
	$homepage = mysql_prepare_string(trim($_POST['homepage']);
	$email = mysql_prepare_string(trim($_POST['email']);
	
	// Daten checken
	// Wenn die Eingabe Leer ist
	// Dann wird die Fehlermeldung angehängt. 
	// Zum Schluss wissen wir welche Daten falsch waren.
	$error .= (empty($vorname)) ? 'Kein Vorname angegeben!<br>' : '';
	$error .= (empty($nachname)) ? 'Kein Nachname angegeben!<br>' : '';
	$error .= (empty($strasse)) ? 'Keine Strasse angegeben!<br>' : '';
	$error .= (empty($plz)) ? 'Keine Plz angegeben!<br>' : '';
	$error .= (empty($telnr)) ? 'Keine Telnr. angegeben!<br>' : '';
	$error .= (empty($homepage)) ? 'Keine Hp angegeben!<br>' : '';
	$error .= (empty($email)) ? 'Keine EMail angegeben!<br>' : '';
	
	// Wenn $error leer ist 
	// war kein Fehler also können wir speichern
	if(empty($error))
	{
		// Query generieren
		$sql = sprintf("UPDATE `%s` SET vorname='%s', nachname='%s', strasse='%s', hsnr='%s', plz='%s', ort='%s', telnr='%s', homepage='%s', email='%s' WHERE id = '%u'",
						$tab, $vorname, $nachname, $strasse, $plz, $telnr, $homepage, $email, $_POST['id']);
		// Ausführen und evt. Fehler anhängen
		$res = @mysql_query($sql) or $error .=  "Fehler: " . mysql_error();
		
		if ($res) // Bei Erfolg
		{
			// Erfolgsmeldung setzen oder umleiten
			$error .= "Erfolgreich";
			// header("Location: url");
		}
	}
}

// Daten laden
$sql = sprintf("SELECT * FROM `$tab` WHERE `id` = '%u'", $_GET['id']);
$res = @mysql_query( $sql ) or die( "Fehler: " . mysql_error() );
$data = mysql_fetch_assoc( $res );
?>

Im Formular musst du dann noch diese Zeile hinzufügen:
<input type="hidden" name="id" value="<?= $_GET['id'] ?>">
Dann wird beim Absenden in $_POST die aktuelle ID gespeichert.

Die $error Variable kannst du dann Weiter unten über dem Formular ausgeben um eine Schöne
Fehlermeldung anzuzeigen.

[EDIT]
Hab noch was wichtiges Vergessen. Die Form-Zeile so abändern:
<form action="<?= $_SERVER['PHP_SELF'] ?>" method="post" name="edit">
Somit wird beim Absenden das eigene Script aufrufen und die Abfrage ob die Daten abgesendet wurden siehst du oben im PHP-Skript.


Ich kann dir nur auch noch mal empfehlen im PHP-Handbuch nachzulesen und nochmal zu googeln.



Gruß Daniel
 
Zuletzt bearbeitet:
Also. Wenn das ganze für Übungszwecke ist will ich dir mal bisschen genauer alles Erklären. Alle Codes sind kommentiert.

Für die Aufbereitung von sicheren Variablen kann ich dir diese Funktion empfehlen.
Sie sorgt dafür dass keine Ungültigen Inhalte geschrieben werden die Den SQL Code manipulieren.

Wenn sonst jemand in der URL "id='; DROP TABLE `users`; #"aufruft wird der SQL Query zu:

SELECT * FROM `$tab` WHERE `id`=''; DROP TABLE `users`; #'

Kann eine kritische Sicherheitslücke sein. Diese Funktion sorgt
dafür dass solche Eingaben unterbunden werden.

PHP:
function mysql_prepare_string($Param, $resource=null)
{
	// String holen
	$string = $Param;
	
	// Je nach aktivierten Modulen Quotes und Slashes entfernen
    if(get_magic_quotes_gpc()) 
	{
        if(ini_get('magic_quotes_sybase')) 
		{
            $string =  str_replace("''", "'", $string);
        } 
		else 
		{
            $string = stripslashes($string);
        }
    } 
    // Wenn keine Resource angegeben wurde
    if(is_null($resource))
    {
		// Mysql-Escape Funktion ohne Resource ausführen
		return mysql_real_escape_string($string);	
    }
    else
    {
		// Mysql-Escape Funktion mit Resource ausführen
		return mysql_real_escape_string($string, $resource);	
    }
}

Der PHP-Teil für das Formular könntest du so machen. Ich hab mal ne vollständige Version gemacht
damit du draus lernen kannst.

PHP:
<?php
error_reporting(E_ALL);
require("inc/wmaconfig.inc.php");
require("inc/wmafunc1.php");

// Daten speichern
if($_SERVER['REQUEST_METHOD'] == 'POST') // Beim Senden vom Formular
{
	$error = ''; // Fehlervariable
	
	// Variablen holen und Vorbereiten
	// (trim löscht unnötige Leerzeichen)
	$vorname = mysql_prepare_string(trim($_POST['vorname']);
	$nachname = mysql_prepare_string(trim($_POST['nachname']);
	$strasse = mysql_prepare_string(trim($_POST['strasse']);
	$plz = mysql_prepare_string(trim($_POST['plz']);
	$telnr = mysql_prepare_string(trim($_POST['telnr']);
	$homepage = mysql_prepare_string(trim($_POST['homepage']);
	$email = mysql_prepare_string(trim($_POST['email']);
	
	// Daten checken
	// Wenn die Eingabe Leer ist
	// Dann wird die Fehlermeldung angehängt. 
	// Zum Schluss wissen wir welche Daten falsch waren.
	$error .= (empty($vorname)) ? 'Kein Vorname angegeben!<br>' : '';
	$error .= (empty($nachname)) ? 'Kein Nachname angegeben!<br>' : '';
	$error .= (empty($strasse)) ? 'Keine Strasse angegeben!<br>' : '';
	$error .= (empty($plz)) ? 'Keine Plz angegeben!<br>' : '';
	$error .= (empty($telnr)) ? 'Keine Telnr. angegeben!<br>' : '';
	$error .= (empty($homepage)) ? 'Keine Hp angegeben!<br>' : '';
	$error .= (empty($email)) ? 'Keine EMail angegeben!<br>' : '';
	
	// Wenn $error leer ist 
	// war kein Fehler also können wir speichern
	if(empty($error))
	{
		// Query generieren
		$sql = sprintf("UPDATE `%s` SET vorname='%s', nachname='%s', strasse='%s', hsnr='%s', plz='%s', ort='%s', telnr='%s', homepage='%s', email='%s' WHERE id = '%u'",
						$tab, $vorname, $nachname, $strasse, $plz, $telnr, $homepage, $email, $_POST['id']);
		// Ausführen und evt. Fehler anhängen
		$res = @mysql_query($sql) or $error .=  "Fehler: " . mysql_error();
		
		if ($res) // Bei Erfolg
		{
			// Erfolgsmeldung setzen oder umleiten
			$error .= "Erfolgreich";
			// header("Location: url");
		}
	}
}

// Daten laden
$sql = sprintf("SELECT * FROM `$tab` WHERE `id` = '%u'", $_GET['id']);
$res = @mysql_query( $sql ) or die( "Fehler: " . mysql_error() );
$data = mysql_fetch_assoc( $res );
?>

Im Formular musst du dann noch diese Zeile hinzufügen:
<input type="hidden" name="id" value="<?= $_GET['id'] ?>">
Dann wird beim Absenden in $_POST die aktuelle ID gespeichert.

Die $error Variable kannst du dann Weiter unten über dem Formular ausgeben um eine Schöne
Fehlermeldung anzuzeigen.

[EDIT]
Hab noch was wichtiges Vergessen. Die Form-Zeile so abändern:
<form action="<?= $_SERVER['PHP_SELF'] ?>" method="post" name="edit">
Somit wird beim Absenden das eigene Script aufrufen und die Abfrage ob die Daten abgesendet wurden siehst du oben im PHP-Skript.


Ich kann dir nur auch noch mal empfehlen im PHP-Handbuch nachzulesen und nochmal zu googeln.



Gruß Daniel

Oh, das sich hier jemand soviel Mühe macht habe ich nicht mit gerechnet. Vielen vielen Dank, das hilft sicher weiter. Muß erstmal durchblicken. :)
 
Immer wieder gern. Jeder hat mal klein angefangen. Ich bin auch immer über jede Hilfe dankbar also soll man es ja nicht anderst machen :)

Die Videos gibts auf:
http://www.video2brain.com

Ok, dann habe ich da noch eine Frage:

aus dem Php code den du vorgeschlagen hast erhalte ich aus dieser Zeile:
Code:
$vorname = mysql_prepare_string(trim($_POST['vorname']);

bei aufrufen diese Fehlermeldung;
Parse error: syntax error, unexpected ';'

Die Syntax wird nicht akzeptiert. Ich kann den Fehler aber nicht nachvollziehen. Woran liegt es?
 
Oh. Entschludigung. War wohl weil ichs so auf die Schnelle gemacht habe. Am Schluss vor dem ; fehlt eine geschlossene Klammer.
PHP:
$vorname = mysql_prepare_string(trim($_POST['vorname']));

Wird wohl bei denen drunter auch Fehlen da ich den Code kopiert habe.
 
Danke.

Ich habe die anderen Zeilen darunter auch korregiert. Das sieht dann so aus:
Code:
// Variablen holen und Vorbereiten
    // (trim löscht unnötige Leerzeichen)
    $vorname = mysql_prepare_string(trim($_POST['vorname']));
    $nachname = mysql_prepare_string(trim($_POST['nachname']));
    $strasse = mysql_prepare_string(trim($_POST['strasse']));
    $hsnr = mysql_prepare_string(trim($_POST['hsnr']));
    $plz = mysql_prepare_string(trim($_POST['plz']));
    $ort = mysql_prepare_string(trim($_POST['ort']));
    $telnr = mysql_prepare_string(trim($_POST['telnr']));
    $homepage = mysql_prepare_string(trim($_POST['homepage']));
    $email = mysql_prepare_string(trim($_POST['email']));

Jetzt erhalte ich allerdings eine andere Fehlermeldung aus dieser Zeile:
Code:
// Daten laden
$sql = sprintf("SELECT * FROM `$tab` WHERE `id` = '%u'", $_GET['id']);

Fehlermeldung:
Undefined index: id
 
Klar. Liegt immer noch am selben: Error-Reporting umstellen. Denn Notizen werden auch ausgegeben. Aber etwas ist mir noch aufgefallen. Mit den IDs. Wenn du das Formular abgeschickt hast kannst du ja logischerweise keine ID von der URL holen. Da ist es in der POST Variable gespeichert. Also in die IF-Else Abfrage noch eine Variable einbauen welche dafür sorgt dass die richtige ID gesetzt ist.
Hier nochmals der überarbeitete Code mit umgestelltem Error-Reporting
PHP:
<?php
error_reporting(E_ALL ^ E_NOTICE);
require("inc/wmaconfig.inc.php");
require("inc/wmafunc1.php");

// Daten speichern
if($_SERVER['REQUEST_METHOD'] == 'POST') // Beim Senden vom Formular
{
	$error = ''; // Fehlervariable
	
	// Variablen holen und Vorbereiten
	$id= $_POST['id']; // ID festlegen bei POST
	$vorname = mysql_prepare_string(trim($_POST['vorname']));
	$nachname = mysql_prepare_string(trim($_POST['nachname']));
	$strasse = mysql_prepare_string(trim($_POST['strasse']));
	$plz = mysql_prepare_string(trim($_POST['plz']));
	$telnr = mysql_prepare_string(trim($_POST['telnr']));
	$homepage = mysql_prepare_string(trim($_POST['homepage']));
	$email = mysql_prepare_string(trim($_POST['email']));
	
	// Daten checken
	// Wenn die Eingabe Leer ist (trim löscht unnötige Leerzeichen)
	// Dann wird die Fehlermeldung angehängt. 
	// Zum Schluss wissen wir welche Daten falsch waren.
	$error .= (empty($vorname)) ? 'Kein Vorname angegeben!<br>' : '';
	$error .= (empty($nachname)) ? 'Kein Nachname angegeben!<br>' : '';
	$error .= (empty($strasse)) ? 'Keine Strasse angegeben!<br>' : '';
	$error .= (empty($plz)) ? 'Keine Plz angegeben!<br>' : '';
	$error .= (empty($telnr)) ? 'Keine Telnr. angegeben!<br>' : '';
	$error .= (empty($homepage)) ? 'Keine Hp angegeben!<br>' : '';
	$error .= (empty($email)) ? 'Keine EMail angegeben!<br>' : '';
	
	// Wenn $error leer ist 
	// war kein Fehler also können wir speichern
	if(empty($error))
	{
		//Updaten
		$sql = sprintf("UPDATE `%s` SET vorname='%s', nachname='%s', strasse='%s', hsnr='%s', plz='%s', ort='%s', telnr='%s', homepage='%s', email='%s' WHERE id = '%u'",
						$tab, $vorname, $nachname, $strasse, $plz, $telnr, $homepage, $email, $id);
		// Fehler anhängen
		$res = @mysql_query($sql) or $error .=  "Fehler: " . mysql_error();
		
		if ($res)
		{
			// Erfolgsmeldung setzen oder umleiten
			$error .= "Erfolgreich";
			// header("Location: url");
		}
	}
}
else // Wenn nicht das Formular abgeschickt wurde
{
	// Probieren die ID von der URL zu holen
	$id = $_GET['id'];
}

// Daten laden
$sql = sprintf("SELECT * FROM `$tab` WHERE `id` = '%u'", $id);
$res = @mysql_query( $sql ) or $error .= "Fehler: " . mysql_error(); // Fehler bei Falscher ID
$data = mysql_fetch_assoc( $res );
?>

Wenn jetzt noch eine Warnung kommt stimmt was komplett mit der Server-Config nicht. Tut mir Leid wegen der falschen Version aber ich weiß nicht was du in den inkludierten Dateien machst und deine DB-Aussieht darum kann ich nichts testen.

Gruß Daniel
 
Zuletzt bearbeitet:
Zurück