Beiträge von Developer

    Ich kann es nicht mehr gebrauchen & ich denke mal andere können es besser gebrauchen. Und da die Projektleitung sich auch der Aufforderung wiedersetzt hat, es komplett zu löschen dort, habe ich mich dazu entschieden es wenn schon für jeden zugänglich zu machen. Ist so oder so nichts besonderes.

    Einen schönen guten Abend Breadfish,


    hier möchte ich nun mein UCP veröffentlichen, welches bis vor wenigen Tagen für German CrimeTime(Nein nicht das CrimeTime von Shain & BlackAce) von mir entwicklet wurde. Eine Live Ansicht könnt ihr, sofern gewünscht einmal bei GCT sehen http://cp.cops-robbers.de/(Zugangsmöglichkeit nur mit Account auf dem Server) oder auch auf meiner Demo Site http://demo.lukas-kaemmerling.de/ucp/(User: Demo; Passwort: demo). Das Design des UCPs wurde dem Forumsstil nachempfunden, ist allerdings komplett selber geschrieben. Es wird Bootstrap genutzt. Die Grafiken wurden von .ReeduZ erstellt, er hat mir die nötige Befähigung zum mitveröffentlichen seiner Werke gegeben.


    Dieses User Control Panel befand sich zum Zeitpunkt der Stilllegung der Entwicklung in einer relativen frühen Phase. Es können, und werden noch Bugs auftreten & wahrscheinlich sind auch noch kleine Lücken drin, das kann man nunmal einfach nicht aussschließen ;)



    Die Datenbank liegt bei, ist allerdings bis auf einige DummyDaten komplett geleert. Im Ordner: core\config findet ihr eine system.config.php . Dort sind die MySQL Daten einzutragen.


    Kurze Auflistung der Feautres:
    - Keybinder API (Dokumentation [falls nicht gelöscht]: http://german-crimetime.de/boa…binder-api-dokumentation/ )
    - Dynamisches Profil System für Gruppen & User ( core/config/profil.config.php)
    - Mehrsprachen System (core/config/lang.config.php -> core/config/lang)
    - OOP & einfache Möglichkeit Userdaten zu verwalten (Jedes Objekt hat eine feste Struktur -> core/libs/data_models/)
    - View & Logik sind getrennt (Logik: core/libs/controller | core/libs/system )
    - Eigenes Framework welches Daten in den richtigen Context lädt & eine Trennung der Schichten zulässt.


    Nun das waren so im kurzen die Auflistung der Funktionen. Gibt natürlich auch noch die Standart Sachen, wie eigenen Nutzer bearbeiten, News schreiben, Wartungsmodus und co, das ist aber nicht erwähnenswert.



    Und da ja eig ein Pastebin dabei sein muss, ich allerdings nicht das ganze Projekt Patebinnen kann hier die index.php


    PHP
    <?phpsession_start();$start = microtime();header('Content-Type: text/html; charset=utf-8');error_reporting(0);require_once("core/GCTCore.class.php");$config = GCTCore::getConfig();$page = @$_GET['p'];if (empty($page)) {    $page = "home";}if (isset($_GET['lang'])) {    setcookie("lang", @$_GET['lang']);    $lang = @$_GET['lang'];} else {    $lang = $_COOKIE['lang'];}if (empty($lang)) {    $lang = substr($_SERVER["HTTP_ACCEPT_LANGUAGE"],0,2);}global $LANG;try{    GCTCore::initLanguageSystem($lang);} catch(Exception $ex){    SystemException::ShowException($ex);}GCTCore::LoadController("user", "user");?><!DOCTYPE html><html>    <head>        <meta charset="UTF-8">        <title>GCT-UCP</title>        <link rel="stylesheet" type="text/css" href="bootstrap.min.css">        <link rel="stylesheet" type="text/css" href="gct-style.css">        <script>            (function(i, s, o, g, r, a, m) {                i['GoogleAnalyticsObject'] = r;                i[r] = i[r] || function() {                    (i[r].q = i[r].q || []).push(arguments)                }, i[r].l = 1 * new Date();                a = s.createElement(o),                        m = s.getElementsByTagName(o)[0];                a.async = 1;                a.src = g;                m.parentNode.insertBefore(a, m)            })(window, document, 'script', '//www.google-analytics.com/analytics.js', 'ga');            ga('create', 'UA*****-2', '*****e');            ga('send', 'pageview');        </script>    </head>    <body>        <div id="gct-header">            <div class="gct-menu">                <ul>                    <li><a href="?p=home"><?php echo GCTCore::GetLangVar($LANG['Index']['Mainmenu']['Home']); ?></a></li>                    <?php                    if (isset($_SESSION['user_id']) && $_SESSION['user_id'] != "0") {                        ?>                                         <li><a href="?p=user\profil"><?php echo GCTCore::GetLangVar($LANG['Index']['Mainmenu']['Profil']); ?></a></li>                        <?php                    }                    ?>                    <!--<li><a href="?p=member">Mitglieder</a></li>-->                    <li><a href="?p=server_stats"><?php echo GCTCore::GetLangVar($LANG['Index']['Mainmenu']['Stats']); ?></a></li>                </ul>            </div>            <div class="gct-usermenu">                <ul>                    <li class="pull-left"><div class="btn-group">                            <button type="button" class="btn btn-primary btn-xs"><?php echo GCTCore::GetLangVar($LANG['Index']['Mainmenu']['Speak']); ?></button>                            <button type="button" class="btn btn-primary dropdown-toggle btn-xs" data-toggle="dropdown">                                <span class="caret"></span>                                <span class="sr-only">Toggle Dropdown</span>                            </button>                            <ul class="dropdown-menu" role="menu">                                <?php                                for ($i = 0; $i < count($KONFIG['GCTCore']['Language']); $i++) {                                    ?>                                    <li><a href="?p=<?php echo $page; ?>&lang=<?php echo $KONFIG['GCTCore']['Language'][$i]['Filename']; ?>" class="pull-left"><?php echo GCTCore::GetIcon($KONFIG['GCTCore']['Language'][$i]['Icon'],"16","16") . $KONFIG['GCTCore']['Language'][$i]['Name']; ?></a></li>                                    <?php                                }                                ?>                            </ul>                        </div>                    </li>                    <?php                    if (isset($_SESSION['user_id']) && $_SESSION['user_id'] != "0") {                        $user_data = User::GetData($_SESSION['user_id']);                        ?>                        <li><?php echo GCTCore::GetLangVar($LANG['Index']['Usermenu']['Greeting']); ?> <?php echo $user_data->username; ?></li>                        <li><a href="?p=logout"><?php echo GCTCore::GetLangVar($LANG['Index']['Usermenu']['Logout']); ?></a></li>                        <li><a href="?p=user\account\home"><?php echo GCTCore::GetLangVar($LANG['Index']['Usermenu']['AccountChange']); ?></a></li>                        <li><a href="?p=user\ts3"><?php echo GCTCore::GetLangVar($LANG['Index']['Usermenu']['Teamspeak']); ?></a></li>                        <?php if ($user_data->api_access == "1") { ?>                            <li><a href="?p=api\home"><?php echo GCTCore::GetLangVar($LANG['Index']['Usermenu']['Api']); ?></a></li>                            <?php                        }                      /*  if ($user_data->leader == "1") { ?>                            <li><a href="?p=group\home">Leader Menü</a></li>                            <?php                        }*/                        if ($user_data->admin != 0) {                            ?>                            <?php if ($user_data->admin >= $KONFIG['GCTCore']['Rights']['Suppanel']) { ?> <li><a href="?p=suppanel\home"><?php echo GCTCore::GetLangVar($LANG['Index']['Usermenu']['Suppanel']); ?></a></li><?php } ?>                                                 <?php if ($user_data->admin >= $KONFIG['GCTCore']['Rights']['Adminpanel']) { ?><li><a href="?p=adminpanel\home"><?php echo GCTCore::GetLangVar($LANG['Index']['Usermenu']['Adminpanel']); ?></a></li><?php } ?>                            <?php if ($user_data->title == "Teamleiter") { ?><li><a href="?p=devpanel\home"><?php echo GCTCore::GetLangVar($LANG['Index']['Usermenu']['Devpanel']); ?></a></li><?php                            }                        }                    } else {                        ?>                        <li><?php echo GCTCore::GetLangVar($LANG['Index']['Usermenu']['Greeting']); ?>  <?php echo GCTCore::GetLangVar($LANG['Index']['Usermenu']['Guest']); ?></li>                        <li><a href="?p=login"><?php echo GCTCore::GetLangVar($LANG['Index']['Usermenu']['Login']); ?> </a></li>                        <?php                    }                    ?>                                    </ul>            </div>        </div>        <div id="gct-content">            <div class="gct-container">                <?php                if ($config->maintancemode == 1) {                    ?>                    <div class="alert alert-warning">    <?php $replaces = array("arguments" => array("{maintancereason}"), "replaces" => array($config->maintancetext)); ?>                        <div class="pull-left"><?php echo GCTCore::GetIcon("noticeM"); ?></div><div class="center-block" style="padding-left:50px;"><?php echo GCTCore::GetLangVar($LANG['Index']['Maintance'],$replaces); ?></div>                    </div>                    <?php                }                if ($config->maintancemode == 0 OR isset($_SESSION['user_id'])) {                    $page = explode("",$page);                    ($page[1] !== null) ? ($page[2] !== null) ?$page = $page[0]."/".$page[1]."/".$page[2] :$page = $page[0]."/".$page[1] : $page = $page[0];                    if (isset($_SESSION['user_id']) && $_SESSION['user_id'] != "0" OR $page == "login" OR $page == "server_stats" OR $page == "home" OR $page == "losepw") {                        if (file_exists("page/" . $page . ".page.php")) {                            require("page/" . $page . ".page.php");                        } else {                            require("page/404.page.php");                        }                    } else {                        ?>                        <div class="alert alert-warning">                            <button type="button" class="close" data-dismiss="alert" aria-hidden="true">&times;</button>                            <div class="pull-left"> <?php echo GCTCore::GetIcon("noticeM"); ?></div>                            <div class="center-block"><?php echo GCTCore::GetLangVar($LANG['Index']['OnlyLogin']); ?></div>                        </div>                        <?php                        require("page/home.page.php");                    }                } else {                    require("page/login.page.php");                }                ?>                <div class="clearfix"></div>            </div>        </div>        <div style="clear:both;"></div>        <div id="footer">            <?php echo $KONFIG['GCTCore']['Copyright']['All']; ?> Design: <?php echo $KONFIG['GCTCore']['Copyright']['Design']; ?> Programmierung:<?php echo $KONFIG['GCTCore']['Copyright']['Code']; ?> Version : <?php echo $KONFIG['GCTUCP']['Version'] ?>         </div>        <script src="https://code.jquery.com/jquery-1.10.2.min.js" async defer></script>        <script src="http://statics.cops-robbers.de/js/bootstrap.min.js" async defer></script>    </body></html><?php$end = microtime();$input = "[".($end-$start)."ms] [".$page."]";LogMaker::WriteInLog("index", $input);?>


    Und zu guter letzt natürlich der Download des gesamten Paketes:
    Klick


    Und da es ja mein geschriebenes UCP ist, kann ich damit auch machen was ich will ;)


    Mit freundlichen Grüßen
    $this->getUser();
    Edit 1 & 2: Kleine Fehler behoben

    Stimmt, und meine kleine Klasse ist eig anwendungsbeispiel genug :D theoretisch hätte ich auch noch ne "klasse" hier die die alten mysql funktionen hookt und sie mit den MySQLi funktionen versetzt, nur unter altem Namen...

    Blu3scReeN:
    Ich persöhnlich finde MySQLi unübersichtlicher in der anwendung, bzw. hab ich persähnlich noch nichtmal verstanden wie man es einsetzt.
    Grund? Habe noch kein Tutorial gefunden wo es A, ordentlich erklärt und gezeigt wird, B, keine direkten vergleich zu MySQL.


    Es ist haargenau wie MySQL im Prozedualen Stil? Bis auf das du im Prozedualen Stil immer den Mysqli Connect Link als ersten Parameter mitgeben musst. Willst du es in OOP nutzen? Dann hätte ich ne kleine Klasse für dich, die hab ich 2013 zwar geschrieben, da ich selber nun nur noch PDO verwende und sie nicht mehr brauche hab ich se hier für dich mal:


    http://pastebin.de/127278

    Jo das stimmt. Ich find PDO aber für kleinere Projekte bisschen zu overpowert... Wenns jetzt was größeres ist bzw. auch gewerblich ist würde ich auch PDO nehmen.


    Habs jetzt mal als Schnippsel mit MySQLi, ungetestet. Allein wegen dem Prozedualen Stil schäme ich mich schon ;(

    PHP
    <?php// adressbuch.html?><html><head><title>Adressbuch</title></head><body><form action="eintragen.php" action="POST"/>Vorname: <input type="text" name="Vorname"/><br/>Nachname: <input type="text" name="Nachname"/><br/>Straße: <input type="text" name="Strasse"/><br/>Nr.:<input type="text" name="Hausnummer"/><br/>PLZ: <input type="text" name="PLZ"/><br/>Telefon: <input type="text" name="Telefonnummer"/><br/><input type="submit" value="Absenden"/></form></body></html><?php//db_connect.php$db_host = "localhost";$db_user = "benutzer1";$db_passwort = "123456";$db_name = "adressbuch";$db_link = mysqli_connect($db_host,$db_user,$db_passwort,$db_name) or die("Keine Verbindung moeglich. Grund:". mysqli_connect_error());?><?php// enintragen.phpinclude 'db_connect.php';$vorname = strip_tags(trim($_POST['Vorname']));$nachname = strip_tags(trim($_POST['Nachname']));$strasse = strip_tags(trim($_POST['Strasse']));$hausnummer = strip_tags(trim($_POST['Hausnummer']));$plz = strip_tags(trim($_POST['PLZ']));$telefon = strip_tags(trim($_POST['Telefonnummer']));if(!empty($vorname) && !empty($nachname)){$sql = 'INSERT INTO adressbuch (vorname, nachname, strasse, hausnummer, plz, telefon) VALUES ("'.$vorname.'", "'.$nachname.'", "'.$strasse.'", "'.$hausnummer.'", "'.$plz.'","'.$telefon.'")';	$eintragen = mysqli_query($db_link,$sql) or die("Fehler: ".mysqli_error());	if($eintragen != false ) {     echo 'Der Eintrag war erfolgreich';	 } else {		echo 'Der Query konnte nicht gesendet werden';	 }} else {     echo 'Ihre Angaben sind fehlerhaft.';}echo '<a href="adressbuch.html">Zurück</a>';?>

    Einfache Abfrage. Kannst den Terninäre Operator dafür eigentlich nutzen:

    PHP
    echo ($online == 1) ? "Online":"Offline";


    Ausgeschrieben wäre das:

    PHP
    if($online == 1) {
    echo "Online"; 
    }
    else 
    {
    echo "Offline";
    }

    So ich habe auch noch ne kleine Klasse für euch, die ist allerdings ehr was für Leute, welche OOP nutzen.


    Ist eine Profil Klasse, welche die Daten für die View vorbereitet. Heißt soviel:
    Man übergibt der Klasse im Konstruktor ein Objekt (im BSP ist es ein User Object). Aus diesem Objekt raus, wird nun ein Array vorbereitet, welches das Profil beinhaltet. Die einzelnen Profilfelder müssen in einer Config Datei angelegt werden.


    PHP
    class Profil {        /**         * Profil Array - Beinhaltet das Array mit den Bereits aufgearbeiteten Profil Daten         */        private $profil_array;        /**         * Profil User - Beinhaltet das Nutzer Object von dem Nutzer, welcher Angezeigt werden soll         */        private $profil_data;        /**         * Constructor - Benötigt ein User Object als Parameter         */        public function __construct($data) {                $this -> profil_data = $data;                $this -> PrePareProfilArray();        }        /**         * Destruktor - Löscht die Werte in der Klasse         */        public function __destruct() {                $this -> DeleteProfilArray();                $this -> DeleteProfilData();        }         /**         * [Private] PrePareProfilArray - Bereitet ein Array für die direkte Anzeige im Profil vor.         */        private function PrePareProfilArray() {                global $CONFIG;                $data_array = array();                 $i = 0;                 foreach ($CONFIG['Profil'] as $key => $value) {                         if ($value["Active"] == true) {                                 $data_array[$i] = array();                                 $data_array[$i]['Name'] = $value['DisplayName'];                                 if(isset($this -> profil_data -> $key)){                                    $data_array[$i]['Value'] = $this -> profil_data -> $key;                                } else {                                    $data_array[$i]['Value'] = "$key was not found";                                }                                if (isset($value['AdminOnly'])) {                                        $data_array[$i]['AdminOnly'] = $value['AdminOnly'];                                }                                if (isset($value['AdditonalAfter'])) {                                        $after_value = $value['AdditonalAfter'];                                } else {                                        $after_value = Null;                                }                                if (isset($value['AdditonalBefore'])) {                                        $before_value = $value['AdditonalBefore'];                                } else {                                        $before_value = Null;                                }                                $data_array[$i]['Value'] = $before_value . $data_array[$i]['Value'] . $after_value;                                $i++;                        }                 }                 $this -> profil_array = $data_array;        }         /**         * Gibt das Profil Array zurück         */        public function GetProfilArray() {                return $this -> profil_array;        }        /**         * Löscht das Profil Array         */        private function DeleteProfilArray() {                $this->profil_array = null;                unset($this->profil_array);        }        /**         * Löscht den Profil Data         */        private function DeleteProfilData(){                $this->profil_data = null;                unset($this->profil_data);        } }


    Soweit die Klasse. Die Konfiguration des ganzen ist relativ einfach:
    (Da ich die Konfiguration selber in einem Array nutze ist es auch hier in einem Array)

    PHP
    global $CONFIG;$CONFIG['Profil']['username'] = array("Active" => true, "DisplayName" => "Nutzername");$CONFIG['Profil']['level'] = array("Active" => true, "DisplayName" => "Level");$CONFIG['Profil']['money'] = array("Active" => true, "DisplayName" => "Money", "AdditonalBefore" => "$&nbsp;");//$CONFIG['Profil'][Name der Eigenschaft im Gewünschten Object] = //array("Active" => /* Man kann ein Feld aktivieren => true; und deaktiven (es wird nicht angezeigt bzw verarbeitet) => false*/,//"DisplayName" =>/*Der Name der später angezeigt werden soll z.b. in einer Tabelle*/, //"AdditonalBefore" => /*[OPTIONAL]Soll ein Zeichen vor den Wert gesetzt werden? z.b. beim Geld: ohne das steht dort:123456 ;mit einem $&nbsp; als Additonal Before steht dort:$ 123456*///"AdditonalAfter" => /*[OPTIONAL]  Stellt ein Zeichen nach dem Wert an *///"AdminOnly"=>/*[OPTIONAL] Legt nur fest ob dieses Profilfeld von jedem oder nur von Admins gesehen werden darf, müsst ihr in der View nur eure Adminabfrage reinpacken */);


    Nun ja soviel zur Einrichtung. Nur wie nutzt man es? So: (Beispiel ist ein Nutzer Objekt)

    PHP
    <?phpclass User {        public $username;        public $email;        public $level;        public $money;        public function __construct() {                $this -> username = "Hans-Peter";                $this -> email = "bla@Bla.de";                $this -> level = round(514 / 63);                $this -> money = sprintf("%01.2f", 5000);        } }?> <?php/*-------------------------------- Die View -------------------------------*/// Instanziere ein neues Profil und gebe ihm einen Nutzer$profil_obj = new Profil((new User()));// Gebe Array mit Profilinformationen zurück$profil_data = $profil_obj->GetProfilArray();// Profilinformationen ausgeben?><table border='0'><?phpfor($i = 0; $i < count($profil_data); $i++){        if(empty($profil_data[$i]['AdminOnly']) == false){                ?>                <tr>                <td><?php echo $profil_data[$i]['Name']; ?>:</td>                <td><?php echo $profil_data[$i]['Value']; ?> [Only 4 Admins]</td>                </tr>                <?php                } else {        ?>        <tr>        <td><strong><?php echo $profil_data[$i]['Name']; ?>:</strong></td>        <td><?php echo $profil_data[$i]['Value']; ?></td>        </tr>        <?php        }        }?>


    Ist nichts großes, aber sollte denke ich einigen helfen können ;) Das System ist, mit kleineren Änderungen so auch aktiv im Einsatz im UCP von GermanCrimeTime

    escape bitte alle input werde auch mit mysql_real_escape_string();
    Als BSP:

    Bitte nehme mysqli oder PDO, da die mysql_* (also die funktionen: mysql_connect();mysql_select_db();mysql_query(); mysql_num_rows();mysql_fetch_array();) sind nicht sicher und auch veraltet. Nutze (die Syntax ist an sich die gleiche) bitte MySQLi (PDO dürfte für dich noch etwas zu schwer sein).



    PHP
    <?php
    mysqli_connect(); entspricht mysql_connect(); mit mysql_select_db();
    mysqli_query(); entspricht mysql_query();
    mysqli_num_rows(); entspricht mysql_num_rows();
    mysqli_fetch_array(); entspricht mysql_fetch_array()
    
    
    und so weiter ;)
    ?>

    Vorweg ich habe mir keinen der Posts vorher durchgelesen.


    Ich empfehle dir keins der beiden Handys! Wieso?


    Ganz einfach:


    Die Herstelleraufsätze! Beispiel Samsung: Ist ja nun kein Gerücht mehr das Samsung kein Android 4.4.2 fürs S3 rausgeben wird, und warum? richtig wegen dem Samsung Launcher: Touchwiz!



    Ich empfehle dir ehr eins der Nexus Familie. Die haben zwar auch ihre Ecken und Kanten, aber es gibt kein Perfektes Handy ;)

    Meinst du MySQL oder MySQLi/PDO ? Da MySQL ja eher veraltet ist.


    MySQL an sich ist nicht veraltet. Einzig und allein die mysql_* extension für php ist als verwaltet gekennzeichnet. Und bitte MySQLi & PDO sind nicht das selbe. MySQLi & die mysql_* extension vom Sinn bzw der Funktionsbenenneung hingegeben schon...