[S] Struktur und Style Tipps für meinen PHP-Code Allgemein(bessere lösungswege etc.)

S

Sicaine

Hi Leute,

so ich bin an einem Punkt angekommen wo ich selbst sage, dass ich meine Code ansich OK finde. Würde mich aber gerne weiterbilden und so neue Tricks und Vorgehensweisen lerne. Also Theorien wie man was am besten macht wie mand as oder jenes besser implementiert..

Als einfaches Beispiel wie ich aktuell progge:

Eine index.php, die alles includiert. Über die läuft alles. parallel dazu verwende ich Smarty(Für die anderen Leute die nicht unbedingt nur wegen anderem aussehen gleich am PHP-Code rumfummeln sollen.

Vorweg noch meine allgemeine OO vorgehensweise:
Ich erstelle ein $db objekt(ist fir die db zuständig quellcode ist unten zu finden)
und das $user objekt, was selbsständig den user "einlogt" wobei dem ein $db objekt übergeben wird.

Index.php:
PHP:
<?php
    session_start();
    define ('MAIN', true);   //Ohne dieser Definition werden keine Scripte fehlerfrei eingefügt, da sie ihren Dienst verweigern.

####################################
#            Includes              #
####################################
    require_once './_include/IT.php';
    require_once './_include/db_class.php';
    require_once './_include/user_class.php';
    require_once './_include/function.php';
    require_once './_include/libs/Smarty.class.php';
    require_once './_settings/config.inc.php';

####################################
#         Objekterstellung         #
####################################
    $db   = new db($db_host, $db_user, $db_pw, $db_db);
    $user = new user($db);
    $tpl  = new Smarty();

    $navi_r = array();
    $navi_l = array();
################################################################
#                Menüliste   Menüeinträge                      #
################################################################
//Menü der linken Hälfte. Hier werden alle normalen Links angezeigt

    addmenu('Übersicht', 'index.php', 'l');
    addmenu('Forum', './forum/index.php', 'l');
    addmenu('Teammember', 'index.php?url=team.php', 'l');
    addmenu('Anmelden', 'index.php?url=anmelden.php', 'l');

//Menü der rechten Hälfte. Sie werden nur bei eingelogten Personen angezeigt


//Hier werden noch das Userlvl geprüft um z.b. nur dem Admin den url zum Neweeditor zu geben.
//Auch wenn jedes Script das LVL noch mal extra überprüft, sieht es halt blöd aus.
    if($user->getLVL() >= 2){
        addmenu('News hinzufügen', 'index.php?url=newsadd.php', 'l');
        addmenu('Übersicht', 'index.php', 'l');
    }
    if($user->getLVL() >= 3){
        addmenu('Newseditor', 'index.php?url=newsedit.php', 'l');
    }

    $tpl->assign('menur', $navi_r);
    $tpl->assign('menul', $navi_l);

    $tpl->display('header.tpl'); //Ausgabe des Headers

    $url = $_GET['url'];
    checkText($url);

    if($url != ''){
        if(file_exists($url)){
            require_once($url);
        }else{
            require_once('error.php');
        }
    }else{
        require_once('news.php');
    }
?>

DB-Klasse(ist noch nich komplet aber man erkennt ja nach welchem Prinzip ich auch in zukunft vorgehe für andere Methoden)
:
PHP:
<?

class db{
    var $host;
    var $db;
    var $user;
    var $pw;
    var $anzquery = 0;
    var $cid;
    var $qid;
    var $lasterror;
    var $lasterrorcode;
    var $lastsql;

    function db($host, $user, $pw, $db){
        if($cid = @mysql_connect($host, $user, $pw)){
            if(!@mysql_select_db($db)){
                $this->printError();
            }
        }else{
            $this->printError();
        }
    }

    function query($sql){
        $this->lastsql = $sql;
        $this->anzquery++;
        if(!$this->qid = @mysql_query($sql)){
            $this->printError();
        }
    }

    function getResult(){
        return mysql_fetch_assoc($this->qid);
    }

    function getValue(){
        return mysql_result($this->qid, 0,'field');
    }

    function getArray(){
        while($row = $this->getResult()){
            $rows[] = $row;
        }
        return $rows;
    }

    function getNumRows(){
        return mysql_num_rows($this->qid);
    }

    function getlastId(){
        return mysql_insert_id($this->cid);
    }

    function getAnzQuery(){
        return $this->anzquery;
    }
    function printError(){
        echo 'Errotext: '.mysql_error().'<br>';
        echo 'SQL: '.$this->lastsql.'<br>';
        echo mysql_errno().'<br>';
        exit;
    }
}

?>

User-Klasse:
PHP:
<?

class user{
    var $userid;
    var $username;
    var $userpw;
    var $lvl;
    var $db;
    var $errortext = array();

    function user(&$db){
        $this->db = $db;
        if(!empty($_SESSION['username'])){
            $this->lvl = $this->checkUser($_SESSION['username'], $_SESSION['userpw']);
        }else if(!empty($_COOKIE['username'])){
            $this->lvl = $this->checkUser($_COOKIE['username'], $_COOKIE['userpw']);
        }else if(!empty($_POST['username'])){
            $this->lvl = $this->checkUser($_POST['username'], $_POST['userpw']);
            if ($this->lvl != 0){
                if($_POST['longlogin'] == true){
                    setcookie('username',
                              $_POST['username'],
                              time() + (60*60*24*30),
                              NULL,
                              NULL,
                              0);
                    setcookie('userpw',
                              $_POST['userpw'],
                              time() + (60*60*24*30),
                              NULL,
                              NULL,
                              0);
                }else{
                    $_SESSION['username'] = $_POST['username'];
                    $_SESSION['userpw']   = $_POST['userpw'];
                }
            }
        }else{
            $this->lvl = 0;
        }
    }

    function checkUser($username, $userpw){
        $userpw = md5($userpw);
        $sql = "SELECT 
                       lvl, 
                       id 
                   FROM user 
                   WHERE 
                       login = '$username' AND 
                       password = '$userpw'";
        $this->db->query($sql);
        $anz = $this->db->getNumRows();
        if($this->db->getNumRows() == 0){
            $sql = "SELECT lvl 
                       FROM user 
                       WHERE login = '$username'";
            $this->db->query($sql);
            if($this->db->getNumRows() == 0){
                $this->errortext[] = 'Username existiert nicht!';
            }else{
                $this->errortext[] = 'Passwort ist falsch!';
            }
        }

        if($anz == 0){
            return 0;
        }else if($anz == 1){
            $temp = $this->db->getResult();
            $this->userid = $temp['id'];
            return $temp['lvl'];
        }else{
        }

    }

    function getLVL(){
        return $this->lvl;
    }

    function getUserID(){
        return $this->userid;
    }

    function getError(){
        return $this->errortext;
    }


    function printErro(){
        exit;
    }
}

?>

in der config.inc.php stehen halt variablen wie $db_host.
in der function.php sind nur 2 funktionen eine die ne textreferenz will und daraus ./ etc. rausschneidet wegen includesicherheit und addmenu welche einfach nur in einen mehrdimensionalen array das zeug passend für smarty reinschreibt.


Ich bin für jeden Tipps anmekrungen Kritik offen!
Vorallem was auch ein großes prob is: die Variablennamen. Sieht halt dann teilweis bisl komisch aus wenn ich ein $i hab und ein $temp und ein $tempn etc. oder auch eine $_POST['usernick'] und dann ne $nick...

Zum schluss noch ne include datei und zwar die Anmeldung. Darunter folgt dann gleich das Template dazu;:
PHP:
<?
    define('LVL', 0);
    if(!defined('MAIN')) die('Error!');
    if($LVL > $user->getLVL()){
        $tpl->display('error.tpl');
        exit;
    }
    $errort = array();;

    if($_POST['nick'] == ''){
        $errort[] = 'Geben sie einen Nicknamen ein.';
    }

    if($_POST['password'] != $_POST['passwordd']){
        $errort[] = 'Passwörter stimmen nicht überein!';
    }

    if(strlen($_POST['password']) < 6 ){
        $errort[] = 'Das Passwort braucht min. 6 Zeichen!';
    }

    if($_POST['mail'] == ''){
        $errort[] = 'Geben sie eine Emailadresse ein.';
    }

    if($_POST['icq'] == ''){
        $errort[] = 'Geben sie ihre ICQ-Nummer an.';
    }

    if($_POST['birthday'] == ''){
        $errort[] = 'Geben sie ihr Geburtsdatum an.';
    }

    $datum = explode('.', $_POST['birthday']);
    if(@checkdate($datum[2], $datum[1], $datum[0])){
        $errort[] = 'Ihr Geburtsdatum ist falsch!';
    }

    if($_POST['anmelden'] == 1){
        $tpl->assign('errort', $errort);
    }

    $tpl->assign('nick',$_POST['nick']);
    $tpl->assign('password',$_POST['password']);
    $tpl->assign('passwordd',$_POST['passwordd']);
    $tpl->assign('vname',$_POST['vname']);
    $tpl->assign('nname',$_POST['nname']);
    $tpl->assign('icq',$_POST['icq']);
    $tpl->assign('birthday',$_POST['birthday']);
    $tpl->assign('mail',$_POST['mail']);
    $tpl->assign('ort',$_POST['ort']);

    if(count($errort) == 0){
        if (@move_uploaded_file($_FILES['userfile']['tmp_name'], $picpath.$_FILES['userfile']['name'])) {
            $im = ImageCreateFromJpeg($picpath.$_FILES['userfile']['name']);
            if($im){
                $picx = imagesx($im);
                $picy = imagesy($im);
                $picfac = $picx / $picy;
                $picsx = 150;
                $picsy = 80;
                $picsfac = $picsx / $picsy;
                if($picsfac > $picfac){
                    $zimg = imagecreate($picfac * $picsy, $picsy);
                    imagecopyresized($zimg, $im, 0, 0, 0, 0, $picfac * $picsy, $picsy, $picx, $picy);
                }else{
                    $zimg = imagecreate($picsx, $picfac * $picsx);
                    imagecopyresized($zimg, $im, 0, 0, 0, 0, $picsx, $picsx * $picfac, $picx, $picy);
                }
                ImageJpeg($zimg, 'user_'.$_POST['nick'].'_pic.jpg', 100);
                ImageDestroy($im);
                ImageDestroy($zimg);
            }
            $picvalue = 1;
        }
        $time = time();

        $datum = date('Y-m-d h:m:s',mktime(0,0,0,$datum[1], $datum[0], $datum[2]));

        $sql = 'INSERT INTO `user` (
                   id,
                   login,
                   password,
                   email,
                   icq,
                   birthday,
                   lvl,
                   vorname,
                   nachname,
                   straße,
                   plz,
                   ort,
                   tel,
                   land,
                   pic,
                   anmeldedatum)
               VALUES(
                   \'\',
                   \''.$_POST['nick'].'\',
                   \''.md5($_POST['password']).'\',
                   \''.$_POST['mail'].'\',
                   \''.$_POST['icq'].'\',
                   \''.$datum.'\',
                   \'-1\',
                   \''.$_POST['vname'].'\',
                   \''.$_POST['nname'].'\',
                   \''.$_POST['straße'].'\',
                   \''.$_POST['plz'].'\',
                   \''.$_POST['ort'].'\',
                   \''.$_POST['tel'].'\',
                   \''.$_POST['land'].'\',
                   \''.$picvalue.'\',
                   Now())';

        $emailtext = 'Hallo '.$_POST['vname'].' '.$_POST['nname'].",\n\n".
                     'Dein Username: '.$_POST['nick']."\n".
                     'Dein Passwort: '.$_POST['password']."\n".
                     'Bitte kopier den Link in die Adresszeile deines Browsers um deinen Account zu aktivieren:'."\n".
                     'http)."\n".
                     'MfG,'."\n\n".
                     'Ihr Webmaster.';
        if(!@mail($_POST['mail'],'Bestätigungsemail von 3dsp','')){
            $db->query($sql);
            echo 'Die Anmeldung war erfolgreich! Sie werden in Kürze eine Email mit ihrem bestätigungslink erhalten.';
        }else{
            echo 'ERROR! Email konnte nicht verschickt werden!';
            echo '<br>Kontaktieren sie bitte den Administrator und versuchen sie es später nochmal.';
        }
    }else{
        //var_dump($_FILES);
        $sql = 'SELECT id, name FROM land';
        $db->query($sql);
        $tpl->assign('land', $db->getArray());
        $tpl->display('anmelden.tpl');
    }
    $tpl->display(($user->getLVL() > 0 ) ? 'middel.tpl' : 'middel_login.php');
    $tpl->display('footer.tpl');
?>
PHP:
<table><form enctype="multipart/form-data" method="post" action="">
    {section name=count loop=$errort}
    <tr>
        <td colspan="4">{$errort[count]}</td>
    </tr>
    {/section}
    <tr>
        <td>Nick:</td>
        <td><input type="text" name="nick" value="{$nick}"></td>
        <td>Passwort:</td>
        <td><input type="password" name="password" value="{$password}"></td>
    </tr>
    <tr>
        <td></td>
        <td></td>
        <td>Passwort(w):</td>
        <td><input type="password" name="passwordd" value="{$passwordd}"></td>
    </tr>
    <tr>
        <td>Vorname:</td>
        <td><input type="text" name="vname" value="{$vname}"></td>
        <td>Nachname:</td>
        <td><input type="text" name="nname" value="{$nname}"><br></td>
    </tr>
    <tr>
        <td>ICQ:</td>
        <td><input type="text" name="icq" value="{$icq}"></td>
        <td>Geburtsdatum(tt.mm.yyyy):</td>
        <td><input type="text" name="birthday" value="{$birthday}"><br></td>
    </tr>
    <tr>
        <td>PLZ:</td>
        <td><input type="text" name="plz" value="{$plz}"></td>
        <td>Ort:</td>
        <td><input type="text" name="ort" value="{$ort}"><br></td>
    </tr>
    <tr>
        <td>Tel:</td>
        <td><input type="text" name="tel" value="{$tel}"></td>
        <td>Email:</td>
        <td><input type="text" name="mail" value="{$mail}"><br></td>
    </tr>
    <tr>
        <td>Land:</td>
        <td><select name="land">
                {section name=count loop=$land}
                <option value="{$land[count].id}">{$land[count].name}</option>
                {/section}
            </select>
        </td>
        <td colspan="2">
        <input name="userfile" type="file">
        </td>
    </tr>
    <tr><input type="hidden" value="1" name="anmelden">
        <td><input type="submit" value="Anmelden"></td>
        <td><input type="reset"></td>
    </tr>
</table></form>
 
Zuletzt bearbeitet von einem Moderator:
Wow, ich fühle mich gerade ein wenig erschlagen.
Konnte bei der Menge nicht so ganz herausbekommen, was nun genau Dein Problem ist.
Oder haben ich die Frage übersehen?

redlama :suspekt:
 
Re: [S] Struktur und Style Tipps für meinen PHP-Code Allgemein(bessere lösungswege et

Öhm ja hab ne frage gestellt. Habs ohen ein kleines bischen besser angepasts..

Noch mal kurz: Wie progge ich das ganze besser? Suche Tipps und Tricks anregungen etc.
 
Re: [S] Struktur und Style Tipps für meinen PHP-Code Allgemein(bessere lösungswege et

Keine Antwort auch ne Antwort?

Code so schlecht?
:/
 
Zurück