Tipps für größere Projekte

Hallo zusammen,

ich programmiere derzeit ein größeres Projekt zur Eingabe von Kundendaten und deren Auswertung.

Ich verwende kein Templatesystem.
Einfach gesagt ist derzeit der Aufbau einer jeden Seite.

-Beginnt mit einem session_start()
-Verbindungsaufbau zur Datenbank, wobei dieser über eine gesonderte Datei durchgeführt und diese dann über require eingebunden wird. Als nächstes
-Festlegung der Variablen für INSERT und UPDATE mit den jeweiligen $_POST Variablen
-Prüfung, welche Buttons betätigt wurden, per IF-Abfrage
-Einbindung des Menüs. Ebenfalls über eine externe PHP-Datei
-HTML-Code

Für mich stellt sich die Frage, ob es eine besser Lösung gibt für die Datenbankbefehle, die IF-Abfragen für die Buttons und den Aufbau der Seiten. Ist es evtl. besser die Datenbankbefehle aller Seiten auf eine Seite auszulagern und diese bei Bedarf zu laden, wenn das möglich ist. Gibt es eine bessere Lösung für die Buttons als diese über eine IF-Abfrage zu prüfen. Derzeit sieht die Programmierung in etwa so aus:

if ($\_POST['kundenauswahl'])
{
$\_SESSION['kundenauswahl'] = $\_POST['kundenauswahl'];
}


if ($\_POST['loeschen'])
{
#SQL-Befehl fuer Datensatz loeschen
$mysqli-\>query("DELETE FROM persdaten WHERE id\_vn = '{$\_SESSION['kundenauswahl']}';");
$mysqli-\>query("DELETE FROM arbeitgeber WHERE id\_vn = '{$\_SESSION['kundenauswahl']}';");
unset ($\_SESSION['kundenauswahl']);
}


if ($\_POST['speichern'])
{
#Prüfung, ob Pflichtfelder ausgefühllt sind
if (empty($\_POST['anrede'])) $fehler .= "Sie haben keine Anrede ausgewählt. 
";
if (empty($\_POST['name'])) $fehler .= "Sie haben keinen Namen eingegeben. 
";
if (empty($\_POST['vorname'])) $fehler .= "Sie haben keinen Vornamen eingegeben. 
";
if (empty($\_POST['gebdatum'])) $fehler .= "Sie haben kein Geburtsdatum eingegeben. 
";
#Wenn id\_vn und gruppe leer sind, wurde Kunde und Gruppe noch nicht angelegt und es werden die Daten neu eingespei�t
if (empty($\_SESSION['kundenauswahl']) AND empty($\_SESSION['gruppe']) AND empty($fehler))
{
$mysqli-\>query($insertpersdaten);
echo $mysqli-\>error;
#Auto\_Increment Wert in Variable speichern, um letzten Datensatz ermitteln zu k�nnen
$\_SESSION['kundenauswahl']=$mysqli-\>insert\_id;
#kundenauswahl in gruppe speichern, um die Gruppenkennung hinterlegen zu k�nnen
$\_SESSION['gruppe']=$\_SESSION['kundenauswahl'];
#Gruppenkennung wird jedem Kunden zugewiesen, da in Auswahlliste nach der Gruppenkennung gesucht wird
$mysqli-\>query("UPDATE persdaten SET gruppe = '{$\_SESSION['gruppe']}' WHERE id\_vn='{$\_SESSION['kundenauswahl']}';");
}
#Wenn kundenauswahl leer ist, wurde Kunde noch nicht angelegt und es werden die Daten neu eingespei�t
#Wenn gruppe mit Wert gef�llt ist, wird neu eingegebener Kunde zu bestehender Gruppe hinzugef�gt
elseif (empty($\_SESSION['kundenauswahl']) AND !empty($\_SESSION['gruppe']) AND empty($fehler))
{
$mysqli-\>query($insertpersdaten);
echo $mysqli-\>error;
#Auto\_Increment Wert in Variable speichern, um letzten Datensatz ermitteln zu k�nnen
$\_SESSION['kundenauswahl']=$mysqli-\>insert\_id;
#Gruppenkennung wird jedem Kunden zugewiesen, da in Kundenauswahl nach der Gruppenkennung gesucht wird
$mysqli-\>query("UPDATE persdaten SET gruppe = '{$\_SESSION['gruppe']}' WHERE id\_vn='{$\_SESSION['kundenauswahl']}';");
}
#Wenn kundenauswahl gef�llt ist, wurde Kunde schon angelegt und die eingegebenen Daten werden nur aktualisiert
elseif (!empty($\_SESSION['kundenauswahl']) AND empty($fehler))
{
$mysqli-\>query($updatepersdaten);
echo $mysqli-\>error;
}
#Bei unvöllständig ausgefüllten Feldern, wird Fehlermeldung generiert
elseif (!empty($fehler))
{
echo $fehler; 
} 
#Arbeitgeberdaten einspeichern. Erst ab hier, damit der Wert für die Spalte id\_vn in der Tabelle arbeitgeber eindeutig ist
$mysqli-\>query("INSERT INTO arbeitgeber
(id\_ag, id\_vn, agname, agstrasse, agplz, agort, agtel)
VALUES(
NULL,
'{$\_SESSION['kundenauswahl']}',
'{$mysqli-\>real\_escape\_string($\_POST['agname'])}',
'{$mysqli-\>real\_escape\_string($\_POST['agstrasse'])}',
'{$mysqli-\>real\_escape\_string($\_POST['agplz'])}',
'{$mysqli-\>real\_escape\_string($\_POST['agort'])}',
'{$mysqli-\>real\_escape\_string($\_POST['agtel'])}')

ON DUPLICATE KEY UPDATE

agname = '{$mysqli-\>real\_escape\_string($\_POST['agname'])}',
agstrasse = '{$mysqli-\>real\_escape\_string($\_POST['agstrasse'])}',
agplz = '{$mysqli-\>real\_escape\_string($\_POST['agplz'])}',
agort = '{$mysqli-\>real\_escape\_string($\_POST['agort'])}',
agtel = '{$mysqli-\>real\_escape\_string($\_POST['agtel'])}';");
echo $mysqli-\>error;
}

Die Eingabefelder sind auf den jeweiligen Seiten unterschiedich benannt. Ich weiß nicht, ob dass noch so gemacht wird bzw. empfehlenswert ist. Ein Eingabefeld heißt z.B. bruttoeinkommen, ein anderes telmobil, titel usw. Entsprechend heißen auch die Datenfelder in der Datenbank. Das machte es war anfangs übersichtlich, macht aber eine Programmierung für eine Eingabeprüfung jetzt schwerer. Ist diese Benennung sinnvoll? Wie benennt ihr die Eingabefelder auf der Seite und die Datenfelder in den Datenbanken?

Und ob es nicht besser ist eine Seitenvorlage zu erstellen, die immer sichtbar ist und bei der sich nur die Eingabemasken etc. ändern anstelle jede Seite nach o.g. Aufbau komplett zu programmieren?

Ich möchte aber kein Templatesystem etc. verwenden, sondern Lösungen, die sich rein über PHP/HTML lösen lassen.

Ich bin Anfänger und für jeden Tipp dankbar!

Hi,

Derzeit sieht die Programmierung in etwa so aus:

in etwa? d.h.:

if ($_POST[‚kundenauswahl‘]) // Fehler-notice wenn nicht übertragen!
{
$_SESSION[‚kundenauswahl‘] = $_POST[‚kundenauswahl‘];
}

if ($_POST[‚loeschen‘])
{
#SQL-Befehl fuer Datensatz loeschen
$mysqli->query(„DELETE FROM persdaten WHERE id_vn =
‚{$_SESSION[‚kundenauswahl‘]}‘;“);

Ja klasse, löschen ohne Identitätsprüfung - und dazu noch die Manipulationsmöglichkeiten…

Gruß
Ingo

Hallo,

meinst du mit Identitätsprüfung einen Benutzer Login? Den hab ich gemacht, aber hier nicht aufgeführt.

Und meinst du mit dem Manipulatinsversuch eine SQL-Injection?

Gruß

Hallo Alex,

in der (web) Programmierwelt ist derzeit das MVC-Modell sehr gebraeuchlich.

Dabei wird grob zwischen folgenden Schichten unterschieden:

  • Model - Verwaltet Daten. Also z.B. kommunikation mit einer Datenbank
  • View - Die Darstellung der Seite (z.B. HTML)
  • Controller - Vermittelt sozusagen zwischen Model und View

Eine genauere Beschreibung findest du z.B. auf Wikipedia: http://de.wikipedia.org/wiki/Model_View_Controller

Es gibt mehrere fertige Frameworks, welche das ganze mehr oder weniger gut umsetzen und von klein bis gross ist auch alles dabei. Die Views sind bei den meisten Frameworks normalerweise auch PHP/HTML mischmasch und keine Templates.
Hier gibt es z.B. ein ganz einfaches Beispiel wie man so etwas selbst bauen kann: http://www.nathandavison.com/posts/view/11/custom-ph…

Hoffe das dir das als Denkanstoss weiter hilft …
Gruss
Stefan

Hi,

meinst du mit Identitätsprüfung einen Benutzer Login? Den hab
ich gemacht, aber hier nicht aufgeführt.

bei der Löschfunktion kann ich nicht erkennen, dass die Identität des Users mit dem zu löschenden Datensatz geprüft wird.

Und meinst du mit dem Manipulatinsversuch eine SQL-Injection?

Ja.

Gruß
Ingo Turski

Moin moin,

meinst du mit Identitätsprüfung einen Benutzer Login? Den hab
ich gemacht, aber hier nicht aufgeführt.

Jain , Berechtigungsprüfung , soll irgendein nutzer das können oder nur bestimmte nutzer. Gibt viele lösungen dafür .

eine wäre
z.b.

function checkuserlevel($command,$userid) {
 $userisable = false ;
 $sql = "SELECT id FROM userrights where userid = 
 ".mysql\_real\_esacpe\_string($userid)." and what LIKE 
 '%".mysql\_real\_esacpe\_string($command)."%' ";
.
.
.
 if ($res\_sql['id'] == $\_SESSION['userid'] ) {$userisable == true;}

 return $userisable; 
}

function checkcommand($command,$commandlist) {
 if (in\_array($command,$commandlist,true)) {
 return $command
 } else { return false; }
}

$commandos = array('deletepersonal','editpersonal','newpersonal');
/\* post kommando check \*/
$mycommand = checkcommand($\_POST['command'],$commandos);
if ($mycommand != false ) {
 /\* user darf das \*/
 if (checkuserlevel($mycommand,$\_SESSION['userid']) ) {
 switch ($mycommand) { 
 case "deletepersonal" :
 ... sql fürs löschen 
 break;
 case "editpersonal" :
 ... sql fürs editieren
 break;
 }
 }
}