Auf meiner Demo Site?
User: Demo
Passwort: demo
(Habs fix neu angelegt)
Auf meiner Demo Site?
User: Demo
Passwort: demo
(Habs fix neu angelegt)
Jetzt schon die Parameter waren nur falschrum
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
<?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">×</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
Askari: Einen Tipp noch: Zieh dir lieber die Daten vom Nutzer Live aus der Datenbank und frage das ab. Ist schöner und vorallem sicherer, selbst wenn man Sessions nicht manipulieren kann so einfach...
Stimmt, und meine kleine Klasse ist eig anwendungsbeispiel genug 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:
Nun ich würde noch dem ersten Modal nen onsubmit Tag mit geben, der dann das Modal schließt und das zweite öffnet.
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// 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>';?>
Bin jetzt auf der Seite:
http://webpixelpromoter.com/20…mysql-datenbank-einfugen/
Kann mir jemand sagen in welche Datei der 3. Schritt gehört?
Also die php tags?
In meine index.html?
in die eintragen.php die du noch erstellen müsstest. Das Tutorial dort ist aber unsauber und veraltet. Ich schreib dir die 3 Dateien grade auf MySQLi kurz um, dann ist es auch für die Zukunft gewappnet.
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.
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)
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" => "$ ");//$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 $ 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)
<?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:
<?php
include 'db_connect.php';
$katalog = mysql_real_escape_string($_POST['katalog']);
$nummer = mysql_real_escape_string($_POST['nummer']);
$anzahl = mysql_real_escape_string($_POST['anzahl']);
$name = mysql_real_escape_string($_POST['name']);
$sql = 'INSERT INTO bestellung (katalog,nummer, anzahl, name) VALUES ("'.$katalog.'","'.$nummer.'", "'.$anzahl.'", "'.$name.'")';
$eintragen = mysql_query($sql) or die("Fehler: ".mysql_error());
echo 'Der Eintrag war erfolgreich. ';
echo ' <a href="Datenbank_Essen.html">Zurück</a>';
?>
Alles anzeigen
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).
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
woran erkennst du denn das es bei nem Freehoster ist und das der Traffic ausgegangen ist oO? Ich seh da nur die Meldung das der CachManager vom WCF nicht genügend Rechte hat oO, bzw nach nem ipconfig -flushdns wars weg
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...