You are not logged in.

  • Login

1

Tuesday, January 26th 2010, 12:20am

Telefonbuch - PHP feat. MySql

Guten Abend community,

ich programmiere gerade ein Telefonbuch mit PHP und als Backend MySql.

Habe nur das Problem das die INSERT INTO -Anweisung nicht ausgeführt wird. Hier nun meine Datein.
db-connection.php

PHP Quellcode

1
2
3
4
5
6
7
8
9
<?php
/*DB-Connect START*/
	$verbindung = mysql_connect ("localhost",	"username", "password")
	or die ("keine Verbindung möglich. Bitte Webmaster kontaktieren");
 
	mysql_select_db("test")
	or die ("keine Verbindung möglich. Bitte Webmaster kontaktieren");
/*DB-Connect END*/
?>

Hier die Eingabeseite

HTML Code

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
	<head>
		<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
		<title>Insert title here</title>
	</head>
	<body>
	<h1>Neuer Eintrag</h1>
		<form action="EingabeVerarbeitungAusgabe.php" method="post" enctype="multipart/form-data">
			<table>
				<tr>
					<td>Name:</td>
					<td><input type="text" name="Name"></input></td>
					<td>Vorname:</td>
					<td><input type="text" name="Vorname"></input></td>
				</tr>
				<tr>
					<td>Telefon:</td>
					<td> <input type="text" name="Telefon"></input></td>
				</tr>
				<tr>
					<td>Mobil:*</td>
					<td> <input type="text" name="Mobil"></input></td>
				</tr>
				<tr>
					<td>Fax:*</td>
					<td> <input type="text" name="Fax"></input></td>
				</tr>
				<tr>
					<td>Email:*</td>
					<td> <input type="text" name="Email"></input></td>
				</tr>
				<tr>
					<td>ICQ:*</td>
					<td> <input type="text" name="Icq" size="9"></input></td>
				</tr>
				<tr>
					<td>Geburstag: </td>
					<td>
						<input type="text" name="Geburtstag" value='01' maxlength='2' size="2"></input>
						<input type="text" name="Geburtsmonat" value='01' maxlength='2' size="2"></input>
						<input type="text" name="Geburtsjahr" value='1900' maxlength='4' size="4"></input>
					</td>
				</tr>
				<tr>
					<td>Strasse:</td>
					<td> <input type="text" name="Strasse"></input></td>
					<td>Hausnummer: </td>
					<td><input type="text" name="Hausnummer" size="3"></input></td>
				</tr>
				<tr>
					<td>Plz:</td>
					<td> <input type="text" name="PLZ" size="5" maxlength="5"></input></td>
					<td>Wohnort: </td>
					<td><input type="text" name="Wohnort"></input></td>
				</tr>
				<tr>
					<td>Vorstand:</td>
					<td> <input type="checkbox" name="Vorstand"></input></td>
					<td>Ausbilder: </td><td><input type="checkbox" name="Ausbilder"></input></td>
					<td></td>
				</tr>
				<tr>
					<td colspan="2"><input type="submit" value="Send"></input></td>
					<td colspan="2"><input type="reset" value="Reset"></input></td>
				</tr>
			</table>
		</form>
		*Freiwillige Angaben
	</body>
</html>

Hier die Verarbeitende Datei

PHP Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
<?php
include "db-connect.php";
$Name= $_POST[Name];
$Vorname= $_POST[Vorname];
$Telefon= $_POST[Telefon];
$Mobil= $_POST[Mobil];
$Fax= $_POST[Fax];
$Plz= $_POST[Plz];
$Wohnort= $_POST[Wohnort];
$Strasse= $_POST[Strasse];
$Hausnummer= $_POST[Hausnummer];
$Email= $_POST[Email];
$Icq= $_POST[Icq];
$Geburtstag= $_POST[Geburtstag];
$Geburtsmonat= $_POST[Geburtsmonat];
$Geburtsjahr= $_POST[Geburtsjahr];
$Vorstand= $_POST[Vorstand];
$Ausbilder= $_POST[Ausbilder];
$id=mysql_fetch_object(mysql_query("SELECT MAX(ID) as max FROM Telefonbuch;"));
$Geburt=$Geburtsjahr."-".$Geburtsmonat."-".$Geburtstag;
$id=$id+1;
 
mysql_query("INSERT INTO Telefonbuch VALUES (
$id,
$Name,
$Vorname,
$Telefon,
$Mobil,
$Fax,
$Plz,
$Wohnort,
$Strasse,
$Hausnummer,
$Email,
$Icq,
$Geburt,
$Vorstand,
$Ausbilder
);");
?>


Habe bereits einen BSP-Datensatz in der Datenbank mit allen Ausgefüllten Feldern.
Damits einfach bleibt gehen wir mal davon aus, das alle Felder NULL wären und keins davon NOT NULL.

Falls sich jmd in der Lage fühlt sich kurz einzulesen...sollte keine 5 min dauern...und die Zeit udn Güte hat mir zu helfen, so tue er dies bitte.

mfg maxbrauner

P.S.: Habe breits vor Jahren mal PHP und MySql programmiert....nur ich kanns net mehr wie es aussieht und will es hiermit wieder auffrischen.

2

Tuesday, January 26th 2010, 8:52am

Hallo max,

probier doch mal den query String nach folgendem Muster Aufzubauen ;)

SQL Code

1
INSERT INTO tbl_name (sp_name_0,sp_name_1, ...) VALUES(wert0, wert1, ...);



gruß CooC

3

Tuesday, January 26th 2010, 9:02am

und lasse dir mal die Fehlermeldung ausgeben, bzw den falschen String ausgeben:

PHP Quellcode

1
2
3
4
5
$sql = "INSERT INTO ....";
$result = mysql_query($sql);
if (!$result) {
    die('Invalid query: ' . mysql_error().$sql);
}


außerdem ist deine Programmierung anfällig für SQL Injections.
Es sollte überall so aussehen: $Name= mysql_real_escape_string($_POST['Name']);

PS: Willkommen im Forum ihr beiden ;)

4

Tuesday, January 26th 2010, 10:22am

Hi,

wenn deine Id in der Tabelle Telefonbuch auf autoincrement steht, dann brauchst du garkeine id beim Insert übergeben.

Falls nicht, was natürlich komisch wäre, müsstest du die ausgelesene id selber incrementieren, da du sonst für jeden Datensatz die selbe id hast. Und wenn deine id der Primärschlüssel ist, dann ist hier beim Insert Schluss.

5

Tuesday, January 26th 2010, 12:05pm

Hi,

wenn deine Id in der Tabelle Telefonbuch auf autoincrement steht, dann brauchst du garkeine id beim Insert übergeben.

Falls nicht, was natürlich komisch wäre, müsstest du die ausgelesene id selber incrementieren, da du sonst für jeden Datensatz die selbe id hast. Und wenn deine id der Primärschlüssel ist, dann ist hier beim Insert Schluss.

Nein meine ID steht nciht auf Auto_increment, weil wieso soll ich mich darauf verlassen wenn ich selber invrementieren kann udn dies dann mit Sicherheit richtig passiert.
und lasse dir mal die Fehlermeldung ausgeben, bzw den falschen String ausgeben:

PHP Quellcode

1
2
3
4
5
$sql = "INSERT INTO ....";
$result = mysql_query($sql);
if (!$result) {
    die('Invalid query: ' . mysql_error().$sql);
}


außerdem ist deine Programmierung anfällig für SQL Injections.
Es sollte überall so aussehen: $Name= mysql_real_escape_string($_POST['Name']);

PS: [lexicon]Willkommen[/lexicon] im Forum ihr beiden ;)

Dank der Fehlermeldung bin ich weitergekommen. Danke!!

if(close = possible)
{do it}
;-)

6

Tuesday, January 26th 2010, 1:24pm

Nein meine ID steht nciht auf Auto_increment, weil wieso soll ich mich darauf verlassen wenn ich selber invrementieren kann udn dies dann mit Sicherheit richtig passiert.


Du verschwendest Ressourcen durch den Query und es ist immer besser solche Logiken nicht dem Programm sondern der DB zu überlassen. Du darfst MySQL in der Sache auch vertrauen, zumindestens ist es "sicherer" als selber zu inkrementieren ;)

7

Tuesday, January 26th 2010, 1:39pm

Nein meine ID steht nciht auf Auto_increment, weil wieso soll ich mich darauf verlassen wenn ich selber invrementieren kann udn dies dann mit Sicherheit richtig passiert.


1. Verlässt du dich bei hundertausend anderen Dingen auch schon auf die Datenbank. Wenn die nicht geht, geht bei deinem Script auch nichts anderes. Wenn die funktioniert, funktioniert auch auto_increment.
2. Verletzt du das Transaktionskonzept auf ziemlich mieseste Weise: Wenn zwischen deinem SELECT MAX (ID) und dem INSERT INTO auch nur eine Millisekeunde liegt, funktioniert dein Schmuh ab tausend Eintragungen pro Sekunde garantiert nicht mehr, und ansonsten ist es Glücksache. Das selber machen ist absolutes Gebastel und nicht mehrbenutzerfähig. Du müsstest die Datenbank zumindest für Schreibende Zugriffe sperren, zwischen dem Select und dem Insert. Und wenn das machst und dann das Script aus irgendwelchen Gründen abraucht, trägt niemand mehr irgendetwas ein.
3. Verletzt deine Datenbank wirklich jede Normalform, sogar die Erste (und die gibts eigentlich bei relationealen Datebanken geschenkt :)

PHP Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
<?php
include "db-connect.php";
$Name= $_POST[Name];
$Vorname= $_POST[Vorname];
$Telefon= $_POST[Telefon];
$Mobil= $_POST[Mobil];
$Fax= $_POST[Fax];
$Plz= $_POST[Plz];
$Wohnort= $_POST[Wohnort];
$Strasse= $_POST[Strasse];
$Hausnummer= $_POST[Hausnummer];
$Email= $_POST[Email];
$Icq= $_POST[Icq];
$Geburtstag= $_POST[Geburtstag];
$Geburtsmonat= $_POST[Geburtsmonat];
$Geburtsjahr= $_POST[Geburtsjahr];
$Vorstand= $_POST[Vorstand];
$Ausbilder= $_POST[Ausbilder];
$id=mysql_fetch_object(mysql_query("SELECT MAX(ID) as max FROM Telefonbuch;"));
$Geburt=$Geburtsjahr."-".$Geburtsmonat."-".$Geburtstag;
$id=$id+1;
 
///JETZT ruft eine andere Person aus dem Internet auch dieses Script auf, BEVOR der Nachfolgnde String zusammengesetzt wird und als Query abgeschickt wird. Dann bekommt er als MAX(ID) exakt den gleichen Wert.
 
mysql_query("INSERT INTO Telefonbuch VALUES (
$id,
$Name,
$Vorname,
$Telefon,
$Mobil,
$Fax,
$Plz,
$Wohnort,
$Strasse,
$Hausnummer,
$Email,
$Icq,
$Geburt,
$Vorstand,
$Ausbilder
);");
?>

8

Wednesday, January 27th 2010, 7:48am

1. Verlässt du dich bei hundertausend anderen Dingen auch schon auf die Datenbank. Wenn die nicht geht, geht bei deinem Script auch nichts anderes. Wenn die funktioniert, funktioniert auch auto_increment.
2. Verletzt du das Transaktionskonzept auf ziemlich mieseste Weise: Wenn zwischen deinem SELECT MAX (ID) und dem INSERT INTO auch nur eine Millisekeunde liegt, funktioniert dein Schmuh ab tausend Eintragungen pro Sekunde garantiert nicht mehr, und ansonsten ist es Glücksache. Das selber machen ist absolutes Gebastel und nicht mehrbenutzerfähig. Du müsstest die Datenbank zumindest für Schreibende Zugriffe sperren, zwischen dem Select und dem Insert. Und wenn das machst und dann das Script aus irgendwelchen Gründen abraucht, trägt niemand mehr irgendetwas ein.
3. Verletzt deine Datenbank wirklich jede Normalform, sogar die Erste (und die gibts eigentlich bei relationealen Datebanken geschenkt :)
Zu 1. Das sagte mir mein Ausbilder, das man sich besser nicht auf Auto-Increment stellen solltest, sondern dies durch die Software machen solltest.
Zu 2. Es giibt keine Mehrbenutzerbenutzung auf dieses Formular. Dieses Formular wird nur dem Webmaster zur Verfügung gestellt. Alle Anderen können nur lesen.
Zu 3. Bei vlt maximal 50 Datensätzen lohnt es sich nicht hier zu normalisieren.

Zur Info für alle:
  • Dieses Formular steht nur einem Benutzer zur Verfügung.
  • Die Ausgabe können alle sehen.
  • Maximale Anzahl an Datensätzen ist 50.

Diese Sachen ergaben sich bei einer Anforderungsanalyse. Diese wurde mit dem 1. Vorstizenden und dem Webmaster (me) gemacht. Dieses Telefonbuch wird für Vorstandssdaten und Ausbilderdaten benutzt.

Mfg maxbrauner

9

Wednesday, January 27th 2010, 8:11am

Nochmal zum autoincrement.
Auch wenn es für deinen fall funktionieren mag wäre es in der professionellen programmierung ein fataler fehler. Denn damit ließe sich deine anwendung nicht auf einem master master replikationsproblem installieren.
Es ist immer ratsam features nicht nachzuimplementieren. Die schöpfer von datenbanken haben sich meist etwas dabei gedacht.
Lg

10

Wednesday, January 27th 2010, 8:18am

Die schöpfer von datenbanken haben sich meist etwas dabei gedacht.
That's right. Nur da ich Hilfe von meinem Ausbilder bekommen wolte musste ich es so machen. Sobald der Auto_Increment sieht, sieht der schwarz.

Persönlich hätte ich auch Auto_Increment genommen, wobei die nchträgliche Implementation auch rausfliegen wird wenn alles läuft und ich somit keine Hilfe mehr benötige.
enn damit ließe sich deine anwendung nicht auf einem master master replikationsproblem installieren.
Ein WAAS??

11

Wednesday, January 27th 2010, 9:34am

Das kannst du deinem Ausbilder ja gerne mal erklären.

Deine Anwendung würde nicht auf einem Master-Master System laufen.
Wenn es mehrere Datenbank Master gibt (bei verteilten Anwendungen) dann replizieren diese ihre Daten voneinander.
Ein Insert vom einen landet also sofort auf dem anderen und umgekehrt.
Damit das ganze funktioniert gibt es einen sogenannten increment Wert - der eine Master schreibt also nur die IDs 1,3,5,7, ... - der andere schreibt 2,4,6,8, usw

Und bei einem Master-Slave System (das wird schon bei mittelgroßen Websites verwendet) würde es auch zu Konflikten kommen.
Denn Master und Slave sind nicht immer synchron.

Beispiel:
Der aktuelle Max Wert beim Slave ist die 99.
Du machst also einen Eintrag in die Datenbank mit der ID Nummer 100.
Der Eintrag ist aber noch nicht beim Slave angekommen.
Beim nächsten Eintrag, liest du den Max Wert aus, erhältst wieder die 99, und machst wieder einen Eintrag mit der 100.
... und es kracht... ;)

12

Wednesday, January 27th 2010, 9:41am

Ja ist klar was du meinst, aber da es ja nur einen Nutzer gibt der Daten einträgt, per Webformular, wird das schon klappen. Das war auch ehr eine Übung in PHP fit zu bleiben.

13

Thursday, January 28th 2010, 5:07pm

Bei 50 Benutzern und nur einem der eingibt kannste auch n Schimpansen hinsetzen der es sich merken soll, oder ein Excelesheet, dafür braucht niemand eine Datenbank. Ich weiß nicht was der Sinn und Zweck deiner Ausbildung sein und wofür der Ausbilder ausbilden soll, aber offensichtlich nichts was mit Datenbanken zu tun hat. Wenn du jemals echte Datenbanken basteln willst, musst du normalisieren und auf Mehrbenutzerbetrieb achten. Außerdem sollte man sich nicht unnötig den Weg zu replizierten Datenbanken versperren, falls man man unerwarteten Erfolg mit der Anwendung hat.
Außerdem ändern sich Anforderungen ständig. Was ist wenn der Personal- oder Betriebsrat oder sonstwer mitkriegt, dass es die Datenbank gibt und beschlossen wird, dass das Geburtstjahr nicht angezeigt werden darf (wegen Datenschutz und so), das Datum aber schon (wegen Gratulieren und so), dann wirds ungemütlich. Dann darf irgendein Pechvogel (in diesem Fall du), die ganze Kacke von Hand ändern bei jeder einzelnen Person. Oder wenn der Vorstand sich ändert? Kommt ja auch öfter vor, dann darf wieder der Webmaster bei allen dies betrifft den Vorstand ändern. Bei Ausbilder dasselbe, weil du ja da Tippfehler drin haben kannst, geht es nicht mit einem Statement. Hinzukommt die normale Pflege die du sowieso machen musst, wie Adressänderungen etc. Diese Datenbank könnte aufgrund ihres miesen "Designs" ein Fulltime-Job werden.

14

Thursday, January 28th 2010, 9:25pm

Also laufen tuts mittlerweile. Und wieso nicht mit Excelsheet?

Weils mir aufn Sack geht das der komplette Vorstand un die Ausbilder meines Vereins (wirklicher Verein...e.V.) dauernd meckert das die scheiß listen nicht aktuell sind.....weil die nicht die aktuellsten sind.....zumindest net die die aufn rechner von dennen sind. Deswegen will ich die Liste abschaffen und die sollen sich das Online angucken könne in einem internen privaten Bereich durch die oberste Instanz der Vereinsstruktur (wir sind nur eine Og) abgesegnete Sicherheitsstufe.

Die Formulare und die Datenbank exisitieren, damit ich oder mein Nachkömmling dies sehr einfach haben.

Ich habe in mühevoller Kleinarbeit bereits die komplette Homepage auf ne Click'i'Bunti-GUI umgestellt. Mit FCK-Editor, CMS und Co...

Also wäre es sinnig eine GUI dafür zu haben und dies nicht direkt im Quelltext machen zu müssen/einfach Änderungen zu realisieren.

MfG maxbrauner

P.S.: Bin FIAE in Ausbildung

15

Thursday, January 28th 2010, 9:52pm

Also laufen tuts mittlerweile. Und wieso nicht mit Excelsheet?

Weils mir aufn Sack geht das der komplette Vorstand un die Ausbilder meines Vereins (wirklicher Verein...e.V.) dauernd meckert das die scheiß listen nicht aktuell sind.....weil die nicht die aktuellsten sind.....zumindest net die die aufn rechner von dennen sind. Deswegen will ich die Liste abschaffen und die sollen sich das Online angucken könne in einem internen privaten Bereich durch die oberste Instanz der Vereinsstruktur (wir sind nur eine Og) abgesegnete Sicherheitsstufe.

Die Formulare und die Datenbank exisitieren, damit ich oder mein Nachkömmling dies sehr einfach haben.

Ich habe in mühevoller Kleinarbeit bereits die komplette Homepage auf ne Click'i'Bunti-GUI umgestellt. Mit FCK-Editor, CMS und Co...

Also wäre es sinnig eine GUI dafür zu haben und dies nicht direkt im Quelltext machen zu müssen/einfach Änderungen zu realisieren.

MfG maxbrauner

P.S.: Bin FIAE in Ausbildung


Jaja, das Problem ist hier ein organisatorisches. Du versuchst das Problem der dezentralen Datenhaltung und unterschiedlichen Versionierung durch ein (sorry) schlechtes Datenbankprogramm zu bewältigen. Tatsächlich könnte ein Datenbankprogramm das sogar, aber in deiner Umsetzung pflegst ja nur du die Daten. Alternativ könntest auch ein Excel-Sheet erstellen,dass in einem freigegeben Ordner auf einem Server liegt und allen Benutzern Leseberechtigungen und dir selber Vollberechtigungen erteilen und anschließend den Link zur Datei kommunizieren. So verwenden alle eine einzige aktuelle Version und der einzige der Änderungen daran vornehmen kann bist du. Du hättest dein abgesegnete Sicherheitsstufen sowie das Problem mit den konkurrierenden Versionen mit minimalem Aufwand erledigt. Die Vorteile liegen ja auf der Hand: Deutlich geringerer Aufwand, du benötigst kein Apache+PHP+MySQL-Server, keine Website basteln, die User könnten die Listen sogar in andere Formate exportieren oder als Datenquelle für Serienbriefe o.ä. verwenden. Nachteil ist auch klar: Excel erlaubt, dass immer nur einer die Datei schreibend öffnet.

FIAE = Fachinformatiker Anwendungsentwicklung? Und dein Ausbilder? Ist der etwa auch Informatiker?

16

Friday, January 29th 2010, 12:11am

Jaja, das Problem ist hier ein organisatorisches.
Richtig!!!
Alternativ könntest auch ein Excel-Sheet erstellen,dass in einem freigegeben Ordner auf einem Server liegt und allen Benutzern Leseberechtigungen und dir selber Vollberechtigungen erteilen und anschließend den Link zur Datei kommunizieren.
Wir sprechen vom typischen DAU, also fällt diese Option raus.
Die Vorteile liegen ja auf der Hand: Deutlich geringerer Aufwand,
Wäre korrekt....
du benötigst kein Apache+PHP+MySQL-Server,
Stellt die oberste Stelle, also sowieso vorhanden und bereits in Benutzung.
keine Website basteln,
War ideal um meine PHP-Kenntnisse mal wieder aufzufrischen, was auch irgendwo der Sinn war für das Projekt.
die User könnten die Listen sogar in andere Formate exportieren oder als Datenquelle für Serienbriefe o.ä. verwenden.
Dafür stellt ein Verwaltungsprogramm von ganz oben die Listen bereit, welche nicht von mir, sondern von der "Kasse" bezogen werden.
FIAE = Fachinformatiker Anwendungsentwicklung? Und dein Ausbilder? Ist der etwa auch Informatiker?
FIAE, jop das ist richtig.
Unser Ausbilder ist gelernter Strippenzieher von der Telekom...keine Ahnung wie man den Beruf schimpft.
Der hat auch was aufn Kasten...kein Thema, er weiß es zu vermitteln, aber leider besteht das Problem darin das wir die "Technik" lernen sollen, und somit sozusagen wie Auto-Increment funkt.

Hoffe ich habe dir weitergeholfen und Sry falls es gräslich aussieht in Sachen formatierung.

17

Friday, January 29th 2010, 11:52am

Achso ok, alles klar.

Unser Ausbilder ist gelernter Strippenzieher von der Telekom...keine Ahnung wie man den Beruf schimpft.
Ich glaub eine passendere Bezeichnung gibt es für diese Spezies nicht ;)
Der hat auch was aufn Kasten...kein Thema, er weiß es zu vermitteln, aber leider besteht das Problem darin das wir die "Technik" lernen sollen, und somit sozusagen wie Auto-Increment funkt.
Das ist halt die Sache, genau so funktioniert auto_increment eben nicht, weswegen du hier massiv Gegenwind bekommen hast. Wahrscheinlich wirst du Datenbanken in deiner Ausbildung ja noch kennenlernen, inklusive Transaktionskonzept - ich denke dann wird dir die Tragweite des Problems eher bewusst.

Social bookmarks