<b>REGISTER</b>

GFX-Sector - PHP, MySQL


 
GFX-Sector » Coding Area » Webentwicklung » PHP, MySQL » Code Tutorial?! » Hello Guest [Login|Register]
Last Post | First Unread Post Print Page | Recommend to a Friend | Add Thread to Favorites

GFX-Sector - Your GFX-Source No. 1

  • √ kostenlose Mitgliedschaft
  • √ über 800 kostenlose Photoshop Tutorials
  • √ über 100 GB Photoshop-Ressourcen (Brushes, Render, PSDs, ...)
  • √ große und aktive Battle-Section
  • √ konstruktives Feedback zu GFX-Werken
  • √ einzigartiges Design
  • √ eines der größten Grafikplattformen in Deutschland
  • »»»JETZT KOSTENLOS REGISTRIEREN!«««

User Login



PHP, MySQL

Themen rund um die serverseitige Programmierung mit PHP in Verbindung mit der Datenbanksoftware MySQL
Post New Thread Post Reply

Code Tutorial?!

     Deutsche Version  English version
Author
Post « Previous Thread | Next Thread »

Darkly
Filtertester


Darkly hat kein Avatar

Registration Date: 21.08.2010
Posts: 4

Spacer
Code Tutorial?!

Code Tutorial?!

      

Hi zusammen,

Hab gesucht aber leider nichts dergleichen gefunden vllt hab ich etwas übersehen bitte macht mich dann darauf aufmerksam smile !


Und zwar findet man ja für ps haufen Tutorials die sich auf das Webdesign beziehen...
Meine Frage lautet gibt es auch sowas für php/mysql die sich direkt auf die script materie beziehen wie z.b. ein php news-scipt bauen mit mysql usw..

Ich hab mir desöfteren php Bücher angeguckt und und und... Teilweiiße wirklich durch gearbeitet... aber nie wirklich das gefunden was ich nun eigentlich machen möchte...

Einfaches einloggen womit man dann News/Artikel schreiben kann...

Quasi hab ich die Bausteine, hab aber keine Ahnung wie ich diese jetzt zusammensetze damit das rauskommt was ich möchte -_-^^*
Code Tutorial?! 22.08.2010 23:20 Darkly is offline Search for Posts by Darkly

bpr bpr is a male
Spender


Avatar von bpr

Registration Date: 18.11.2007
Posts: 557
Location: London
Program: Zend Studio
Forums: Coding; International Section

Spacer
      

Hi Darkly,
schoen, dass dein erster post im code bereich ist - finde ich toll ( :

nunja, sei mal ein wenig kreativ. denken wir mal eben zusammen nach : >

du moechtest nen kleines script schreiben, womit man sich in einen privaten bereich anmelden kann und dort dann einen nachrichten beitrag erstellen kann.

in anderen worten:

der benutzer, der eine nachricht schreiben will durchlaeuft folgendes:
ruft webseite auf wo formular erscheint:
muss benutzername und passwort eingeben

kommt dann auf weitere seite wo er klicken kann:
news verfassen

kommt dann auf eine weitere seite mit einem weiterem formular wo er:
titel und text eingeben kann.

dann klickt er auf absenden und dann wird diese nachricht auf der gewuenschten seite angezeigt.

das ist der recht simple ablauf einer news funktion.

wie faengst du nun an besten an ?

nunja, anscheinend brauch man ja irgendwie nen formular, damit man sich einloggen kann?

also machste 1. html und formular fertig.

dann gehts weiter. mach eine datenbank die nennst du "admins" die hat die folgenden spalten:

id (primary, AI),
username (varchar(32))
passwort (varchar(32))

nun musst du natuerlich iwie was machen, damit bei eingabe des formulares auch was passiert. dazu brauchst du dann php.

Wenn er das formular abschickt, dann greifst du auf $_POST zu. das ist ein array und da wird dann hoffentlich sowas wie $_POST['username'] und $_POST['password'] drin sein ( das kommt aber auf dein formular drauf an).

nun ueberpruefst du einfach ganz einfach mit einer php datenbank verbindung, ob der username vorhanden ist in deiner tabelle und wenn, ob das passwort gleich ist, wenn das passwort gleich ist, dann setzt du nen cookie oder ne session oder was weiss ich was wo etwa sowas drins teht:

$_SESSION['admin'] = 1;

so, nun machste die naechste seite, und zwar den privaten bereich und da fragst du als erstes ab:

if "admin" dann zeige newschreibseite an, else leite ihn zurueck zur startseite (zb mit header).

so und dann haste schon die halbe miete, denn dann kann er sich schon einloggen und sozusagen ne news verfassen. danach gehts dann ganz einfach weiter:

news schreiben (formular abschicken -> in datenbank reinschreiben)
dafuer tabelle machen:
news
mit den feldern:
id (prim, AI)
titel (varchar)
nachricht (text)

und dann fehlt ja nur noch das auslesen wo du dir einfach nen array aus der tabelle news holst, wobei jedes array eine reihe ist. und dann kannst du ganz einfach per foreach das ausgeben lassen.


SO nun ein paar wichtige hinweise:
1. Das was ich erklaert habe ist super basic
2. verwende das nicht im lifebetrieb auf einer "echten" webseite im internet
3. ich bin nicht straftbar, wenn du das doch machst smile
4. du solltest viele dinge noch mit einbaun:
a) keine passwoerter im klartext in der db speichern!
b) schau dir tutorials zur sicherheit von formularen an, wie man sie sicherer machen kann
c) die datenbank koennte man deutlich erweiteren, damit du mehr funktionen haben koenntest, wie zum beispiel bei den news:
veroeffentlicht (bool)
erstelldatum (date)
erstelltvon( int) ( hier koennte man dann die id, des benutzers reinschreiben, wenn du mehere benutzer hast)

naja, sollte erstmal fuer den anfang reichen, da sind soooo viele dinge, die du damit machen kannst, aber das ist erstmal soo simpel, noch simpler geht es in 2 varianten, die man vllt zum verstaendnis einfach mal ausprobiert:

KEINE DATENBANK

Variante 1:
Schreib den benutzernamen und passwort in zwei variablen in deinem php und vergleiche den post nur mit diesen variabeln, und wenn das gleich ist, dann setze den admin status.

Variante 2:
sobald du die eingaben vom formular per post bekommst, dann vergleiche es mit einem serialized array aus einer textdatei im gleichen order

wenn du diese zwei varianten in der reihenfolge vor der datenbank machst, lernst du bestimmte eine menge. von variante 1 und 2 ist natuerlich im life betrieb ebenfalls abzuraten, aber vielleicht hilft es dir ja beim verstaendnis, bei der einfuehrung und bei der erkenntnis, warum man lieber eine datenbank benutzt.

ich hoffe, ich konnte dir ein wenig helfen und hatte dich richtig verstanden : )

viel spass und zeig uns doch einfach mal, was du so gemacht hast, wir helfen dir bestimmte gerne weiter smile




Freude
Code Tutorial?! 23.08.2010 07:05 bpr is offline Homepage of bpr Search for Posts by bpr

Darkly
Filtertester


Darkly hat kein Avatar

Registration Date: 21.08.2010
Posts: 4

Thread Starter Thread Started by Darkly
Spacer
      

Erstmal klares -> o_O

Danke, ich war in so vielen Foren, dort bin ich meist direkt auf irgendein Flame gestoßen wie -> besorg dir ein Buch, geh uns nicht auf die Nerven...

Schön das es doch noch Leute mit Verständnis gibt die sogar noch in einer Community wie hier mitwirken...

Hab noch bis Mittwoch Urlaub und werde dir bis dahin mal mein Ergebnis zeigen! großes Grinsen

Nochmals danke großes Grinsen *verbeug verbeug verbeug*

Edith sagt: 5 Uhr *Zahnstocher knicken langsam*- Login funktioniert soweit großes Grinsen
Edit2: nu 6:30 -_-* Problem seit einer Stunde ich weiß nicht warum die Login.php nicht weiterleitet auf intern.php - Es gibt keinerlei Fehlermeldung, nur eine weiße Seite.... Hier ein auszug

php:
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
<?php
 session_start ();
 require('config.php');

$sql "SELECT ".
         "Id, Nickname, Nachname, Vorname ".
      "FROM ".
         "benutzerdaten ".
      "WHERE ".
         "(Nickname like '".$_REQUEST["name"]."') AND ".
         "(Kennwort = '".md5 ($_REQUEST["pwd"])."')";
$result mysql_query ($sql);
if (mysql_num_rows ($result) > 0)
{
      $data mysql_fetch_array ($result);
      $_SESSION["user_id"] = $data["Id"];
      $_SESSION["user_nickname"] = $data["Nickname"];
      $_SESSION["user_nachname"] = $data["Nachname"]; 
      $_SESSION["user_vorname"] = $data["Vorname"];

      header ("Location: intern.php");
 }

Fehler gelöst -_- sollte eigentlich nicht sagen woran es lag, sonst zweifelt man noch an meiner Intelligenz -> falsches Passwort eingegeben... Allerdings warum gab er mir nicht die Ausgabe falsches Passwort aus?

auf der eigentlichen Login Seite hab ich es definiert
php:
1:
2:
3:
4:
5:
6:
<?php
 if (isset ($_REQUEST["fehler"]))
{
     echo "Die Zugangsdaten waren ungültig.";
}
?>


Grüße Darkly

This post has been edited 7 time(s), it was last edited by Darkly: 27.08.2010 06:46.

Code Tutorial?! 27.08.2010 03:36 Darkly is offline Search for Posts by Darkly

bpr bpr is a male
Spender


Avatar von bpr

Registration Date: 18.11.2007
Posts: 557
Location: London
Program: Zend Studio
Forums: Coding; International Section

Spacer
      

OK ein paar dinge zu dem code:

bitte vermeide $_REQUEST, da sonst bei GET und POST geschaut wird, ist eine sicherheitsluecke!

du kannst net einfach den wert, den du aus dem formular bekommst mit nem sql query verwenden, das kann toedlich werden.

aber schaun wir ueber alles mal ien wenig hinweg, da du das ja net im life betrieb nutzen moechtest und auch das auch erstmal nur zum verstaendnis dient Wink


schau dir doch auch gleich mal PDO an. was das ist und versuch das ganze nochmal mit PDO zu loesen.

anstatt:

php:
1:
2:
3:
4:
$_SESSION["user_id"] = $data["Id"];
      $_SESSION["user_nickname"] = $data["Nickname"];
      $_SESSION["user_nachname"] = $data["Nachname"]; 
      $_SESSION["user_vorname"] = $data["Vorname"];


koenntest du auch einfach sagen

php:
1:
$_SESSION['userData'] = $data;


spart dir ein paar zeilen und du kannst dann ganz einfach weiterarbeiten mit

$_SESSION['userData']['username']

oder was weiss ich was id und co : >

wenn anstatt nen array nen object von der db wieder kommen wuerde, dann waere es noch besser : )

nunja, so weiter erstmal

viel spass




Freude
Code Tutorial?! 27.08.2010 15:35 bpr is offline Homepage of bpr Search for Posts by bpr

Darkly
Filtertester


Darkly hat kein Avatar

Registration Date: 21.08.2010
Posts: 4

Thread Starter Thread Started by Darkly
Spacer
      

Ich nehme mal an du meinst das nicht so oder?

php:
1:
2:
$_SESSION['userData'] = $data$_SESSION['user_id']['Nickname']['Nachname']['Vorname']

Code Tutorial?! 27.08.2010 19:51 Darkly is offline Search for Posts by Darkly

Fireball Fireball is a male
Boardchef


Avatar von Fireball

Registration Date: 11.11.2006
Posts: 16,174
Classing-Rank: GFX-Sector
Location: Bremen, Deutschland
Program: Adobe Photoshop CS2
Deviantart: oenismaster
Forums: (alle)

Spacer
      

quote:
Original von Darkly
Ich nehme mal an du meinst das nicht so oder?

php:
1:
2:
$_SESSION['userData'] = $data$_SESSION['user_id']['Nickname']['Nachname']['Vorname']


Nein Wink

Er meint es so:
php:
1:
2:
3:
4:
5:
$_SESSION['userData'] = $data$_SESSION['userData']['user_id']
$_SESSION['userData']['Nickname']
$_SESSION['userData']['Nachname']
$_SESSION['userData']['Vorname']
[/quote]

Wink



Code Tutorial?! 27.08.2010 20:57 Fireball is offline Homepage of Fireball Search for Posts by Fireball

Darkly
Filtertester


Darkly hat kein Avatar

Registration Date: 21.08.2010
Posts: 4

Thread Starter Thread Started by Darkly
Spacer
      

Okay, danke Herr Cheffe - allerdings das Argument von bpr das ich mir Zeilen sparen würde versteh ich dahinter nicht mehr sind doch genau soviele ?

Ich sollte ja keinen Request benutzen - stattdessen evt etwas anderes?

Ansonsten werd ich mich nun langsam an das Newseintragen,löschen, anzeigen usw wagen großes Grinsen

Code Tutorial?! 27.08.2010 22:12 Darkly is offline Search for Posts by Darkly

Fireball Fireball is a male
Boardchef


Avatar von Fireball

Registration Date: 11.11.2006
Posts: 16,174
Classing-Rank: GFX-Sector
Location: Bremen, Deutschland
Program: Adobe Photoshop CS2
Deviantart: oenismaster
Forums: (alle)

Spacer
      

Du hast dadurch weniger Zeilen, weil du der $_SESSION Variable das Array $data zuweist.
Somit musst du die einzelnen Session Variablen nicht füllen.
Verwenden kannst du sie dann einfach mit den obigen Zeilen smile

$_REQUEST könnte etwas gefährlich sein, da es $_GET und $_POST einschließt.
Du solltest dich für entweder $_GET oder $_POST entscheiden smile
Den Unterschied kennst du?



Code Tutorial?! 28.08.2010 14:39 Fireball is offline Homepage of Fireball Search for Posts by Fireball

bpr bpr is a male
Spender


Avatar von bpr

Registration Date: 18.11.2007
Posts: 557
Location: London
Program: Zend Studio
Forums: Coding; International Section

Spacer
      

Nunja, ich hoffe du verstehst, was das ueberhaupt aendert mit dem = $data.

Du bekommst ein mehrdimensionales Array! Das it ganz nuetzlich und macht es manchmal auch deutlich uebersichtlicher, natuerlich auch ein wenig komplexer, aber im endeffekt angenehmer - jedenfalls ist das mein empfinden.

Was ich dann meinte war, dass es noch besser waere, wenn du anstatt ein Array aus der Datenbank ein Objekt bekommen wuerdest. Der Schreibstil sieht ein wenig anders aus bei der auslesung, wenn man das mal vereinfach sagen moechte naemlich anstatt:

php:
1:
2:
3:
$_SESSION['userData']['username']
#wird zu
$_SESSION['userData']->username


Man koennte es dann noch interessanter gestalten aber, das lassen wir an dieser stelle mal. Jedoch moechte ich dir ans herzen legen, dir bitte PDO anzuschaun.

Schau dir mal diesen link an:
http://php.net/manual/de/intro.pdo.php

Du hast damit atemberaubende vorteile:

schau dir mal diese zeile an:

php:
1:
$db = new PDO('mysql:host=localhost;dbname=test'$user$pass);


ist ja wohl sehr einfach zu verstehen oder ?

du erstellst ein PDO object, und sagst:

1. Hey ich benutze mysql!
2. der host, ist hier bei mir, also localhost
3. desweiteren habe ich da auch ne datenbank, also benutze doch bitte die db test smile
4. der username ist $user
5. und das pw fuer den benutzer is $pass

also ich nehme mal an du arbeitest mit xampp, und hast das ganze standart mit root und keinem pw fuer dein phpmyadmin

angenommen deine datenbank fuer deine newsapp heisst:
newstool

dann sehe das ganze gefolgt aus:


php:
1:
$db = new PDO('mysql:host=localhost;dbname=newstool'"root""");


so nun koenntest du also eine kleine php datei machen die nennst du database.class.php

dann schreibst du da erstmal sowas rein wie:


class Database
{
private $username = "";
private $password = "";
private $options = array();

#nun ein wenig magische methode

function __construct()
{
return new PDO('mysql:host=localhost;dbname=newstool', $this->username, $this->password, $this->options);
}

}
[/php]

(Keine gewaehr, dass das so funktioniert, habe das nur eben hier im editor runtergeschrieben - so muss das aber ca aussehen)

Was passiert dortdrin?

Du erstellst eine klasse, die nennst du Database.
Dadrin hast du ein paar variablen, die nennen sich $username, $password, $options
die werden geschuetzt, so dass sie nicht von aussen geaendert werden koennen (deswegen das private - um das mal vereinfach auszudruecken)

danach rufst du eine magische methode auf, die erkennst du dadran, dass sie mit einem __ anfaengt und sie wird dir von php gestellt. In diesem fall nennt sie sich, constructor. Wenn du ein wenig english kannst weist du was das bedeutet.... also beim erstellen eine Database objektes wird diese methode automatisch aufgerufen! und was macht diese methode fuer dich ? sie baut eine datenbank verbindung auf! Toll oder ? aber wie kannst du das nun nutzen ?
ganz einfach:

du bist nun iwo in deinem script in einer php datei und willst dort unteranderem mit der datenbank kommunizieren dann machst du ganz einfach folgendes:

php:
1:
2:
require_once(database.class.php);
$db = new Database();


und siehe da nun hast du eine datenbank verbindung aufgebaut, bzw, du hast ein pdo object erstellt welches sich nun bei dir in der variablen $db befindet!

was bringt dir das nun? und was soll dieses pdo ueberhaupt da und warum lege ich es dir ans herzen?

Gruende:
1. es ist seit php5 und gehoert zur Objekt orientierten programmierung
2. es hilft dir bei den datenbankverbindungen in vielen aspekten wie zum beispiel:
a) prepared statements, du bist mit denen automatisch deutlich geschuetzter als mit normalen mysql datenverbindungen, WENN du vergisst, die datensaetze auszuklammern und umzuschreiben mit was weiss ich nicht viele aber tausende funktionen php da hat.
b) du hast haufenweise nuetzliche konfigurations einstellungen, die du im $options array uebergeben kannst
c) du hast EINEN zentralen punkt wo du sagst, es ist mysql, du kannst da aber auch andere arten von datenbankarten hinschreiben und nun kommst es aendert sich nichts in den statements, fetch insert oder was weiss ich was! du hast nur diesen einen zentralen punkt!

nunja, genug von der werbetrommel gehts weiter mit code jetzt, denn ich will dir noch eben zeigen wie du nun schreiben, lesen und loeschen kannst :>

fangen wir mit schreiben an:

wir gehen natuerlich davon aus, dass unsere datenbankverbindung in $db steht:

php:
1:
$prepardeStatement $db->prepare("INSERT INTO news (titel, message) VALUES (:titel, :message)");


So das ist nun der sprung ins kalte wasser: prepared statements:

Was passiert als erstes? Wir bereiten hier in der zeile naemlich erstmal alles vor, wir sagen:
Pass auf datenbank, ich will hier gleich was reinschrieben, und das wird so aussehen:

Ich schreibe in die tabelle news in folgende spalten:
titel und message
das wird die werte haben die du hier bekommen wirst, der erste ist der :titel und der zweite ist :message.

wir haben ueberhaupt noch gar keine string oder sonstiges uebergeben, wir haben regelrecht nun gesagt, pass auf, ich will einfuegen und zwar folgendes....

so du kannst aber auch (nur zum verstaendnis) bei "VALUES (:titel, :message)" auch andere sachen schreiben, zb :ASLJDl, :lakjsdlkajs

wichtig ist nur das die folgenden zeilen dann auch so heissen, denn du musst nun die parameter festlegen, das geht gefolgt:

php:
1:
2:
$prepardeStatement->bindParam(':titel'$_POST['titel']);
$prepardeStatement->bindParam(':message'$_POST['message']);


so hier sagen wir nun, das wir in unserem prepared statement, welches uns ne "sql insert" vorbereitet, folgende parameter nun belegen:

titel wird mit dem $_POST['titel'] und message wird mit $_POST['message'] befuellt.

so, wenn du nun aber in deine datenbank tabelle schaust, dann wirst du nicht viel sehen, denn wir haben bis jetzt nur alles vorbereitet!

was wir nun machen muessen ist, AUSFUEHEN!

php:
1:
$preparedStatement->execute();


so und nun sollte es auch in der tabelle in deiner datenbank drinstehen.

wenn du noch durchsteigst dann lese bitte weiter : >

du musst es nicht auf diese art und weise machen! du kannst bei den prepared statements auch einfach nur nen array uebergeben! deine platzhalter in dem prepare statement muessen auch nicht mit :name geschrieben werden, sondern koennen einfach ? sein!
aber dazu kannst du dir dann ja ein paar tutorials durchlesen, das wuerde hier deutlich den rahmen sprengen!

kommen wir nun zum delete!

was wollen wir denn gerenerel machen? wir muessen nun einen befehl ausfuehren?! richtig. ausfuehren = execute. nicht verwechseln jetzt mit dem execute von den prepared statements, denn dies mal ist es nur:

php:
1:
$db->exec();


und bei exec() schrieben wir nun rein, was ausgefuehrt werden soll, das koennte zb so aussehen:

php:
1:
$db->exec("DELETE * FROM news WHERE id=1");


der rueckgabewert von dem exec ist: "die anzahl der reihen die betroffen waren"
bei dem oberen beispiel sollte also eine 1 wieder kommen, weil die id hoffentlich bei dir auch AI und primary ist und damit unique sein sollte : >

so das war dann auch schon das loeschen, nun kommen wir wohl zum interessantesten und vielfaeltigsten part:

DAS AUSLESEN :> *donner ertoent*

als erstes machen wir mal wieder ein wenig vorberietung:

php:
1:
2:
$statement $db->prepare("SELECT id, titel, message FROM news");
$statement->execute();


so gut, nun wird dir aber nichts auf dem teller reserviert, wir haben zwar gesagt, bereite den select vor und fuehre ihn auch aus. nun wird dir aber nicht gleich alles wiedergegeben, was wir dazu machen muessen ist nen fetch, den solltest du ja auch von der normalen php4 mysql variante kennen, schaun wir uns den mal bei pdo an:

[php]
$results = $statement->fetchAll();
[/pdo]

das wars dann auch schon -.-, aber das was wieder kommt, das kannst du nun sagen, wie es wieder kommen soll schau dir dazu bitte mal folgendes an:

http://www.php.net/manual/de/pdostatement.setfetchmode.php

du kannst naemlich genau sagen wie du es haben moechtest: moechtest du alles bereits als object haben? als assoziativ array ? oder was auch immer, du kannst es angeben, du kannst es sogar global ganz am anfang setzen, wenn du in deiner database class die optionen setzt - und generel: das SOLLTEST du auch machen!


und um ehrlich zu sein, das wars auch eigentlich shcon, ich hoffe du konntest das ein wenig verstehen, das thema ist nicht gerade einfach und ich hoffe, dass du es wenigstens ausprobierst, denn ich lege es dir wirklich ans herzen, es ist 1000 mal besser als diese mysql php4 connection kacke! es wurde nicht um sonst fuer php5 entwickelt! viele kennen es nur nicht, haben 0 plan von OOP und haben auch kein interesse es zu lernen, aber ich habe jetzt fast 10 000 zeichen geschrieben, damit ich es dir erklaeren kann, also lese es wenigstens : > ich hoffe von dir auch weiteren code zu sehen und wuensche dir viel erfolg, bei fragen, weisste ja bescheid smile


alles gute und viel spass

(953 zeichen uebrig)




Freude
Code Tutorial?! 28.08.2010 17:55 bpr is offline Homepage of bpr Search for Posts by bpr
 
Spacer
   
GFX-Sector
unregistered


 hat kein Avatar


Spacer

Have you enjoyed this topic?


If you were enjoying this post and if you keen on reading more interesting stuff then do not hesitate to complete the free sign up.

After the free registration you will gain access to all areas and you will be able to communicate with other artists from all over the world.

In addition you will benefit from our Photoshop and coding section as well as from our huge (hundreds of gigabytes) free resource section where you can find everything you will need to be a successful (web) designer/artist.

Sign up now and enjoy the advantages as a registered member.

(This website will be ad-free after a complete free sign up.)

New Post 28.08.2010 17:55  
Tree Structure | Board Structure
Post New Thread Post Reply
GFX-Sector » Coding Area » Webentwicklung » PHP, MySQL » Code Tutorial?!

Similar topics to Code Tutorial?!
Thread
[Suche] Tutorials (Forum: Fragen & Probleme)
Interface Tutorial (Forum: Tutorial-Archiv)
He is Back Collab Tutorial (Forum: Tutorial-Archiv)
[Leicht] Spider Man Signatur Tutorial ( Anfänger ) (Forum: Signaturen/Avatare)
The Blue Gun [SIGNATURTUTORIAL] ***HOT*** (Forum: Tutorial-Archiv)