Pereiti prie turinio

Mokausi PHP OOP


Rekomenduojami pranešimai

Visų pirma norėčiau pasidalinti pirmąja savo rašyta PHP OOP klase ir paklausti, ar viskas joje yra gerai, ką būtų galima pakeisti, patobulinti - tai login.class, kuri naudojama prisijungimui prie svetainės. Noriu išgauti maksimalų rezultatą tiek saugume, tiek visame kame. Taigi kodas, kuris parašytas per ~1,5val.

 

<?php
class login {

private 	$logged_in 	= false;
public 		$errors 	= array();

private 	$username 	= "";
private 	$password 	= "";

public function __construct() {
	session_start();
	if ($this->logout()) {         

	} elseif ($this->loginUserSession()) {
		$this->logged_in = true;
	} elseif ($this->loginUser()) {
		$this->logged_in = true;
	}
}

private function loginUserSession() {
	if (!empty($_SESSION["username"]) && ($_SESSION["logged_in"] == 1)) {
		return true;
	} else {
		return false;
	}
   }

private function loginUser(){ 
	global $db;

	if (isset($_POST["login"]) && !empty($_POST["username"]) && !empty($_POST["password"])) {

		$this->username = clean($_POST["username"]);
		$this->password = clean($_POST["password"]);
		$this->password = md5($this->password); 

		$sql = "SELECT * FROM table WHERE user_username='{$this->username}'";
		$rez = $db->db_array($db->db_query($sql));
		if ($db->db_rows($db->db_query($sql)) != 0) {
			if ($rez["user_status"] == 1) {
				if ($this->password == $rez["user_password"]) {
					$_SESSION["logged_in"] = 1;
					$_SESSION["user_id"] = $rez['user_id'];
					$_SESSION["username"] = $rez['user_username'];
					session_write_close();
					session_regenerate_id(true);
					return true;
				} else {
					session_write_close();
					session_regenerate_id(true);
					$this->errors[] = "Neteisingas prisijungimo vardas arba slaptažodis.";
					return false;
				}
			} else {
				$this->errors[] = "Prisijungimo vardas neaktyvus.";
				return false;
			}	
		} else {
			$this->errors[] = "Prisijungimo vardas neegzistuoja.";
			return false;
		}
	} elseif (isset($_POST["login"]) && !empty($_POST['user_name']) && empty($_POST['user_password'])) {
		$this->errors[] = "Įveskite slaptažodį!";
	}
}

public function logout() {
	if (isset($_GET["logout"]) && ($_GET["logout"] == "")) {
		$_SESSION = array();
		session_destroy();
		//return true;
		header("Location: ".ROOT);
		die();
	}
}

public function isLoggedIn() {
	return $this->logged_in;
}

}

 

function clean($str) {
   $str = @trim($str);
   if(get_magic_quotes_gpc()) {
       $str = stripslashes($str);
   }
   return mysql_real_escape_string($str);
}

 

mysql db klasę sudėjau iš ankščiau rašytų atskirų funkcijų:

<?php

class DB {
public $db_host;
public $db_user;
public $db_pass;
public $db_name;

function db_connect() {
	$connect = @mysql_connect($this->db_host,$this->db_user,$this->db_pass);
	if(!$connect){
		@mysql_close($connect);
		die ("<span style='font-family:Verdana;font-size:11px;text-align:center;'>Negalime prisijungti prie duomenų bazės</span>");
		return false;
	}
	return true;
}

function db_select() {
	$select = @mysql_select_db($this->db_name);
	if(!$select){
		@mysql_close($connect);
		die ("<span style='font-family:Verdana;font-size:11px;text-align:center;'>Negalime pasirinkti duomenų bazės</span>");
		return false;
	}
	return true;
}

function charset_UTF8() {
	@mysql_query("SET names 'UTF8'");
	@mysql_query("SET charset 'UTF8'");
	@mysql_query("SET character_set_client = UTF8");
	@mysql_query("SET character_set_connection = UTF8");
	@mysql_query("SET character_set_database = UTF8");
	@mysql_query("SET character_set_results = UTF8");
	@mysql_query("SET character_set_server = UTF8");
}

function db_query($query) {
	$result = @mysql_query($query);
	if (!$result) {
		echo mysql_error();
		return false;
	} else {
		return $result;
	}
}

function db_count($field,$table,$conditions="") {
	$cond = ($conditions ? " WHERE ".$conditions : "");
	$result = @mysql_query("SELECT Count(".$field.") FROM ".$table.$cond);
	if (!$result) {
		echo mysql_error();
		return false;
	} else {
		$rows = mysql_result($result, 0);
		return $rows;
	}
}

function db_result($query, $row) {
	$result = @mysql_result($query, $row);
	if (!$result) {
		echo mysql_error();
		return false;
	} else {
		return $result;
	}
}

function db_rows($query) {
	$result = @mysql_num_rows($query);
	return $result;
}

function db_row($query) {
	$db_query = $this->db_query($query);
	$result = @mysql_fetch_row($db_query);
	if (!$result) {
		echo mysql_error();
		return false;
	} else {
		return $result;
	}
}

function db_array($query) {
	$result = @mysql_fetch_assoc($query);
	if (!$result) {
		echo mysql_error();
		return false;
	} else {
		return $result;
	}
}

function db_close() {
	global $connect;
	@mysql_close($connect);
}
}

 

Laukiu kritikos.

Programavime esu savamokslis, PHP naudoju gan seniai, tačiau dabar užsispyriau išmokti būtent OOP. Rašydamas šias klases peržvelgiau pavyzdžius phpclasses.org svetainėje.

 

 

-------------------------

Sekantis klausimas, noras išgirsti patarimą būtų apie duomenų rūšiavimą ir puslapiavimą. Norėčiau šį failą parašyti objektiniu programavimu. Kaip reikėtų rašyti klasę, kurios pagalba galėčiau rūšiuoti duomenis, jų iškoti lentelėje.

 

<?php 
require_once "functions.php";
if (!$login->isLoggedIn()) header("Location: ".ROOT);

$displayRecs = 10;

$tablename = "pages";
$dbwhere = "";
$b_search = "";

// --- SEARCH --- //
// Get search criteria for basic search
$searchString = trim(clean($_POST["search"]));
if ($searchString != "") {
$b_search .= "page_title LIKE '%".$searchString."%' OR ";
}
if (strlen($b_search) > 4) {
$b_search = substr($b_search, 0, -4);
	if ($dbwhere != "") {
		$b_search = " AND (".$b_search.")" ;
	} else {
		$b_search = "(".$b_search.")"; 
	} 
}

// Build search criteria
if ($b_search != "") {
$dbwhere = $dbwhere.$b_search; //basic search
}

//Save search criteria
if ($dbwhere <> "") {
$_SESSION["tablename"] = $tablename;
$_SESSION["dbwhere"] = $dbwhere;
//reset start record counter
$_SESSION["pag_REC"] = 0;
} else {
if ($tablename == $_SESSION["tablename"]) {
	$dbwhere = $_SESSION["dbwhere"];
} else {
	//reset search criteria
	$dbwhere = "";
	$_SESSION["dbwhere"] = $dbwhere;
}
}

//Get clear search cmd
if (isset($_GET["cmd"]) && ($_GET["cmd"] == "reset")) {
//reset search criteria
$dbwhere = "";
$_SESSION["dbwhere"] = $dbwhere;
//reset start record counter
$_SESSION["pag_REC"] = 0;
}

// --- ORDER --- //
// Load Default Order
$DefaultOrder = "page_title";
$DefaultOrderType = "ASC";

// Check for an Order parameter
$OrderBy = "";
if (isset($_GET["order"])) {
$OrderBy = $_GET["order"];
// Check if an ASC/DESC toggle is required
if ($_SESSION["pag_OB"] == $OrderBy) {
	if ($_SESSION["pag_OT"] == "ASC") {
		$_SESSION["pag_OT"] = "DESC";
		$orderBG = "desc";
	} else {
		$_SESSION["pag_OT"] = "ASC";
		$orderBG = "asc";
	}
} else {
	$_SESSION["pag_OT"] = "ASC";
	$orderBG = "asc";
}
$_SESSION["pag_OB"] = $OrderBy;
$_SESSION["pag_REC"] = 0;
} else {
$OrderBy = $_SESSION["pag_OB"];
$orderBG = strtolower($_SESSION["pag_OT"]);
if ($OrderBy == "") {
	$OrderBy = $DefaultOrder;
	$_SESSION["pag_OB"] = $OrderBy;
	$_SESSION["pag_OT"] = $DefaultOrderType;
}
}

// Check for a START parameter
if (isset($_GET["start"])) {
$_SESSION["pag_REC"] = $_GET["start"];
} else {
$startRec = $_SESSION["pag_REC"];
if (!is_numeric($startRec) || $startRec == "") {
	//reset start record counter
	$_SESSION["pag_REC"] = 0;
}
}

// --- QUERY --- //
// Build Query
$sSQL  = "SELECT ";
$sSQL .= "page_id, page_title, page_online, page_showOnTop, page_url, ";
$sSQL .= "(SELECT count(page_id) FROM $tablename) AS totalPags ";
$sSQL .= "FROM $tablename ";
if ($dbwhere <> "") { $sSQL .= "WHERE ".$dbwhere." "; }
if ($OrderBy <> "") { $sSQL .= "ORDER BY ".$OrderBy." ".$_SESSION["pag_OT"]." "; }
$sSQL .= "LIMIT ".$_SESSION["pag_REC"].", ".$displayRecs."";

$pages = $db->db_query($sSQL);

require_once "header.php";
?>
<h1>Puslapiai</h1>
<fieldset>
<legend>Sukurtų puslapių sąrašas</legend>
<table class="bordered"> 
	<thead> 
		<tr class="set-height">
			<th rowspan="2" class="sort <?php if ($OrderBy == "page_title") { echo $orderBG; } ?>"><a href="pages?order=page_title">Pavadinimas</a></th>
			<th width="100" class="sort <?php if ($OrderBy == "page_showOnTop") { echo $orderBG; } ?>"><a href="pages?order=page_showOnTop">Rodyti viršuje?</a></th>
			<th rowspan="2" width="75" class="sort <?php if ($OrderBy == "page_online") { echo $orderBG; } ?>"><a href="pages?order=page_online">Įjungtas?</a></th>
			<th rowspan="2" width="65">Veiksmai</th>
		</tr> 
	</thead> 
	<tbody>
		<?php
		if ($db->db_rows($pages)) {
			while ($data = $db->db_array($pages)) {
				$totalRecs = $data['totalPags'];
				$online = $data["page_online"];
				$onlineChecked = '';
				if ($online == 1) $onlineChecked = 'checked="checked"';

				$onlineOnTop = $data["page_showOnTop"];
				$onlineOnTopChecked = '';
				if ($onlineOnTop == 1) $onlineOnTopChecked = 'checked="checked"';

				$onlineOnBottom = $data["page_showOnBottom"];
				$onlineOnBottomChecked = '';
				if ($onlineOnBottom == 1) $onlineOnBottomChecked = 'checked="checked"';
		?>
			<tr>
				<td><?php echo $data["page_title"]; ?></td>
				<td class="center"><input data-type="pagesTop" data-id="<?php echo $data["page_id"]; ?>" class="iButton ajax_checkbox" type="checkbox" value="<?php echo $onlineOnTop; ?>" <?php echo $onlineOnTopChecked; ?> /></td>
				<td class="center"><input data-type="pages" data-id="<?php echo $data["page_id"]; ?>" class="iButton ajax_checkbox" type="checkbox" value="<?php echo $online; ?>" <?php echo $onlineChecked; ?> /></td>
				<td class="center">
					<span class="btn-icons">
						<a href="pages/edit-page-<?php echo $data["page_id"]; ?>/"><span class="glyphicon glyphicon-pencil"></span></a>
						<?php if ($data["page_url"] != "kontaktai") echo '<a href="#" class="btn-delete" data-text="šį puslapį" data-type="pages" data-id="'.$data["page_id"].'"><span class="glyphicon glyphicon-trash"></span></a>'; ?>
					</span>
				</td>
			</tr>
		<?php
			}
		} else {
		?>
			<tr>
				<td colspan="4" class="center">Sukurtų puslapių nėra.</td>
			</tr>
		<?php
		}
		?>
	</tbody>
	<tfoot>
		<tr>
			<td colspan="4" class="center">
				<?php echo Paging($_SESSION["pag_REC"],$displayRecs,$totalRecs,"pages"); ?>
			</td>
		</tr>
	</tfoot>
</table> 
</fieldset>
<a href="pages/create-new-page/" class="btn_on_top">Sukurti naują</a>
<?php
require_once "footer.php";

 

Functions.php failas:

<?php
ob_start();
session_name("Test");
if (!session_start()) die("Atsiprašome, nepavyko sukurti sesijos, pabandykite prisijungti vėliau.");

date_default_timezone_set("Europe/Vilnius");

require_once "inc/db.class.php";
$db = new DB();
$db->db_host = "localhost";
$db->db_user = "db_user";
$db->db_pass = "***";
$db->db_name = "db_name";
$db->db_connect();
$db->db_select();
$db->charset_UTF8();

require_once "inc/login.class.php";
$login = new login();

define("ROOT", "/");

function Paging($Start,$Limit,$Entrys,$Link,$range=3) {
   $print = "";
   $page_count = ceil($Entrys / $Limit);
   if ($page_count <= 1) { 
       return ""; 
   }

   if ($page_count > 1) {
       $back = $Start - $Limit;
       $next = $Start + $Limit;
       $current_page = ceil(($Start + 1) / $Limit);
           if ($back >= 0) {
               $print .= "<a class='pag_button' href='$Link?start=$back'><</a>";
               if ($current_page > ($range + 1)) {

                   $print .= "<a class='pag_button' href='$Link?start=0'>1</a>";
                   if ($current_page != ($range + 2)) {
                       $print .= "<a class='pag_button_disabled'>...</a>";
                   }
               }
           } else {
               $print .= "<a class='pag_button_disabled'><</a>";
           }

           $first = max($current_page - $range, 1);
           $last = min($current_page + $range, $page_count);

           if ($range == 0) {
               $first = 1;
               $last = $page_count;
           }

           for($i=$first; $i<=$last; $i++) {
               $offset_page = ($i - 1) * $Limit;
               if ($i == $current_page) {
                   $print .= "<a class='pag_button_active'>$i</a>";
               } else {
                   $print .= "<a class='pag_button' href='$Link?start=$offset_page'>$i</a>";
               }
           }
           if ($next < $Entrys) {
               if ($current_page < ($page_count - $range)) {
                   if ($current_page != ($page_count - $range - 1)) {
                       $print .= "<a class='pag_button_disabled'>...</a>";
                   }
                   $print .= "<a class='pag_button' href='$Link?start=".($page_count - 1) * $Limit."'>$page_count</a>";
               }
               $print .= "<a class='pag_button' href='$Link?start=$next'>></a>";
           } else {
               $print .= "<a class='pag_button_disabled'>></a>";
           }
   }
   echo $print;
}

Jeigu galite, pateikite pavyzdžių.

Redagavo Donatis07
Nuoroda į pranešimą
Dalintis kituose puslapiuose

Tuoj Silkė ateis su savo mintimis apie mysql_. Siūlau pasiruošti!

 

Nesu tikras, kiek visa klasė turi logikos. Bet keli pastebėjimai:

  1. Klasės pavadinimai rašomi didžiąja raide.
  2. Klasės "login" pavadinimas visiškai jokios prasmės neturi. Gal labiau koks "User" tiktų ar panašiai.
  3. Nenaudok mysql_. Geriau jau naudok mysqli ar PDO. Nereikės pačiam klasės rašyti. O ir šiaip. Tos funkcijos ir taip egzistuoja, tai kokia prasmė perrašinėti tas pačias funkcijas?

 

 

Edit'ui EDIT'as:

 

  1. Naudok kokią nors programavimo struktūrą, pvz, MVC, kad atskirtum backend'ą nuo frontend'o.

Na, fui. Skaityti visai nepatogu.

Redagavo Satisfaction
Nuoroda į pranešimą
Dalintis kituose puslapiuose

Tuoj Silkė ateis su savo mintimis apie mysql_. Siūlau pasiruošti!

 

Nesu tikras, kiek visa klasė turi logikos. Bet keli pastebėjimai:

  1. Klasės pavadinimai rašomi didžiąja raide.
  2. Klasės "login" pavadinimas visiškai jokios prasmės neturi. Gal labiau koks "User" tiktų ar panašiai.
  3. Nenaudok mysql_. Geriau jau naudok mysqli ar PDO. Nereikės pačiam klasės rašyti. O ir šiaip. Tos funkcijos ir taip egzistuoja, tai kokia prasmė perrašinėti tas pačias funkcijas?

 

 

Edit'ui EDIT'as:

 

  1. Naudok kokią nors programavimo struktūrą, pvz, MVC, kad atskirtum backend'ą nuo frontend'o.

Na, fui. Skaityti visai nepatogu.

 

Na apie PDO galvojau jau, nes forumą skaitant daug kur tai minima ir siūloma pereiti nuo mysql prie jo. Reikia užsiimt ir perdaryt, tik kad daug užklausų perrašinėti teks, tai dėl to ir tempiu :D

 

Su MVC jau sunkiau, nes nelabai suprantu, kaip jį naudoti kol kas, bet ateitį būtinai prieisiu ir iki jo.

Nuoroda į pranešimą
Dalintis kituose puslapiuose

Tuoj Silkė ateis su savo mintimis apie mysql_. Siūlau pasiruošti!

:lol:

 

Noriu išgauti maksimalų rezultatą tiek saugume, tiek visame kame.

$this->password = md5($this->password); 

Uoj ne.

 

Nesuprantu, iš kur kyla mintis išvis naudoti md5? Nebent iš blogų tutorialų. Nes jei būtų išvis nesidomima, na, tada plaintext būtų... Pirma escapinti mysql'ui, o tada hešuoti išvis genialu - hešuos ne

a'123

o

a\'123

... Escapinimas (jei naudojamas jis), turėtų būti paskutinėj stadijoj, TIK prieš dedant į DB. O geriausia – naudoti prepared statements.

 

  • PDO, visos užklausos su parametrų bindinimu
  • Kažkas normalaus slaptažodžių hešavimui (bcrypt, PBKDF2, scrypt)
  • OWASP Top 10
  • PHP The Right Way
  • MVC. Gal po OOP? Nežinau. Tikriausiai. Bet kokiu atveju, savo frameworką kursi nebent mokymuisi, greičiausiai po kiek laiko pradėsi naudoti kurį nors iš esamų.

Redagavo Silke
Nuoroda į pranešimą
Dalintis kituose puslapiuose

Jeigu nėra būtinybės tai ir nesimokink smarty, kai prireiks - išmoksi. Mažai kur sutinkamas jis, kol esi jaunas. Kas liečia MVC tai teisingai sako, daug gražiau (kodo atžvilgiu), daug efektyviau ir pačiam daug patogiau, kai front endas nesimala su backendu. Yra Lietuvių kalba knyga apie tai, pavyzdys ne pats geriausias, bet išmokti galima, tiesa, ten mokina ant specifinio karkaso, bet pradžioje aiškina kaip pats MVC veikia, tai jei reikės galėsiu atsiųst.

Nuoroda į pranešimą
Dalintis kituose puslapiuose

Silke,

einu viską perdaryt ant PDO :D

paskui keisiu passwordų hešavimą :)

Cool :) Permesk minėtus šaltinius – OWASP (saugumo dalykų web aplikacijoje yra daugiau, nei manei), PHP TRW (ne vien apie PHP dalykus. Versijų kontrolė pravers programuojant bet kuria kalba!).

 

Savo MVC irgi nėra blogai pasirašyt, jei tai padės geriau suvokti tą modelį. Aišku, šiek tiek dviračio išradinėjimas rašyti pilnavertį DB layerį ar template sistemą, bet tu to ir nežadi daryt :)

Nuoroda į pranešimą
Dalintis kituose puslapiuose

na pagaliau mysql pakeista į pdo :)

 

norėčiau dar kartą paklausti, ką būtų galima User (ankščiau login) klasėje pakeisti, išskyrus slaptažodžių hešavimą, kurį šiuo metu jau keičiu. Mano pakeista klasė šiuo metu atrodo taip:

<?php
class User {

private 	$logged_in 	= false;
public 		$errors 	= array();

private 	$username 	= "";
private 	$password 	= "";

public function __construct() {
	session_start();
	if ($this->logout()) {         

	} elseif ($this->loginUserSession()) {
		$this->logged_in = true;
	} elseif ($this->loginUser()) {
		$this->logged_in = true;
	}
}

private function loginUserSession() {
	if (!empty($_SESSION["username"]) && ($_SESSION["logged_in"] == 1)) {
		return true;
	} else {
		return false;
	}
   }

private function loginUser() { 
	global $db;

	if (isset($_POST["login"]) && !empty($_POST["username"]) && !empty($_POST["password"])) {

		$this->username = $_POST["username"];
		$this->password = $_POST["password"];
		$this->password = md5($this->password); 

		try {
			$res = $db->prepare("SELECT * FROM users WHERE user_username=:username AND user_password=:password");
			$res->bindValue(':username', $this->username, PDO::PARAM_STR);
			$res->bindValue(':password', $this->password, PDO::PARAM_STR);
			$res->execute();
			if ($res->rowCount() > 0) {
				$data = $res->fetch();
				if ($data["user_status"] == 1) {
					$_SESSION["logged_in"] = 1;
					$_SESSION["user_id"] = $data['user_id'];
					$_SESSION["username"] = $data['user_username'];
					session_write_close();
					session_regenerate_id(true);
					$logLogin = $db->prepare("INSERT INTO logs (username, ip) VALUES (:username, :ip)");
					$logLogin->bindParam(':username', $data['user_username'], PDO::PARAM_STR);
					$logLogin->bindParam(':ip', getRealIP(), PDO::PARAM_STR);
					$logLogin->execute();
					return true;
				} else {
					$this->errors[] = "Prisijungimo vardas neaktyvus.";
					return false;
				}	
			} else {
				$this->errors[] = "Neteisingi prisijungimo duomenys.";
				return false;
			}
		} catch(PDOException $ex) {
			$this->errors[] = "Įvyko duomenų bazės klaida. Bandykite prisijungti vėliau.";
		    errorLogging($ex->getMessage());
		    return false;
		}
	} elseif (isset($_POST["login"]) && (empty($_POST["username"]) || empty($_POST["password"]))) {
		$this->errors[] = "Įveskite prisijungimo vardą ir slaptažodį.";
		return false;
	}
}

public function logout() {
	if (isset($_GET["logout"]) && ($_GET["logout"] == "")) {
		setcookie("hide_footer", "", time() - 7200, substr(ROOT, 0, -1));
		$_SESSION = array();
		session_destroy();
		//return true;
		header("Location: ".ROOT);
		die();
	}
}

public function isLoggedIn() {
	return $this->logged_in;
}

}

Redagavo Donatis07
Nuoroda į pranešimą
Dalintis kituose puslapiuose

na pagaliau mysql pakeista į pdo :)

 

norėčiau dar kartą paklausti, ką būtų galima User (ankščiau login) klasėje pakeisti, išskyrus slaptažodžių hešavimą, kurį šiuo metu jau keičiu. Mano pakeista klasė šiuo metu atrodo taip:

<?php
class User {

private 	$logged_in 	= false;
public 		$errors 	= array();

private 	$username 	= "";
private 	$password 	= "";

public function __construct() {
	session_start();
	if ($this->logout()) { 		

	} elseif ($this->loginUserSession()) {
		$this->logged_in = true;
	} elseif ($this->loginUser()) {
		$this->logged_in = true;
	}
}

private function loginUserSession() {
	if (!empty($_SESSION["username"]) && ($_SESSION["logged_in"] == 1)) {
		return true;
	} else {
		return false;
	}
   }

private function loginUser() { 
	global $db;

	if (isset($_POST["login"]) && !empty($_POST["username"]) && !empty($_POST["password"])) {

		$this->username = $_POST["username"];
		$this->password = $_POST["password"];
		$this->password = md5($this->password); 

		try {
			$res = $db->prepare("SELECT * FROM users WHERE user_username=:username AND user_password=:password");
			$res->bindValue(':username', $this->username, PDO::PARAM_STR);
			$res->bindValue(':password', $this->password, PDO::PARAM_STR);
			$res->execute();
			if ($res->rowCount() > 0) {
				$data = $res->fetch();
				if ($data["user_status"] == 1) {
					$_SESSION["logged_in"] = 1;
					$_SESSION["user_id"] = $data['user_id'];
					$_SESSION["username"] = $data['user_username'];
					session_write_close();
					session_regenerate_id(true);
					$logLogin = $db->prepare("INSERT INTO logs (username, ip) VALUES (:username, :ip)");
					$logLogin->bindParam(':username', $data['user_username'], PDO::PARAM_STR);
					$logLogin->bindParam(':ip', getRealIP(), PDO::PARAM_STR);
					$logLogin->execute();
					return true;
				} else {
					$this->errors[] = "Prisijungimo vardas neaktyvus.";
					return false;
				}	
			} else {
				$this->errors[] = "Neteisingi prisijungimo duomenys.";
				return false;
			}
		} catch(PDOException $ex) {
			$this->errors[] = "Įvyko duomenų bazės klaida. Bandykite prisijungti vėliau.";
    		errorLogging($ex->getMessage());
    		return false;
		}
	} elseif (isset($_POST["login"]) && (empty($_POST["username"]) || empty($_POST["password"]))) {
		$this->errors[] = "Įveskite prisijungimo vardą ir slaptažodį.";
		return false;
	}
}

public function logout() {
	if (isset($_GET["logout"]) && ($_GET["logout"] == "")) {
		setcookie("hide_footer", "", time() - 7200, substr(ROOT, 0, -1));
		$_SESSION = array();
		session_destroy();
		//return true;
		header("Location: ".ROOT);
		die();
	}
}

public function isLoggedIn() {
	return $this->logged_in;
}

}

 

Patarčiau nedaryti tokių sudėtingų metodų. Pavyzdžiui login funkcijoje, galėtum panaudoti private metodus( pvz gali sukurti checkCrediantals funkciją, kuri patikrintų duomenų teisingumą, o login funkcija ja pasinaudotų). Kai pradėsi naudotis testais tai tikrai pravers.

Nuoroda į pranešimą
Dalintis kituose puslapiuose

$this->errors globalus – neaišku, nei kieno errorai, nei iš kurio karto, nei ką. + jei bandytum priloginti du kartus vienam atvertime (tarkime, kad taip būna), prisikaups per daug. Reiktų arba exceptiono, ar bent kokio return value su error kodu, pvz. :) O ne klaidas matuoti tuo, kiek pranešimų masyve. + Veltui User klasė prisiima atsakomybę, kaip atvaizduoti klaidas (labiau viewo darbas).

 

global $db;

Nelabai gerai globalai, ypač pernaudojamame komponente, pasidomėk dependency injection.

 

function __construct($dbconn) {
   $this->db = $dbconn;
}
function login() {
   $this->db->query(...)
}
// ...
$db = new DB();
$user = new User($db);

 

Konstruktorius daro per daug. Jis turėtų tik sukurti objektą, o ne galvoti, kaip ir ką prijungti. T.y., mano nuomone, semantiškai gražiau yra:

$user = new User();
$user->login();

 

if ($this->logout()) {          

               }

$this->logout() nieko negrąžina, o ifo „kūnas“ – tuščias.

Redagavo Silke
Nuoroda į pranešimą
Dalintis kituose puslapiuose

gal galit papasakot ar duot pavyzdžių kaip susikurti savo mvc? Šitoje dalyje esu visiškai žalias ir nieko nerandu... Arba jau kokį esamą frameworką kaip naudot? :|

negi taip sunku bent po šį forumą panaršyt, prieš užduodant tokius klausimus? Pradžiai manau susidarysi bendrą vaizdą: http://uzdarbis.lt/t268142/php-mvc-kaip-tai-veikia/

Nuoroda į pranešimą
Dalintis kituose puslapiuose

negi taip sunku bent po šį forumą panaršyt, prieš užduodant tokius klausimus? Pradžiai manau susidarysi bendrą vaizdą: http://uzdarbis.lt/t268142/php-mvc-kaip-tai-veikia/

šitą buvau skaitęs, tikėjausi daugiau atsakymų, bet jau apsistosiu ties codeigniter, kadangi pasirodė paprastas ir suprantamas, dokumentacija aiški ir lietuvių kalba, ir jų pačių manualas atrodo gan rimtas.

 

User klasė bus perdaryta naujai, pagal frameworką, bet dėkui už patarimus, pažiūrėsim ką ateity pribursiu :)

 

Dėkui už atsakymus.

 

---

Silkei:
dėkui už patarimus ir apmokymus dėl PDO!

 

---

 

Iškilus naujiems klausimams (o jų manau dar bus nemažai), šią temą pratęsiu.

P.S. Galbūt galėtumėte padėti dar ir kitoje temoje, kadangi galutinio tenkinamo sprendimo kol kas neturiu: http://uzdarbis.lt/t294880/lietuvisku-kabuciu-rasymas-input-textarea-tinymce/page__pid__2493125#entry2493125

Redagavo Donatis07
Nuoroda į pranešimą
Dalintis kituose puslapiuose

Na ką gi, pirmoji užduotis, kurios nesigauna atlikti su CodeIgniter yra ta, jog nemoku įkelti header_links_view (puslapio nuorodos, kurios būtų imamos iš duomenų bazės) į base_view (pagrindinis html kodas su head, body, header ir kt. tagais). Help.

 

base_view kodas:

<!DOCTYPE html>
<html lang="en-US">
<head>
<title>Title</title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<link rel="shortcut icon" href="<?php echo base_url(); ?>images/theme/favicon.ico?v=2" type="image/x-icon" />
<link href="http://fonts.googleapis.com/css?family=Open+Sans:300,400,600,700,800" rel="stylesheet" type="text/css" />
<link rel="stylesheet" href="<?php echo base_url(); ?>css/main.css" type="text/css" media="screen" />
<script type="text/javascript" src="http://maps.google.com/maps/api/js?sensor=false"></script>
</head>
<body>
<div id="container">
	<header>
		<?php $this->load->view("header_links_view"); ?>
		<a href="<?php echo base_url(); ?>" id="logo">
			<img src="<?php echo base_url(); ?>images/theme/logo.png" alt="" />
		</a>
		<div id="map-container">
			<div class="map-settings"><?php echo $this->contacts->contact_latitude; ?>|<?php echo $this->contacts->contact_longitude; ?>|<?php echo $this->settings->company_name; ?>
			<div id="google-map"></div>
			<div class="address"><?php echo $this->contacts->contact_address; ?></div>
			<div class="details"><a href="<?php echo base_url(); ?>kontaktai/"><?php echo $this->settings->company_name; ?> kontaktai ir rekvizitai</a></div>
		</div>
		<div id="contact-us-now">
			<a href="<?php echo $this->contacts->contact_facebook; ?>" target="_blank"></a>
			<div>Susisiekite dabar! <a href="tel:<?php echo $this->contacts->contact_telephone; ?>"><?php echo substr($this->contacts->contact_telephone, 0, 4)." ".substr($this->contacts->contact_telephone, 4, 3)." ".substr($this->contacts->contact_telephone, 7, 2)." ".substr($this->contacts->contact_telephone, 9, 3); ?></a></div>
		</div>
	</header>
	<div id="content">
		<?php $this->load->view("base_content_view"); ?>
	</div>
</div>
<footer>
	<div class="inner">
		<div class="copyright">
			<span>© <?php echo $this->settings->company_name." ".date("Y"); ?></span>
		</div>
		<div class="links">
			<a href="<?php echo $this->contacts->contact_facebook; ?>" class="fb" target="_blank"></a>
		</div>
		<div class="clearfix"></div>
	</div>
</footer>
</body>
</html>

 

header_links_view:

<nav>
<a href="<?php echo base_url(); ?>" <?php //if ($defaultPage) echo "class='active'"; ?>>Pradžia</a>
<?php // čia reikia linkų iš DB ?>
</nav>

 

settings modelio kodas (užkroviau per autoload.php ir į base_view sudėjau reikiamus nustatymus):

<?php if (!defined('BASEPATH')) exit('No direct script access allowed');

class Settings_main_model extends CI_Model {
   function __construct() {
       parent::__construct();      
       $main_settings = array();
       $CI = &get_instance();

       if ($this->config->item("useMainSettings")) {
       	$result = $this->db->query("SELECT * FROM settingsMain");
           while ($data = $result->fetch(PDO::FETCH_ASSOC)) {
               $main_settings[$data['settings_name']] = $data['settings_value'];
           }     
       } else {
           $main_settings = (object) $CI->config->config;
       }   
       $CI->settings = (object) $main_settings;      
   } 
}

bet kažkaip nemanau, kad galėtų būti teisingas sprendimas taip pat daryti ir su linkais.

 

 

Papasakokit kaip kurti tuos modelius ir kontrolerius...

P.S. linkai būtų visame puslapį tie patys. tiksliau keisis visus tik #content divo turinys pagal url.

Redagavo Donatis07
Nuoroda į pranešimą
Dalintis kituose puslapiuose

nori pasakyt, kad tau internetas atjungtas? :( būk malonus, ir paskaityk dokumentaciją.. arba peržiūrėk bent vieną iš keturiasdešimt miliardų tutorialų.

noriu pasakyt, kad mokausi ir tikiuosi sulaukti pagalbos iškilus klausimams.

jeigu kažką rasčiau, kas padėtų - neklausčiau tačiau jau beveik tris valandas bandau, ieškau vėl bandau, tačiau niekas nesigauna.

Nuoroda į pranešimą
Dalintis kituose puslapiuose

P.S. linkai būtų visame puslapį tie patys. tiksliau keisis visus tik #content divo turinys pagal url.

 

Čia jau šiek tiek bėda: kiek pamenu, CodeIgniter neturi context processorių ar kažko panašaus. Galbūt išeitų kaip nors su paveldimumu sužaisti, bet turbūt nėra ir standartizuoto būdo renderinti viewą imant automatiškai kažką iš kontrolerio, tarkim :)

 

Šiaip CI gal yra lengvas išmokti, bet ne visur tobulas. Tiesiog... daroma daug kompromisų tam, kad būtų palaikomos senos PHP versijos, modeliai neatrodo labai modernūs, ir t.t. :) O dar – nebėra aktyviai developinamas, firma ieško jam naujų savininkų.

 

Šiaip dar reiktų kalbos pagrindų, o ne login sistemų ar MVC. Na, arba jei MVC, tai pasigilinti, kokia viso to esmė, o ne stačia galvą nerti į frameworką :)

Redagavo Silke
Nuoroda į pranešimą
Dalintis kituose puslapiuose

Na atrodo klausimą aiškiai išdėščiau, neprašiau Jūsų nuomonės apie vieną ar kitą dalyką.

Pagrindus ir pats pasidariau tik klausiu ką daryt toliau su tuo kas nesigauna, tad jei nežinot, nerašykit to, kas manęs net nedomina!

Nuoroda į pranešimą
Dalintis kituose puslapiuose
Na ką gi, pirmoji užduotis, kurios nesigauna atlikti su CodeIgniter yra ta, jog nemoku įkelti header_links_view (puslapio nuorodos, kurios būtų imamos iš duomenų bazės) į base_view (pagrindinis html kodas su head, body, header ir kt. tagais). Help.
Nuoroda į pranešimą
Dalintis kituose puslapiuose

tame ir esmė, kad niekas nesigauna su tuo framework, MVC...

 

yra gal koks mini tvs, kuris butų su php oop parašytas? Jį peržiūrint galbūt suprasčiau kas ir kaip veikia, nes dabar pagrindą padariau, o toliau visiškai niekas nebesigauna...

Nuoroda į pranešimą
Dalintis kituose puslapiuose

Prisijunkite prie diskusijos

Jūs galite rašyti dabar, o registruotis vėliau. Jeigu turite paskyrą, prisijunkite dabar, kad rašytumėte iš savo paskyros.

Svečias
Parašykite atsakymą...

×   Įdėta kaip raiškusis tekstas.   Atkurti formatavimą

  Only 75 emoji are allowed.

×   Nuorodos turinys įdėtas automatiškai.   Rodyti kaip įprastą nuorodą

×   Jūsų anksčiau įrašytas turinys buvo atkurtas.   Išvalyti redaktorių

×   You cannot paste images directly. Upload or insert images from URL.

Įkraunama...
  • Dabar naršo   0 narių

    Nei vienas registruotas narys šiuo metu nežiūri šio puslapio.

×
×
  • Pasirinkite naujai kuriamo turinio tipą...