• Apfeltalk ändert einen Teil seiner Allgemeinen Geschäftsbedingungen (AGB), das Löschen von Useraccounts betreffend.
    Näheres könnt Ihr hier nachlesen: AGB-Änderung
  • Es regnet, ist neblig und kalt, alle sind krank und der Chef wird zunehmend cholerisch. Das Thema des Monats ist also folgerichtig --> Das Grau(en)
    Wir sind gespannt, war Euch dazu einfällt! Zum Wettbewerb --> Klick

Kleines Problem mit PHP

drok

Klarapfel
Registriert
02.06.07
Beiträge
278
Hi,
Das Problem ist folgendes:

Ich gebe in einer Tabelle die Datensätze einer DB aus.
Wenn ich jetzt Datensätze bearbeiten will, habe ich bisher zu einer anderen php-Datei mit Formular verlinkt in dem dann die Daten geladen und wieder abgeschickt werden. (UPDATE...)

Wie gehe ich jetzt aber am schlausten und elegantesten vor wenn ich die Einträge direkt bearbeiten will, ohne auf ein anderes Script zu verlinken ?

Der erste Gedanke war gewesen, bei Aufruf des "Edit-Links" ein Formular am Ende der Tabelle mit "echo" auszugeben. Den Gedanken habe ich aber schnell verworfen weil das ganze irgendwie nicht ganz koscher klang.

Nun hatte ich mir überlegt eine edit.php zu schreiben in der nur ein Formular ausgegeben wird,
und dieses dann unter der "Ausgabe-Tabelle" zu includen.
Hat soweit ganz gut geklappt (bzw auch nicht) , nur kann ich dem ja nicht wirklich Parameter übergeben...

Wäre toll wenn jemand eine Lösung parat hätte.


vg
 

zeno

Lane's Prinz Albert
Registriert
05.11.05
Beiträge
4.894
Javascript ist das Zauberwort hier.
Mit nem klick auf den Edit Link kannst du eine Javascript Funktion aufrufen die dir das Edit Formular anzeigt und mit den richtigen Daten füttert.
 

drok

Klarapfel
Registriert
02.06.07
Beiträge
278
hm ich will das ganze aber eigentlich nur mit php realisieren o_O
 

zeno

Lane's Prinz Albert
Registriert
05.11.05
Beiträge
4.894
Dann wirst du um die zweite Seite nicht drum rum kommen, da dir die Möglichkeit fehlt auf einer bestehenden Seite dem Formular zu sagen was für einen DS mit welchen Daten editiert werden soll..
 

tiriqs

Cripps Pink
Registriert
26.06.06
Beiträge
155
kannst doch alles in eine php schrieben...rufst halt nur im ersten teil ab ob der submit button des forms angeklickt wurde.. if(isset($submit))...wenn ja, dann speicherste die übergebenen formvars in die db.

danach wird ja dann die table eh wieder ausgelesen und hat dann auch gleich wieder die neuen werte

ps: hoffe ich habe deine frage richtig verstanden ;)
 

drok

Klarapfel
Registriert
02.06.07
Beiträge
278
Ja hast du richtig verstanden ;)
Ich könnt mich manchmal schlagen dafür das ich manchmal einfach zu kompliziert denke..^^
Hab jetzt einfach unten ein Formular reingebatscht und fertig is die Sache.

Danke euch beiden.

vg
 

AAPL

Roter Delicious
Registriert
17.08.07
Beiträge
93
wenn schon oldschool, dann perl ;)
 

Chuck-.-

Bismarckapfel
Registriert
22.12.06
Beiträge
142
Lade doch deine Daten direkt in Input Felder. Dann können Sie dort direkt bearbeitet werden und der User muss nur noch aif speichern klicken.
 

Hilarious

Gelbe Schleswiger Reinette
Registriert
10.08.05
Beiträge
1.759
Ich würde dies aus der Erfahrung heraus ähnlich angehen wie tiriqs vorschlug. Dabei hast Du eine "index.php" und regelst den Ablauf über Parameter. Je nachdem was per Parameter an die index.php übermittelt wurde reagiert diese. Hier mal eine Skizze (nicht lauffähiges Beispiel):
Code:
<?php
	
	function frageDatenbank($addressID = 0)
	{
		// "SELECT * FROM ..."
		// return $resourceID;
	}
	
	function zeigeDaten($resourceID)
	{
		// while ($details = mysql_fetch_assoc($resourceID)) {
		// ...	
		//}	
	}
	
	function schreibeDaten()
	{
		// $sql = sprintf("INSERT INTO tabelle SET name='%s'"
		//		, mysql_real_escape_string($_POST['name']));
		// ...
		// return mysql_insert_id();
	}

	function zeigeFormular()
	{
		// <form method="post" name="foermchen">...
		// <input type="text" name="vorname"
		//	value="<?=stripslashes(htmlentities($_POST['vorname']))" size="32" />
		//  ... </form>
	}

	function pruefeFormular()
	{
		// if (!empty($_POST['vorname'])) { ... }
		// Sind alle Eingaben wie ich sie brauche?
	}

	// Sind Formulardateneingetroffen?
	if (isset($_POST['submit'])) {
		if (pruefeFormular()) {
			schreibeDate();
			echo "Danke. Formular gespeichert.";
		} else {
			echo "Mist. Eingaben fehlerhaft.";
			zeigeFormular();
		}
	} else {
		
		switch ($_GET['aktion']) {
			case 'editieren':
			break:
				if ($res = frageDatenbank($_GET['addressID'])) {
					zeigeFormular();
				}
			case 'sehen':
			default:
				if ($res = frageDatenbank($_GET['addressID'])) {
					zeigeDaten($res);
					printf("<a href=\"%s?aktion=editieren&addressID=5\">Editiere #5</a>"
						, $_SERVER['PHP_SELF']);
				}
			break;
		}		
	}
	
?>
 

drok

Klarapfel
Registriert
02.06.07
Beiträge
278
Ui, danke für die Skizze ;)
Also ich habe das ganze so gemacht:

Eine function zur Ausgabe der Datensätze in einer Tabelle

Code:
function dbausgabe(....)
{ 
       $sql="SELECT ... FROM  ".$tabellenname." ORDER BY ID DESC";
       $result=@mysql_query($sql, $link);
       if(mysql_num_rows($result)>0)
       { -> ausgabe der datensätze; }
}

und noch eine kleine Funktion zum testen ob gefragter Datensatz vorhanden ist

Code:
function dsvorhanden(...., $id)
{
        $sql="SELECT ID FROM ".$tabellenname." WHERE ID=".$id."";
        $result=@mysql_query($sql, $link);
        list($testid)=@mysql_fetch_row($result);
    
        return $testid;
}

Wenn nun die Seite erstmals aufgrufen wird, wird die Tabelle ausgegeben.
Wenn man nun auf den "Edit-Link" klickt wird die ID übergeben, der Datensatz abgefragt und
die Inhalte in das Formular geladen.

Das Formular liegt unter dem <?php ?>-Script auf der html-Seite.

Bei Absenden des Formulars werden dann die Daten ausgelesen und im Datensatz geändert.
 

Hilarious

Gelbe Schleswiger Reinette
Registriert
10.08.05
Beiträge
1.759
Fein. Ich hätte zwei Verbesserungsvorschläge (aber wirklich nur Vorschläge):

Code:
function dbAbfrage($link)
{
	// Ist die Verbindung zur Datenbank griffbereit?
	if ($link) {
		
		// Man kann bei SQL-Injection nicht vorsichtig genug sein:
		// $tabellenname muss ausserdem noch irgendwie definiert werden.
		$sql	=	sprintf("SELECT * FROM %s ORDER BY ID DESC"
						, mysql_real_escape_string($tabellenname));
		
		// Die Abfrage kann auch jetzt in die Hose gehen,
		// besser abfangen:
		if ($result = mysql_query($sql, $link)) {
		
			// Abfrage OK, aber gabs auch Ergebnisse?
			if (mysql_num_rows($result) > 0) {
				
				// Ausgabe mach eine andere Methode
				return $result;
			}
		}	
	}
	
	// Geht irgendetwas schief, wirft man FALSE zurück:
	return FALSE;
}

Jetzt kann man die Abfrage durchführen und die Ausgabe danach anstossen:

Code:
// Sag Hallo zur DB:
$connectionID = connect_to_db();

// Daten da?
if ($resultresource = dbAfrage($connectionID)) {
	MaleNachZahlen($resultresource);
} else {
	echo "Sowas. Die Datenbank mag Dich nicht."
}
 

Hilarious

Gelbe Schleswiger Reinette
Registriert
10.08.05
Beiträge
1.759
Verbesserungsvorschlag Nummer 2: Wenn Du nur ein Ergebnis bei einer Datenbankabfrage per SQL erwartest, solltest Du das Ergebnis von vornherein mit »LIMIT 1« in der Abfrage begrenzen. Das kann die Antwortzeit extrem verkürzen. Desweiteren kann man recht praktisch diese Antwort (in Deinem Fall die ID) mit mysql_result() bekommen. Ein Umleitung der Ergebnisse mit list() ist dann gar nicht mehr nötig.
 

drok

Klarapfel
Registriert
02.06.07
Beiträge
278
Danke für die Tipps, werd gleichmal ausprobieren.
Aber eine Frage habe ich da noch zum sprintf().

Code:
// Man kann bei SQL-Injection nicht vorsichtig genug sein:
// $tabellenname muss ausserdem noch irgendwie definiert werden.
$sql = sprintf("SELECT * FROM %s ORDER BY ID DESC"
       ,mysql_real_escape_string($tabellenname));
Warum nicht einfach

Code:
$sql = "SELECT * FROM ".mysql_real_escape_string($tabellenname)." ORDER BY ID DESC";
?

Bringt das irgendwelche Vorteile oder ist es weil es sonst vllt "nicht sauber" wäre ?


vg
 
Zuletzt bearbeitet:

Hilarious

Gelbe Schleswiger Reinette
Registriert
10.08.05
Beiträge
1.759
Danke für die Tipps, werd gleichmal ausprobieren.
Aber eine Frage habe ich da noch zum sprintf().

Code:
// Man kann bei SQL-Injection nicht vorsichtig genug sein:
// $tabellenname muss ausserdem noch irgendwie definiert werden.
$sql = sprintf("SELECT * FROM %s ORDER BY ID DESC"
       ,mysql_real_escape_string($tabellenname));
Warum nicht einfach

Code:
$sql = "SELECT * FROM ".mysql_real_escape_string($tabellenname)." ORDER BY ID DESC";
?

Bringt das irgendwelche Vorteile oder ist es weil es vllt "nicht sauber" ist ?


vg

Nöö, ist einfach Geschmackssache und bietet ein paar kleinere Vorteile, wenn man mit sprintf/printf arbeitet. Zum Beispiel kannst Du mit sprintf/printf die Ausgabe ganz gut formatieren, zum Beispiel führende Nullen oder Fließkommaformatierungen einfügen. Daher ist es recht übersichtlich mit sprintf/printf zu arbeiten. Wenn es zum Beispiel nur eine Zahl und keine alphanumerische Zeichenkette sein darf, kannst Du das mit sprintf("%02u", $variable) abfedern (im Beispiel werden bis zu zwei führenden Nullen angefügt und der Wert kann nur aus positivin Zahlen bestehen, daher fallen negative Zahlen und Zeichenketten heraus). Dies hilft auch bei der Entwicklung, da du dann sicher(er) stellen kannst, dass wirklich nur das passiert, was Du erwartest.
 

drok

Klarapfel
Registriert
02.06.07
Beiträge
278
hm das könnte in der Tat recht hilfreich sein ;)
bis hierher schonmal Danke für die Erklärung und die Tipps.
Mal schaun was demnäschst noch so anrollt ;)