Poslao: 15 Jun 2016 15:05
|
offline
- Nikola04
- Građanin
- Niko E
- Software & Information Engineering
- Pridružio: 05 Maj 2009
- Poruke: 135
- Gde živiš: Wien
|
Interesuje me koji je najbolji način tj. rešenje za upotrebu $_POST i $_GET variabli u klasi kada je u pitanju OOP. Da bih bio jasniji napisaću ispod primer koda koji planiram na implementiram:
+ Job.php<?php
class Job{
private $db_connection = null;
public function __construct() {
// add new customer
if (isset($_POST["add_new_job"])) {
$this->addNewJob($_POST['title'], $_POST['description']);
} elseif (isset($_POST["edit_job_data"])) {
$this->updateJob($_GET["id"], $_POST['title'], $_POST['description']);
} elseif (isset($_POST["delete_job"])) {
$this->deleteJob($_GET["id"]);
}
}
private function databaseConnection()
{
// return true if Successfully connected
// $this->db_connection = new PDO(....)
// return false otherwise
}
private function addNewJob($title, $desc){
// insert into sql
}
private function updateJob($id, $title, $desc){
// update
}
private function deleteJob($id){
// delete Job where Job_id = $id
}
}
+ dodajPosao.php<?php
require_once('Job.php');
$obj = new Job();
?>
<form method="post" action="' .$_SERVER['REQUEST_URI'] . '">
<label>Job Title</label>
<input type="text" name="title" id="title">
<label>Description</label>
<textarea name="description" id="description"></textarea>
<button type="submit" name="add_job">Submit</button>
</form>
Da li je ovo ok? Da li postoji bolje rešenje u praksi? I da je je u redu da se koriste gore napomenute variable u konstruktoru? Hvala unapred.
|
|
|
Registruj se da bi učestvovao u diskusiji. Registrovanim korisnicima se NE prikazuju reklame unutar poruka.
|
|
Poslao: 15 Jun 2016 20:56
|
offline
- E.L.I.T.E.
- Legendarni građanin
- Pridružio: 23 Maj 2012
- Poruke: 4575
|
Vodi računa da ovo zaštitiš od SQL injection i cross-site scripting-a. To generalno najviše zavisi od toga šta hoćeš da postigneš: ja recimo GET parametre koristim samo u slučaju kada to može znatno da poboljša korisničko iskustvo - recimo kod upita za pretragu ili profila određenog korisnika, pa da te URL adrese može da sačuva za ubuduće. Ovde konkretno bih pre koristio POST parametre.
|
|
|
|
Poslao: 16 Jun 2016 04:52
|
offline
- Pridružio: 25 Jan 2004
- Poruke: 2784
- Gde živiš: Niš
|
@Nikola04
Objektno orijentisano programiranje je stvoreno sa idejom da bi se lakše upravljalo velikim softverskim projektima.
Nisam došao da ti to kažem jer imaš samo jednu formu i php klasu koja radi sa njom, već sam došao da ti kažem da imaš samo jednu formu i php klasu
... Pretpostavljam da si krenuo isuviše rano da razmišljaš o tome "kako se stvari programiraju na OOP način" i da pritom pokušavaš da pristupiš tome bez dovoljno funkcionalnih celina koje je potrebno razdvojiti na objekte. Te tako, kada budeš imao ceo web sistem skiciran i planski razrađen, shvatićeš da si već zakrčio dva objekta u jednom i da je HTTP parametre logičnije hvatati na jednom mestu, u zasebnom objektu (tzv. http router), gde ćeš takođe vršiti proveru ispravnosti unosa i obezbediti ga od loših namera, a potom podatke prosleđivati drugim objektima (funkcionalnostima / kontrolerima) u zavisnosti od toga koji URL/paket je router dobio (recimo pattern matching tehnikom).
Dakle, tvoja klasa Job treba samo da radi svoj job posao i da se ne hvata uopšte sa globalnim promenljivama, a takav način razmišljanja treba da primenjuješ kasnije i na sve ostalo ... i kroz ceo život
|
|
|
|
Poslao: 16 Jun 2016 18:06
|
offline
- Pridružio: 16 Feb 2011
- Poruke: 1630
- Gde živiš: Pancevo
|
Nemas tu mnogo matematike, mozes da napravis neku Request class-u koja ce da sadrzi tvoje get, post, request, server podatke.
Nesto od jednostavnijih primera je da definises private clanove klase kojima ces podatke da prosledis kroz konstruktor ili neki setter. Ako ides kroz konstruktor bitni je da kazes klasi kojom vrstom metoda barata (POST, GET, itd..), i naravno prosledis joj taj objekat. Taj objekat se onda predaje tvom privatnom clanu klase i tako ti dobijas post podatke dostupene u celoj klasi da radis sa njima sta ti je volja...
class Request
{
private $_post;
private $_get;
public function __construct($method = "POST", array $data)
{
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
$this->$_post = $data;
}
/// bla bla
}
}
$r = $_POST;
$obj = new Request($r)
Mada moj ti je savet da se batalis pisanja svojih Request, Response klasa i vec da pogledas kako je Symfony uradio perfektno svoju komponentu Symfony\Component\HttpFoundation\Request.
Mozes da je koristis u svim tvojim projektima uz samo 2 klika i bez dodatnih konfigurasanja i bez jezgra SF frameworka.
http://api.symfony.com/2.8/Symfony/Component/HttpFoundation/Request.html
Takodje obrati paznju na njihov konstruktor i na metodu createFromGlobals() pa onda mozes da izmiksujes sam nesto.
|
|
|
|
Poslao: 19 Jun 2016 20:12
|
offline
- Nikola04
- Građanin
- Niko E
- Software & Information Engineering
- Pridružio: 05 Maj 2009
- Poruke: 135
- Gde živiš: Wien
|
Ok, hvala na odgovorima. Radim na jednom manjem projektu, tako da se nisam odlucio za neki framework. Ulozio sam nesto vise truda i vremena za pisanje nekih svojih klasa ali isplatio se jer tako ucim OOP.
|
|
|
|
Poslao: 19 Jun 2016 20:24
|
offline
- E.L.I.T.E.
- Legendarni građanin
- Pridružio: 23 Maj 2012
- Poruke: 4575
|
Kad već vežbaš OOP, uči i design patterns, biće ti korisni ukoliko planiraš da pređeš na neki framework, a i generalno će te navići da pišeš bolji kod.
|
|
|
|
Poslao: 09 Nov 2016 20:55
|
offline
- FoxVanis
- Ugledni građanin
- Web Designer, PHP Developer; HTML, CSS, SQL, jQuery Programmer
- Pridružio: 13 Jun 2010
- Poruke: 307
- Gde živiš: Subotica
|
Nikola04 ::Ok, hvala na odgovorima. Radim na jednom manjem projektu, tako da se nisam odlucio za neki framework. Ulozio sam nesto vise truda i vremena za pisanje nekih svojih klasa ali isplatio se jer tako ucim OOP.
Sada da ne dužim, ajmo par stvari:
1) Ne koristi direktno GET i post sa proverama u SQL, posebno kada radiš sa ID i bitnim podatcima.
2) Kada radiš upoređivanja sa nečim, GET ili POST mogu vratiti enkodovane podatke ili da ima negde bar razmak koji nisi očekivao
3) Moraš znati šta da očekuješ od GET ili POST, da li je varijabla, integer, float, boolean itd, odnosno tip informacije.
4) Ako radiš OOP, onda napravi sebi jednu funkciju u kojoj ćeš unutar klase snimiti GET ili POST u objekat ako ćeš ga koristiti na više mesta. Ta funkcija neka je private uvek.
5) Imaš pametnije rešenje od GET ili POST, PRIMER:
// propusti samo okrugli broj integer ili vrati 0
if (isset($_GET['id'])) {
$id = filter_input(INPUT_GET, 'id', FILTER_VALIDATE_INT, array('options'=>array(
'default' => 0, // PRIMER
"min_range" => 1, // PRIMER
"max_range" => 99999999999 // PRIMER
)));
}
// propusti samo email ili vrati false
if (isset($_GET['email'])) {
$email= filter_input(INPUT_GET, 'email', FILTER_VALIDATE_EMAIL);
}
// Ako u POST postoji neki array ili false
if (isset($_POST['var'])) {
$array= var_dump(filter_input(INPUT_POST, 'var', FILTER_DEFAULT , FILTER_REQUIRE_ARRAY));
}
Ovo je jako moćna i korisna funkcija.
REFERENCE:
http://php.net/manual/en/function.filter-input.php
http://php.net/manual/en/filter.filters.validate.php
http://php.net/manual/en/filter.filters.sanitize.php
http://php.net/manual/en/filter.filters.misc.php
http://php.net/manual/en/filter.filters.flags.php
|
|
|
|