Pregled koda za osnovu za php/mysql recnik

1

Pregled koda za osnovu za php/mysql recnik

offline
  • bocke  Male
  • Moderator foruma
  • Glavni moderator Linux foruma
  • Veliki Pingvin
  • Guru
  • Pridružio: 16 Dec 2005
  • Poruke: 12358
  • Gde živiš: Južni pol

Pozdrav svima. Smile 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 Wink):

+--------+---------+------+-----+---------+-------+ | 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. Smile



Registruj se da bi učestvovao u diskusiji. Registrovanim korisnicima se NE prikazuju reklame unutar poruka.
offline
  • PHP developer
  • Pridružio: 22 Mar 2006
  • Poruke: 3699
  • Gde živiš: 127.0.0.1

Prvo i osnovno: do not trust user input, sto ti upravo radis Wink 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;    }



offline
  • bocke  Male
  • Moderator foruma
  • Glavni moderator Linux foruma
  • Veliki Pingvin
  • Guru
  • Pridružio: 16 Dec 2005
  • Poruke: 12358
  • Gde živiš: Južni pol

Napisano: 14 Nov 2012 9:18

Rastafarii ::Prvo i osnovno: do not trust user input, sto ti upravo radis Wink Escape-uj sve sto dolazi od korisnika, jer nikad ne mozes da znas kakve su njegove namere. Vidi primer.

Namerno sam preskočio unos (postaviću kad odradim). Smile Taj deo ću preći kasnije. Za sada su svi podaci statički (nema korisničkog unosa), a sa strane čitam literaturu vezanu za sanitizaciju pa sam mislio da se na to bacim kad malo proučim (nisam hteo grlom u jagode, nego korak po korak). Wink

Rastafarii ::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;    }


Hvala za ovo. Smile

Dopuna: 14 Nov 2012 9:26

Ovo je neka literatura na koju sam bacio pogled:
http://www.slideshare.net/rosuaprins/software-security-vulnerabilityattack
http://www.slideshare.net/billkarwin/sql-injection-myths-and-fallacies

Drugi link sam našao na ES-u. Prvi traženjem po slideshareu.

offline
  • C# and PHP Developer
  • 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.

offline
  • bocke  Male
  • Moderator foruma
  • Glavni moderator Linux foruma
  • Veliki Pingvin
  • Guru
  • Pridružio: 16 Dec 2005
  • Poruke: 12358
  • 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.

offline
  • C# and PHP Developer
  • 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

offline
  • Pridružio: 10 Avg 2006
  • Poruke: 1009
  • Gde živiš: Beograd

U principu ja bih ti za ovako nešto preporučio MYSQLI. klasa koju si pisao za MYSQL ti onda više nije neophona jer je sam mysqli već objektno orijentisan. (A može i proceduralno da se koristi ukoliko je neophodno).

Što se tiče samog rada, sve je manje-više isto kao i kod MYSQL modula stim što MYSQLI ima neke dodatne mogućnosti:
http://stackoverflow.com/questions/1171344/advantages-of-mysqli-over-mysql

Dobra stvar kod mysqli su transakcije koje (ja mislim) mysql ne podržava? http://www.techrepublic.com/article/implement-mysq.....ns/6085922

offline
  • bocke  Male
  • Moderator foruma
  • Glavni moderator Linux foruma
  • Veliki Pingvin
  • Guru
  • Pridružio: 16 Dec 2005
  • Poruke: 12358
  • 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.

offline
  • soxxx 
  • Prijatelj foruma
  • Pridružio: 25 Maj 2005
  • Poruke: 1482
  • Gde živiš: Gracanica, Kosovo

Zanima me zasto nisi ostao na SQLite? Ne moras da dizes MySQL server. Smile

http://php.net/manual/en/book.sqlite.php

offline
  • 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 Smile

@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.

Ko je trenutno na forumu
 

Ukupno su 688 korisnika na forumu :: 31 registrovanih, 6 sakrivenih i 651 gosta   ::   [ Administrator ] [ Supermoderator ] [ Moderator ] :: Detaljnije

Najviše korisnika na forumu ikad bilo je 3466 - dana 01 Jun 2021 17:07

Korisnici koji su trenutno na forumu:
Korisnici trenutno na forumu: Arsenije, arzak, bigfoot, Brada i Gibanica, brundo65, Bubili, cikadeda, crnitrn, Drazenbg, Ehinacea, GogiA, gonzagbs, goran.vvv, Griffon vulture, Kriglord, Kristian_KG, Leonardo, Leonov, Ligavesh, mane123, MilosKop, Nemanja.M, opt1, Outis, repac, samocitam, Shinobi, Stoilkovic, tubular, vaso1, Vlajman1957