Indexproblem bzw. wie vergibt man einen Index automatisch ?

batigoalx

Grünschnabel
Eingabeformular, register globals off, $_POST - Problematik

Hallo,
zunächst einmal ein großes Kompliment für das Forum ! Als totaler Anfänger habe ich mich an dem open book von galileo computing versucht.
Zu meinem großen Erstaunen hat der Anfang sogar funktioniert - jetzt stehe ich aber doch sehr auf dem Schlauch.

Der Anleitung folgend habe ich zunächst die Datenbank und die Tabelle über phpmyadmin eingerichtet. Anschließend habe, ich wie angeraten, ein zusätzliches Feld ( bei mir 'nummer' ) als Index angelegt und schrittweise über phpmyadmin mit den Attributen 'not null' und 'unique' versehen.

Ich habe mir zunächst nichts dabei gedacht, zumal Mysql den Warnhinweis, es sei kein Index vergeben, prompt abgeschalte hat. Stutzig hätte mich machen müssen, dass ich bei dem Versuch über phpmyadmin einen Datensatz ohne Index einzufügen eine
Fehlermeldung bekam - aber so wie ich das verstanden habe, ist das ja gerade der Zweck eines Indexes. Außerdem hat die einfache Ausgabe der kompletten Datenbank über Skript funktioniert.

In nachstehendem Eingabeskript bin ich mit meinem Latein am Ende. Ein Index wird, soweit ich sehe, nicht angesprochen, und ich habe keine Ahnung, wie ich mein Feld 'nummer' einbinden kann.
Ich kann zwar Daten eingeben, es erscheint jedoch keine Meldung. Die Eingabeseite lädt neu, erscheint leer, die Datenbank bleibt unverändert :(.

Code: uf13.php

<html>
<head>
<?php
if ($gesendet)
{
$db = mysql_connect();

$sqlab = "insert personen";
$sqlab .= "(name, vorname, personalnummer,";
$sqlab .= " gehalt, geburtstag) values ";
$sqlab .= "('$na', '$vn', $pn, $ge, '$gt')";

mysql_db_query("firma", $sqlab);

$num = mysql_affected_rows();
if ($num>0)
echo "Es wurde 1 Datensatz hinzugefügt<p>";
else
{
echo "Es ist ein Fehler aufgetreten, ";
echo "es wurde kein Datensatz hinzugefügt<p>";
}
mysql_close($db);
}
?>
</head>

<body>
Geben Sie einen vollständigen Datensatz ein und senden Sie das
Formular ab:
<form action = "uf13.php" method = "post">
<input name="na"> Name<p>
<input name="vn"> Vorname<p>
<input name="pn"> Personalnummer (eine ganze Zahl)<p>
<input name="ge"> Gehalt (Nachkommastellen mit Punkt)<p>
<input name="gt">
Geburtsdatum (in der Form JJJJ-MM-TT)<p>
<input type="submit" name="gesendet">
<input type="reset">
</form>

Alle Datensätze <a href="uf07.php">anzeigen</a>
</body>
</html>
Was ich nun erhoffe, ist Hilfe bei a) der Einfügung meines 'nummer'-Feldes bzw. b) der Erstellung einer Art automatischen Indexes für jeden neuen Datensatz. Denn was nützt es dem User, wenn er sich zuerst die komplette Datenbank anschauen muss um den zuletzt vergebenen Index festzustellen ? Fragt sich nur, ob das mit meiner Struktur bzw. meinem Skript überhaupt geht ? Ich hoffe stark, dass da noch etwas zu retten ist.

Dank im voraus. Ich hoffe, nicht zu sehr gelangweilt zu haben. Wie gesagt, ich bin blutiger Anfänger und wollte so genau wie möglich beschreiben, was ich bisher gemacht habe.

MfG
batigoalx
 
Zuletzt bearbeitet:
@birnkammer:

Zunächst einmal vielen Dank für die schnelle Antwort. Hätte nicht gedacht, dass sich überhaupt jemand mit so einer newbie-Klamotte abgibt.

1. Du hast natürlich Recht, in der php.ini ist bei mir register globals auf off.

2. Davon stand in dem open book erst einmal nichts, obwohl es php4 behandelt :(:

3. Jetzt habe ich natürlich richtig ein Problem. Ich würde gerne mit dem open book weiterarbeiten, aber wie ich das sehe, müßte ich dann entweder register globals auf on setzen oder das skript umschreiben.
Ersteres möchte ich nicht, weil php von einer Joomla Installation mitbenutzt wird, letzteres kann ich nicht.

4. Gibt es die Möglichkeit, register globals on für z.B einen bestimmten Ordener zu erlauben indem die Skripte, Eingabe, Ändern, Löschen sind ? Oder ist das Quatsch, weil man es dann auch gleich komplett erlauben kann ?

5. Würde dasselbe Problem auch bei Auswahlskripten auftauchen, also praktisch bei jeder Aktion "von außen" ?

Fragen über Fragen. Für ein paar Antworten wäre ich dankbar.

MfG
batigoalx
 
3. Jetzt habe ich natürlich richtig ein Problem. Ich würde gerne mit dem open book weiterarbeiten, aber wie ich das sehe, müßte ich dann entweder register globals auf on setzen oder das skript umschreiben.
Ersteres möchte ich nicht, weil php von einer Joomla Installation mitbenutzt wird, letzteres kann ich nicht.
Schreib "einfach" alle Daten, die "von aussen" kommen um. Wenn es noch nicht zu viele sind ist das sicherlich der beste Weg

4. Gibt es die Möglichkeit, register globals on für z.B einen bestimmten Ordener zu erlauben indem die Skripte, Eingabe, Ändern, Löschen sind ? Oder ist das Quatsch, weil man es dann auch gleich komplett erlauben kann ?
Ja gibt es, ist aber auch nicht so sinnvoll, da das Problem weiterhin besteht. Du erstellst in den betreffenden Ordner eine .htaccess Datei mit folgendem Inhalt:
Code:
php_flag register_globals on
Diese Änderung muss aber dein Hoster erlauben
5. Würde dasselbe Problem auch bei Auswahlskripten auftauchen, also praktisch bei jeder Aktion "von außen" ?
Was meinst du damit?

Um es nochmal zusammenzufassen:
Wenn es noch nicht zu viele Skript sind, ist umschreiben der beste Weg. Sonst entweder register_globals lokal auf on setzen (mit htaccess) oder mit extract(). Würde ich dir aber nicht empfehlen, ist aber deine Entscheidung

Viele Grüße
 
@birnkammer:

Danke für die schnellen Antworten.

1. Ich würde das skript liebend gerne umschreiben, zumal es nur eins ist, nur mit dem "einfach" ist es nicht getan. Ich war echt froh, das open book gefunden zu haben, da es angelich für DAUS wie mich perfekt ist und jetzt das.

Ich habe mir schon einen Wolf gesucht und stoße immer wieder auf $_POST bin ich da richtig, oder auch wieder Blödsinn ?

In meinem Fall ist es doch so, dass 5 Variablen über ein Formular method=post
übergeben werden. Ich weiss nur überhaupt nicht, wo ich in obigem Skript ansetzen soll bzw. muss.

2. Die Lösung mit .htaccess würde gehen, da ich XAMPP benutze.Aber wenn Du es nicht für sinnvoll hältst, würde ich davon Abstand nehmen.

3. Wahrscheinlich blöd ausgedrückt. Mit "von aussen" meinte ich Aktionen, bei denen ein Benutzer etwas verändert, bzw. eine Aktion übermittelt. Einfügen, ändern, löschen, Auswahl über Check bzw. Radiobuttons usw. . Die einfache Ausgabe des gesamten Datenbestandes über ein Skript z.B. funktioniert ja.

MfG
batigoalx
 
Zuletzt bearbeitet:
1. Ich würde das skript liebend gerne umschreiben, zumal es nur eins ist, nur mit dem "einfach" ist es nicht getan. Ich war echt froh, das open book gefunden zu haben, da es angelich für DAUS wie mich perfekt ist und jetzt das.

Ich habe mir schon einen Wolf gesucht und stoße immer wieder auf $_POST bin ich da richtig, oder auch wieder Blödsinn ?

In meinem Fall ist es doch so, dass 5 Variablen über ein Formular method=post
übergeben werden. Ich weiss nur überhaupt nicht, wo ich in obigem Skript ansetzen soll bzw. muss.
Es kommt eben immer darauf an, wie die Variablen abgeschickt wurden.

Per method=POST : $_POST['variablenname']
Per method=GET oder über URL : $_GET['variablenname']

2. Die Lösung mit .htaccess würde gehen, da ich XAMPP benutze.Aber wenn Du es nicht für sinnvoll hältst, würde ich davon Abstand nehmen.
Nunja, wenn deine Skripte suaber programmiert sind, wirst du mit register_globals keine Probleme haben. Dabei musst du aber wirklich (fast) jede Variable validieren.

Viele Grüße
 
Hm, um ehrlich zu sein, bin ich wohl echt zu blöd. Je mehr ich darüber lese, desto weniger verstehe ich noch.

1. Könnteste Du mir mal ein Beispiel für mein oben gepostetet Skript posten, damit ich es mal bildlich vor mir sehe ? Vor allem WO und WIE $_Post da richtig angewandt wird.

2. Ich nehme an, wenn Du so ein Skript für denselben Zweck schreiben würdest, würde das total anders aussehen, oder ?
 
PHP:
<html>
<head>
<?php
if ($_POST['gesendet'])
{
	$db = mysql_connect();

	$sqlab = "insert personen";
	$sqlab .= "(name, vorname, personalnummer,";
	$sqlab .= " gehalt, geburtstag) values ";
	$sqlab .= "('" . $_POST['na'] . "', '" . $_POST['vn'] . "', " . intval(abs($_POST['pn'])) . ", " . abs($_POST['ge']) . ", '" . $_POST['gt'] . "')";
	/* intval() konvertiert die Daten in eine Ganzzahl, abs() liefert den Betrag einer Zahl */
	
	mysql_db_query("firma", $sqlab);
	
	$num = mysql_affected_rows();
	if ($num>0)
	{
		echo "Es wurde 1 Datensatz hinzugefügt<p>";
	}
	else
	{
		echo "Es ist ein Fehler aufgetreten, ";
		echo "es wurde kein Datensatz hinzugefügt<p>";
	}
	
	mysql_close($db);
}
?>
</head>

<body>
Geben Sie einen vollständigen Datensatz ein und senden Sie das
Formular ab:
<form action="uf13.php" method="post">
<input name="na"> Name<p>
<input name="vn"> Vorname<p>
<input name="pn"> Personalnummer (eine ganze Zahl)<p>
<input name="ge"> Gehalt (Nachkommastellen mit Punkt)<p>
<input name="gt">
Geburtsdatum (in der Form JJJJ-MM-TT)<p>
<input type="submit" name="gesendet">
<input type="reset">
</form>

Alle Datensätze <a href="uf07.php">anzeigen</a>
</body>
</html>
Wobei man die übertragenen Daten vor dem Eintragen in die Datenbank noch gegen SQL-Injections sichern sollte. Stichwort: [phpf]mysql_real_escape_string[/phpf]
 
Zuletzt bearbeitet:
@ mAu:
Vielen, vielen Dank ! Ob Du es glaubst, oder nicht, ich habe heute Nacht echt überlegt,
ob ich Dich nicht via PM auf meinen post aufmerksam machen sollte.Da mir Deine posts für newbies bei meiner Verzweifelten Suche schon aufgefallen sind. Habe mich dann aber doch nicht getraut. Genau so ein Beispiel habe ich gebraucht.

1. Der von Dir gepostete code funktioniert natürlich. Allerdings mit einer kleinen Einschränkung. Die Variable für Gehalt, wird nicht richtig übergeben. Es werden Datensätze hinzugefügt, Gehalt wird jedoch mit dem Wert 0.00 eingetragen.

2. Zuerst dachte ich, Du hättest Dich vertippt, da in Deinem code zweimal 'na', also die Variable für den Namen verwandt wird. Ein einfaches Ersetzendurch 'ge' hatte jedoch denselben Effekt, Datensatz eingetragen, Gehalt 0.00.

3. Mit

$sqlab .= "('" . $_POST['na'] . "', '" . $_POST['vn'] . "', " . intval(abs($_POST['pn'])) . ", " . $_POST['ge'] . ", '" . $_POST['gt'] . "')";
/* intval() konvertiert die Daten in eine Ganzzahl, abs() liefert den Betrag einer Zahl */
funktioniert es. Fragt sich nur, ob das richtig ist, oder Anfängerdusel. Jedenfalls werden Zahlenwerte korrekt eingetragen. Bei Textwerten gibt es wie gewünscht eine Fehlermeldung. Vielleicht liegt es daran, dass das Feld vom Typ "double" ist und keine Textwerte zuläßt ?

4. Was die von Dir angesprochenen Sicherheitsaspekte betrifft, möchte ich die erst einmal hinten anstellen - bitte keine Schreikrämpfe bekommen ;).
Ich möchte lieber sehen, ob ich jetzt die Formulare zur Auswahl per radio-button, zum Ändern und Löschen hinbekomme.Richtig sicher wäre es doch eh nur mit Login, Adminbereich, Session und mysql_real_escape_string()-Überprüfung.

5. Desweiteren würde ich diesen Post hier gerne umbennen. Erstens hat es ja mit Indexvergabe schon fast nichts mehr zu tun. Es geht ja eher um "Eingabeformular, register globals off, $_POST - Problematik".
Zweitens ist mir beim nochmaligen Lesen des Tutorials aufgefallen, dass sehr wohl ein Index vergeben wird. Das Feld Personalnummer ist vom Typ integer, not null, unique. Ich Trottel habe das überlesen und bitte den Fehler zu entschuldigen - mea culpa :(.

Nochmals, DANKE mAu & birnkammer !
batigoalx
 
Zurück