Poslao: 14 Nov 2012 04:28
|
offline
- bocke
- Moderator foruma
- Glavni moderator Linux foruma
- Pridružio: 16 Dec 2005
- Poruke: 12524
- Gde živiš: Južni pol
|
Pozdrav svima. Pokušavam da se naučim PHP i za sad mi ide prilično ok. Ono što bi mi trebalo je savet iskusnijih i ukazivanje na moguće loše prakse u već postojećem kodu. Inače, sam kod radi i tu nema problema.
O primeru
U pitanju je osnova za mali dvosmerni rečnik zasnovan na bazi pozajmljenoj iz SerbDict rečnika. Rečnik koristi jednu SQL tabelu koja je unapred data (nisam se trudio da reorganizujem bazu i u ovom trenutku me taj deo ne zanima ):
+--------+---------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+--------+---------+------+-----+---------+-------+
| IdKey | int(11) | NO | PRI | NULL | |
| jezik | text | YES | | NULL | |
| rec | text | YES | | NULL | |
| prevod | text | YES | | NULL | |
+--------+---------+------+-----+---------+-------+
Kod
Kod je podeljen na dva dela:
setup.php sadrži definicije sledećih varijabli: $database, $server, $user, $pass.
recnik.php je izlistan u donjem delu.
<?php
require 'setup.php';
class mysql {
public $database;
public $server;
public $user;
public $pass;
protected $session;
protected $result;
function connect(){
$this->session = mysql_connect($this->server, $this->user,
$this->pass);
if(! $this->session)
{
die('Connection error: ' . mysql_error());
}
$this->select_db();
}
function close(){
mysql_close($this->session);
}
function select_db(){
mysql_select_db($this->database, $this->session) or
die (mysql_error());
}
function query_select_where($what, $table, $condition){
$this->result = mysql_query ("SELECT $what FROM $table
WHERE $condition") or die(mysql_error());
}
}
class dictionary extends mysql{
public $language;
public $word;
public $translation;
protected $table;
function __construct(){
$this->table = "recnik";
}
private function make_condition($term){
$condition = "jezik='$this->language' AND rec regexp '^$term.*'";
return $condition;
}
function search($term){
$condition = $this->make_condition($term);
$this->query_select_where('*', $this->table, $condition);
}
function show_results(){
while ($row = mysql_fetch_array($this->result))
{
echo $row['jezik'].'|'.$row['rec'].'|'.$row['prevod']."\n";
}
}
}
$recnik = new dictionary;
$recnik->server = $server;
$recnik->database = $database;
$recnik->user = $user;
$recnik->pass = $pass;
$recnik->language = 'Sr';
$recnik->connect();
$recnik->search("recnik");
$recnik->show_results();
$recnik->close();
?>
Primer radi:
~> php recnik.php
će dati izlaz:
Sr|Recnik Sinonima|Thesaurus
Sr|Recnik|Vocabulary, Glossary, Dictionary, Lexicon
Da ponovim: trebaju mi saveti i ukazivanje na potencijalne loše prakse u kodu. Kad već učim da naučim kako treba.
|
|
|
Registruj se da bi učestvovao u diskusiji. Registrovanim korisnicima se NE prikazuju reklame unutar poruka.
|
|
Poslao: 14 Nov 2012 08:38
|
offline
- Rastafarii
- Moderator foruma
- Pridružio: 22 Mar 2006
- Poruke: 3760
- Gde živiš: 127.0.0.1
|
Prvo i osnovno: do not trust user input, sto ti upravo radis Escape-uj sve sto dolazi od korisnika, jer nikad ne mozes da znas kakve su njegove namere. Vidi primer.
Drugo, cini mi se da ti onaj regexp u uslovu nije neophodan.
Citat:MySQL’s REGEXP function is handy when you need to search for specific text strings within a textual column, but over large record sets, it’s performance can be less than fantastic.
The query using LIKE turned out the same results as the query using REGEXP, only it was at least 10 times faster.
private function make_condition($term){
$condition = "jezik='$this->language' AND rec regexp '^$term.*'";
return $condition;
}
postaje
private function make_condition($term){
$condition = "jezik='$this->language' AND rec LIKE '%$term%'";
return $condition;
}
|
|
|
|
|
Poslao: 14 Nov 2012 13:35
|
offline
- Pridružio: 16 Feb 2011
- Poruke: 1630
- Gde živiš: Pancevo
|
Jos nesto, radio sam u jednoj vecoj grupi/organizaciji na jednom projektu ORM-a. To su ljudi koji samo forsiraju OOP.. Ok ti ide ali probaj malo vise da bacas exception zanemari to die u oop i to echo.
|
|
|
|
Poslao: 19 Nov 2012 01:26
|
offline
- bocke
- Moderator foruma
- Glavni moderator Linux foruma
- Pridružio: 16 Dec 2005
- Poruke: 12524
- Gde živiš: Južni pol
|
Napisano: 14 Nov 2012 19:46
Hvala Ikac. Baciću pogled na exceptione. Poznat mi je koncept, ali nisam radio ništa ozbiljno u OOP jezicima. moja pozadina je uglavnom vezana za C i funkcionalno programiranje. Zato sada i malo forsiram OOP - da ne bi ostalo ništa nejasno.
Dopuna: 19 Nov 2012 0:43
PHP.net preporučuje mysqli ili pdo umesto mysql funkcija. Što se tiče sanitizacije, i tu se preporuke menjaju svako malo. Meni malo smeta što se umesto pominjanja konkretnih rizika i problema pojedinih pristupa, pokušava izreklamirati "jedan pravi način". Lokacije koje se bave web sigurnošću (nasuprot lokacija koja se bave web razvojem) pominju ceo toolset za zaštitu i njihove mane/prednosti. Takođe opisuju i skup najčešćih siguronosnih problema (i/ili gde se oni sve mogu desiti), kao i neretko i preporuke za njihovo rešavanje.
Btw, kažu da je teže sanitizovati izraz koji koristi LIKE (ako se u njega umeće korisnički ulaz), nego kod dobro formiranih regexa.
Gledao sam malo i kako to rade poznatije web aplikacije. One obično imaju svoju implementaciju DB apstrakcije. Napr Joomla ima DB framework "drajvere" i za mysql, i za mysqli i za PDO. Ali, recimo, oni za sanitizaciju MySQL unosa koriste mysql(i)_real_escape koji po PHP.NET nije preporučen (bez jasnijeg obrazloženja). Na drugoj lokaciji sam našao informaciju da je za ovu funkciju potrebno prethodno definisati encoding. Joomla koristi UTF-8 i skup funkcija za manipulaciju utf8 stringova iz phputf8 biblioteke.
Elem, u ovom trenutku sam malo overloadovan informacijama... Mislim da je u ovom trenutku najbolje napraviti nešto što radi i videti kako to funkcioniše bez stavljanja negde "van" (test mašina) čisto da se sažvaču svi osnovni koncepti, a zatim kantirati taj kod i reimplementirati sve ispočetka imajući u vidu tačno definisane rizike: gde se umeće korisnički ulaz, koji je rizik toga i na koji način je to moguće na najbolji način sanitizovati.
Mislim, džaba bilo koje sanitizacije ako ti prvo ne razumeš kod koji odrađuje posao i koji su njegovi rizici.
Btw, DB apstrakcija u Joomli je vrlo lepo napisana (pogotovo u Joomli 3.0.x), tako da taj kod predstavlja fin i razumljiv primer.
Dopuna: 19 Nov 2012 1:26
Više informacija o dostupnim MySQL API-jima u PHP-u: http://www.php.net/manual/en/mysqlinfo.api.choosing.php. Elem, pošto mysql interfejs uskoro odlazi u penziju, ostaju samo mysqli i pdo. Naravno, ako je na serveru PHP 5.1 ili noviji.
|
|
|
|
Poslao: 19 Nov 2012 14:26
|
offline
- Pridružio: 16 Feb 2011
- Poruke: 1630
- Gde živiš: Pancevo
|
Napisano: 19 Nov 2012 14:18
Neznam MySQL bih ti preporucio na ovoj applikaciji. Nije nesto velika aplikacija pa da ti je potrebno nesto naprednije i glomaznije. Sto manje koda to ce posle manje glava da te boli.
Ja za manje applikacije uvek koristim MySQL API dok ako radim neki Framework ili CMS onda PDO.
Sto se tice svega ovoga moj savet je svima koji imaju iskustva sa OOP da se nezezaju i da pisu svoje klase jer nikada nece ih napisati tako kvalitetno i sigurno.
Zato http://www.doctrine-project.org radi svoj posao i to vise nego sto mozete zamisliti. Ja sam uz pomoc njega na ELANCE uzeo para i para.
Dopuna: 19 Nov 2012 14:26
Eo jedan video nas covek je radio moj kolega sve u doctrine pa uporedi ovu relaciju sa ostalim pa ces uociti sta je prakticnije i lakse.
Dopuna: 19 Nov 2012 14:26
http://www.youtube.com/watch?v=wmylHbHFf2E
|
|
|
|
|
Poslao: 20 Nov 2012 08:53
|
offline
- bocke
- Moderator foruma
- Glavni moderator Linux foruma
- Pridružio: 16 Dec 2005
- Poruke: 12524
- Gde živiš: Južni pol
|
Hvala. Video sam da mysqli ima i objektni interfejs. Sintaksa je u principu dosta slična.
Inače, ovo bi trebalo kasnije da ima i urednički/admin deo za izmenu/dopunu reči. U stvari taj deo je važniji od samog rečnika. Meni je bio cilj da se malo sredi baza koju koristi SerbDict i da to može da uradi više ljudi. Najjednostavniji način je preko nekog web interfejsa.
A ovo u početku je bila više vežba. Međutim, ja sam tu preterao sa literaturom. Umesto da ovo bude jednostavna aplikacija koja pravi upit u bazi, ja sam u isto vreme gledao i za sesije i login (kao i sanitizaciju/zaštitu). Tako da je u trenutku nastao overload informacija.
|
|
|
|
|
Poslao: 20 Nov 2012 12:38
|
offline
- igorpan
- Super građanin
- Pridružio: 10 Avg 2006
- Poruke: 1009
- Gde živiš: Beograd
|
@bocke Jeste admin deo najvažniji, što i ima logike. Admin deo mora da: dodaje informacije,briše informacije,manja informacije, a da bi sve to mogao da radi mora i da prikazuje informacije, dok javni deo u 99% slučajeva treba samo da ih prikaže
@soxxx Ako pravi rečnik mnooooooooogo mu je bolje da se drži MySQL-a ako ni zbog čega drugog onda zbog brzine kada baza bude nosila veliki broj reči.
|
|
|
|