Inlägg

Inlägg som Pilt har skrivit i forumet
Av Pilt

Synpunkter på webbplats

Hej!

Jag håller på arbeta på en liten hemsida och skulle gärna vilja ha era synpunkter. Jag har inte kommit särskilt långt men vill gärna ha kritik på vad jag gjort hittills, i första hand koden nedan. Alla synpunkter är dock välkomna.
Funktionsregistret är begränsat till basala saker som registrering och in-/utloggning.
Anledningen till att jag inte använder Wordpress eller dylikt är helt enkelt för att jag vill göra det själv, även om det inte blir lika bra gjort, och lära mig lite på vägen.

Till webbplatsen!
Logga in som demo/demo eller skapa en användare. Notera att namnet och epostadressen du väljer skrivs ut på testsidan.

Jag hoppas koden är tillräckligt självförklarande

engine.php

<?php /** * Engine * * @version $Id$ * @copyright 2006 */ session_start(); $module_dir = 'modules/'; $template_dir = 'templates/'; require_once 'config.php'; require_once 'inc/db.php'; require_once 'inc/base.php'; require_once 'inc/cleanup.php'; if ($_SESSION['logged_in']) { $puser = new User; $puser->set('id', $_SESSION['user_id']); $puser->fetch(); } /* Load requested page. */ $requested_page = get_var('page') or $requested_page = 'default'; if ($requested_page) { /* Load templating functions. */ require $template_dir . 'templating.php'; /* Load modules for requested page. */ $file = $module_dir . $requested_page . '.php'; if (file_exists($file)) require $file; /* Load template. */ $page['name'] = $requested_page; $page_file = $template_dir . $requested_page . '.php'; if (file_exists($page_file)) require $page_file; }

User.php

<?php /** * User class * * @version $Id$ * @copyright 2006 */ class User { /* Database fields. */ private $id; private $username; private $password; private $realname; private $email; private $registered; private $ip; private $last_seen; private $query_fields; function __construct() { } private function __set($name, $value) { $this->$name = $value; $this->sql_fields(); } private function __unset($name) { unset($this->$name); $this->sql_fields(); } function set($var, $val) { $this->__set($var, $val); } /** * add() * * Add user to database. */ function add() { global $db; $sql = 'INSERT INTO users VALUES ( NULL, "' . $this->username . '", "' . $this->password . '", "' . $this->realname . '", "' . $this->email . '", "' . $this->registered . '", "' . $this->ip . '", "' . $this->last_seen . '" )'; $db->query($sql) or new Exception('Could not add user.'); } /** * delete() * * Delete user from database. */ function delete() { global $db; $sql = 'DELETE FROM users WHERE id="' . $this->id . '" LIMIT 1'; $db->query($sql) or new Exception('Could not delete user.'); } /** * fetch() * * Fetch user from database. */ function fetch() { if (isset($this->id)) $user = id2user($this->id); else if (isset($this->username) && !isset($this->password)) $user = username2user($this->username); else { global $db; $sql = 'SELECT * FROM users WHERE ' . $this->query_fields . ' LIMIT 1'; $res = $db->query($sql); if (PEAR::isError($res)) die($res->getMessage()); else $res->fetchInto($user); } if (isset($user['id'])) $this->id = $user['id']; if (isset($user['username'])) $this->username = $user['username']; if (isset($user['password'])) $this->password = $user['password']; if (isset($user['realname'])) $this->realname = $user['realname']; if (isset($user['email'])) $this->email = $user['email']; if (isset($user['registered'])) $this->registered = $user['registered']; if (isset($user['ip'])) $this->ip = $user['ip']; if (isset($user['last_seen'])) $this->last_seen = $user['last_seen']; } /** * valid() * * Returns true if current user is valid. */ function valid() { if (isset($this->id)) $user = id2user($this->id); else if (isset($this->username) && !isset($this->password)) $user = username2user($this->username); else { global $db; $sql = 'SELECT * FROM users WHERE ' . $this->query_fields . ' LIMIT 1'; $res = $db->query($sql); if (PEAR::isError($res)) die($res->getMessage()); else $res->fetchInto($user); } if ($user['password'] == $this->password) { $return = true; } else $return = false; return $return; } /** * sql_fields() * * Set fields to use in query. If id is set, it will be the only field used. */ function sql_fields() { if (isset($this->id)) $sql = 'id="' . $this->id . '"'; else if (isset($this->username)) if (isset($this->password)) { $sql = 'username="' . $this->username . '" AND password="' . $this->password . '"'; } else $sql = 'username="' . $this->username . '"'; else { if (isset($this->password)) $fields[] = 'password="' . $this->password . '"'; if (isset($this->realname)) $fields[] = 'realname="' . $this->realname . '"'; if (isset($this->email)) $fields[] = 'email="' . $this->email . '"'; if (isset($this->registered)) $fields[] = 'registered="' . $this->registered . '"'; if (isset($this->ip)) $fields[] = 'ip="' . $this->ip . '"'; if (isset($this->last_seen)) $fields[] = 'last_seen="' . $this->last_seen . '"'; $sql = implode(' AND ', $fields); $sql = preg_replace('/ AND $/', '', $sql); } $this->query_fields = $sql; } /** * login() * * Login user. */ function login() { global $db; $now = time(); if (!isset($this->ip)) { $this->ip = $_SERVER['REMOTE_ADDR']; } $ip = $this->ip; $sql = 'UPDATE users SET ip="' . $ip . '", last_seen="' . $now . '" WHERE id="' . $this->id . '" LIMIT 1'; $res = $db->query($sql); if (PEAR::isError($res)) die($res->getMessage()); $_SESSION['logged_in'] = true; $_SESSION['user_id'] = $this->id; } /** * logout() * * Logout user. */ function logout() { unset($_SESSION['logged_in']); unset($_SESSION['user_id']); } function username() { $return = $this->username or $return = false; return $return; } function last_seen() { $return = $this->last_seen or $return = false; return $return; } function realname() { $return = $this->realname or $return = false; return $return; } function __destruct() { } }

En template-fil. (default.php)

<?php /** * Template **/ $page['title'] = 'hem'; require "header.php"; ?> <div id="container"> <?php gen_header(); ?> <?php gen_main_nav(); ?> <?php gen_info_board(); ?> <div id="main" class="clearfix hollyhack"> <div id="sidebar"> <ul class="box" ><li><a href="#i1">Luctus id, vehicula ut</a></li ><li><a href="#i2">Pellentesque it</a></li ><li><a href="#i3">Nam accumsan</a></li ></ul> </div> <!--// sidebar --> <div id="content"> <div class="chapter"> <h2 id="i1">Luctus id, vehicula ut</h2> <p>Lorem ipsum...</p> </div> </div> <!--// content --> </div> <!--// main --> <?php gen_common_footer(); ?> </div> <!--// container --> <?php require "footer.php";

Av Pilt

The Web Developer's Handbook är en bra länksamling.

Av Pilt

Det finns snyggare alternativ till ?foo=bar&baz=bla.
Ta en titt på mod_rewrite till Apache för mindre förlegade alternativ.
Även här för PHP: http://www.zend.com/zend/spotlight/searchengine.php

Av Pilt

Glöm inte aktivera permalänkar i Wordpress

Av Pilt

Vilket forum är det du pratar om? Hur många besökare har du? Såna saker spelar in för någon som bara ska arbeta för att fylla sin portfolio.

Av Pilt

Jag tycker den var bra. Färgerna matchar och det är lätt att hitta. Mixen av teckensnitt tycker jag inte är 100%, men det är ju en smaksak. En sak jag tycker du borde se över är läsbarheten på brödtexten.
Stuket både på gamla och nya versionen ger mig Mad4milk-vibbar, har du möjligtvis hämtat inspiration där?
Personligen föredrar jag din gamla version, mest för att den känns mer stilren.

Av Pilt

Här finns det också mycket smått och gott: http://www.alvit.de/handbook/

Av Pilt

Nja Microsoft var inte först med det. Kika på meebo istället, där tycker jag det fungerar riktigt bra.

Av Pilt

Jag tycker den där är hemsk. Den får mig att fokusera mer på gränssnittet än innehållet.
Tekniken tror jag på men inte Microsoft.

Av Pilt

Främst av allt tror jag Microsoft förhindrar spridningen av alternativ, vilket är oklanderligt från ett affärsmässigt perspektiv. De som brinner för exempelvis Open Source låter sig inte hindras av Microsoft.
Problemet tror jag ligger i att få mjukvaru- och programmeringsintresserade introduceras till utveckling i unixmiljö. Som lönetagare har inskolade .NET-utvecklare heller ingen direkt anledning till att byta.

Av Pilt

Det går sätta margin på body om man vill ha lite extra utrymme men det löser nog inte Kennels problem.

Av Pilt
Av Pilt
Citat:

Ursprungligen inskrivet av Perra82
Men tänk på att civ. ing är mer teoriskt och mindre ankytet till arbetslivet.
Det är på högskoleingenjörsutbildningen i Datorteknik som du verkligen blir kick-ass på att programmera!

Utveckla varför de blir kick-ass på att programmera.

Av Pilt

PHP av principiella skäl, men ASP.NET fungerar säkert också. Ruby on Rails kommer starkt det med.

Av Pilt

Se/boka friluftsdagar.

Av Pilt

Paranteserna talar om att "kombinationen" är en variabel, de nås sedan i den ordning de placerades i regexen.

Anta följande RewriteRule:
([a-zA-Z]+)/([1-9]+)/?$ index.php?page=$1&id=$2
Om du når webbplatsen genom adressen http://www.foo.com/bar/0909346 skickas du vidare till index.php?page=bar&id=0909346. /? på slutet gör så det fungerar även om adressen slutar på ett snedsträck.

Av Pilt

Den var fin. Jag gillar 80x15-ikonstuket.
Menyn under loggan skulle kunna förstärkas lite, kanske med någon annan färg eller lite större typsnitt. Jag tycke också att "publicerad av"-radens bakgrund skär sig mot det andra. En till liten, liten detalj är de rundade hörnen som kanske skulle må bra av lite mer avrundning. De nedre (corner-bottom-left och -right) ser mindre pixliga ut.

Schysst sida allt-som-allt, fixa koden när allt annat är uppstyrt.

Av Pilt

Lägg inte ner för stort arbete på att finslipa meta keywords om du optimerar för google. Google tittar inte på dem vid bedömningen av en sida.

Av Pilt
Av Pilt

Jag tycker det skulle vara kul att göra ett webbaserat RTS-spel. AJAX för att slippa ständiga uppdateringar. Den stora skillnaden mot ett mer traditionellt RTS-lir skulle vara att en match tar mycket längre tid. 2-3 veckor kanske mer.
De befintliga tycker jag är rätt undermåliga vad gäller användbarhet. Iofs har jag heller inte provat på så många liknande spel så rätta mig om jag har fel.
Det vore också kul om man kunde bygga ett någorlunda avancerat "guild"- eller klanläge, med olika poster och ansvarsområden kanske.

Aja, någon förutom mig som tycker det skulle vara kul?