|
Hinnavaatlus
:: Foorum
:: Uudised
:: Ärifoorumid
:: HV F1 ennustusvõistlus
:: Pangalink
:: Telekavad
:: HV toote otsing
|
|
| autor |
|
raido357
HV veteran
liitunud: 26.09.2002
|
16.10.2009 00:54:27
|
|
|
| Eespool olevad postitused on küll vanad aga miks mitte kasutada MySQL Improved varianti ja prepared statemente ?
|
|
| Kommentaarid: 78 loe/lisa |
Kasutajad arvavad: |
   |
:: |
0 :: |
0 :: |
70 |
|
| tagasi üles |
|
 |
keevitaja
AM 10 aastat

liitunud: 05.11.2001
|
16.10.2009 08:51:43
|
|
|
kuidas need käivad
_________________ Hinnavaatlus ei ole koht arvamuse avaldamiseks! |
|
| Kommentaarid: 51 loe/lisa |
Kasutajad arvavad: |
   |
:: |
1 :: |
3 :: |
40 |
|
| tagasi üles |
|
 |
keevitaja
AM 10 aastat

liitunud: 05.11.2001
|
16.10.2009 09:54:19
|
|
|
ja mis asjad täpselt need exceptionid on? manualis nagu natukene oli kirjas, kuid ei saa hästi pihta
_________________ Hinnavaatlus ei ole koht arvamuse avaldamiseks! |
|
| Kommentaarid: 51 loe/lisa |
Kasutajad arvavad: |
   |
:: |
1 :: |
3 :: |
40 |
|
| tagasi üles |
|
 |
andrusny
Kreisi kasutaja

liitunud: 20.03.2006
|
16.10.2009 10:07:08
|
|
|
Veateated.
_________________
 |
|
| Kommentaarid: 7 loe/lisa |
Kasutajad arvavad: |
   |
:: |
0 :: |
0 :: |
7 |
|
| tagasi üles |
|
 |
keevitaja
AM 10 aastat

liitunud: 05.11.2001
|
16.10.2009 10:59:51
|
|
|
exceptionitest veel. keegi oskab seletada throw, catch jne... manualis erit nagu kirjas pole.
kas üldiselt oleks parem neid kasutada, selle lihtsa die() asemel?
if(empty($this->text))
throw new Exception('jama'); |
see annab mulle sellise errori:
| Fatal error: Uncaught exception 'Exception' with message 'jama' in C:\xampp\htdocs\uus\kala.php:14 Stack trace: #0 C:\xampp\htdocs\uus\kala.php(19): Proov->ValidateText() #1 C:\xampp\htdocs\uus\kala.php(27): Proov->PrintText() #2 {main} thrown in C:\xampp\htdocs\uus\kala.php on line 14 |
_________________ Hinnavaatlus ei ole koht arvamuse avaldamiseks! |
|
| Kommentaarid: 51 loe/lisa |
Kasutajad arvavad: |
   |
:: |
1 :: |
3 :: |
40 |
|
| tagasi üles |
|
 |
mikk36
HV Guru

liitunud: 21.02.2004
|
|
| Kommentaarid: 85 loe/lisa |
Kasutajad arvavad: |
   |
:: |
0 :: |
2 :: |
78 |
|
| tagasi üles |
|
 |
keevitaja
AM 10 aastat

liitunud: 05.11.2001
|
16.10.2009 11:03:05
|
|
|
try {
echo inverse(5) . "\n";
echo inverse(0) . "\n";
} catch (Exception $e) {
echo 'Caught exception: ', $e->getMessage(), "\n";
} |
mis asja siin tehakse? try, catch jne
_________________ Hinnavaatlus ei ole koht arvamuse avaldamiseks! |
|
| Kommentaarid: 51 loe/lisa |
Kasutajad arvavad: |
   |
:: |
1 :: |
3 :: |
40 |
|
| tagasi üles |
|
 |
mikk36
HV Guru

liitunud: 21.02.2004
|
16.10.2009 11:23:27
|
|
|
Kui ühtegi exceptionit ei vista (viga), siis catch osa ei rakendu, kui visatakse exception, siis saad seda catch lõigu sees töödelda, antud juhul väljastatakse exceptioni sõnum (getMessage()).
Otsetõlkes on need kaks väljendit siis proovi ja püüa, kui ta ei suuda edukalt proovi lõiku teha, siis püütakse error kinni ja php scripti käivitumist ei peatata, saad kenasti kasutajale errori saata.
| tsitaat: |
| If an exception is not caught, a PHP Fatal Error will be issued |
|
|
| Kommentaarid: 85 loe/lisa |
Kasutajad arvavad: |
   |
:: |
0 :: |
2 :: |
78 |
|
| tagasi üles |
|
 |
inzinz
HV kasutaja
liitunud: 26.01.2005
|
16.10.2009 14:41:53
|
|
|
Umm, hetkel tundub see asi siin jalgratta leiutamisena ja mugavuse aknast väljaviskamisena et mingit huvitavat asja proovida.
Mis on näiteks häda sellel, et panna verifytext tagastama true ja false ja seda hiljem kontrollida ?
function verifyText() {
return !empty($this->text);
}
function printText() {
if(!$this->VerifyText()) echo 'tekst puudub';
else echo $this->text;
}
Antud moodus on ju palju mugavam ja loogilisem kirjutada kui nii:
function verifyText() {
if empty($this->text) throw new Exception('tekst puudub');
}
function printText() {
try{
$this->VerifyText();
echo $this->text;
}catch{
echo 'tekst puudub';
}
}
Exceptionitega koodi on palju raskem lugeda ja hiljem hallata. Exceptionitel on oma aeg ja koht, aga mingi taoline lihtlabane kontroll ei ole nüüd küll selline koht... (näiteks redirecti tegemine redirectexception klassiga ja selle püüdmisega on täitsa ok kasutus, aga iga pisikest kontrolli niimoodi "paremaks" teha üritades on suht pointless...)
_________________ Upload.ee - eestimaine failiupload |
|
| Kommentaarid: 4 loe/lisa |
Kasutajad arvavad: |
   |
:: |
0 :: |
0 :: |
4 |
|
| tagasi üles |
|
 |
keevitaja
AM 10 aastat

liitunud: 05.11.2001
|
16.10.2009 15:54:28
|
|
|
ma tegelt kirjutan siin ühe gd classi, kus siis tahan kontrollida, et $this->image mis on loodud imagecreatefrom abil on olemas!
kuna see peab 100% olema, siis die('pilt puudub!') oleks ok ja mingit muud keemiat vaja pole?
_________________ Hinnavaatlus ei ole koht arvamuse avaldamiseks! |
|
| Kommentaarid: 51 loe/lisa |
Kasutajad arvavad: |
   |
:: |
1 :: |
3 :: |
40 |
|
| tagasi üles |
|
 |
inzinz
HV kasutaja
liitunud: 26.01.2005
|
16.10.2009 20:21:10
|
|
|
No, minu meelest nii hardcore lähenemist ei ole ikka, et kuskil klassi sees teed die('käi kurele'); kui ühte pilti pole, kuna sellisel juhul sa pead seda klassi hakkama muuta kui tahad teist teksti kuvada jne. Ja kui tahad erinevat teksti kuvada eri kohtadest kasutades, siis on jälle jama majas.
Mõistlikum ja hiljem paremini kasutatav lahendus on see, et sa ise peale pildi laadimist ja enne klassi edasist kasutamist kontrollid läbi funktsiooni IsImageLoaded() {return !empty($this->image);} staatust vms. Niimoodi on põhiklass asjalik ja minimaalne, ja seda kasutav kood ise juba kontrollib ja majandab errorite või hoiatuste kuvamisega, või äärmisel juhul lihtsalt ignoreerib errorit ja proovib uuesti tegevust teha jne jne. Sa ei saa kõiki võimalikke erijuhte baasklassi toppida vaid ikkagi nende koht on seal koodis, mis seda baasklassi kasutab.
Kui on vajadus kasutajale html lehte ilusama error teatega näidata, siis klassi seest tulev die muudab selle võimatuks, aga kõrgemal koodis pildi laadimist kontrollides, on parem kontroll olukorra üle.
_________________ Upload.ee - eestimaine failiupload |
|
| Kommentaarid: 4 loe/lisa |
Kasutajad arvavad: |
   |
:: |
0 :: |
0 :: |
4 |
|
| tagasi üles |
|
 |
raido357
HV veteran
liitunud: 26.09.2002
|
18.10.2009 19:45:52
|
|
|
| keevitaja kirjutas: |
| kuidas need käivad |
SELECT:
$yhendus = new mysqli("localhost", "kasutaja1", "salasona1", "minuDB");
$kask = $yhendus->prepare("SELECT id, nimi, asi FROM naide");
$kask->bind_result($id, $nimeke $asjandus);
$kask->execute();
while($kask->fetch != NULL) {
echo $id." / ".$nimeke." / ".$asjandus
}
$yhendus->close();
|
INSERT:
$yhendus = new mysqli("localhost", "kasutaja1", "salasona1", "minuDB");
$kask = $yhendus->prepare("INSERT INTO naide (nimi) VALUES(?)");
$kask->bind_param("s", $_POST[uusNimi]); //s = string
$kask->execute();
$yhendus->close();
|
mysql_real_escape_string kasutus ei ole vajalik, sellisel viisil.
|
|
| Kommentaarid: 78 loe/lisa |
Kasutajad arvavad: |
   |
:: |
0 :: |
0 :: |
70 |
|
| tagasi üles |
|
 |
keevitaja
AM 10 aastat

liitunud: 05.11.2001
|
19.10.2009 10:22:23
|
|
|
no ma kasutan sqlit nii:
| php:
|
{ private $link; private function sformat($arg_list) { $query = $arg_list[0]; for($i = 1; $i < count($arg_list); $i++ ) $new_list[] = $arg_list[$i]; return $string; } public function connect() { } public function query($query) { } public function squery() { return $this->query($query); } public function assoc($sql) { } public function num_rows($sql) { } public function insert_id() { } } $db->connect(); $q = "select id from %s where name='%s'"; $r = $db->squery($q, $id, $name);
|
_________________ Hinnavaatlus ei ole koht arvamuse avaldamiseks! |
|
| Kommentaarid: 51 loe/lisa |
Kasutajad arvavad: |
   |
:: |
1 :: |
3 :: |
40 |
|
| tagasi üles |
|
 |
lehm2
Kreisi kasutaja

liitunud: 19.09.2004
|
19.10.2009 15:07:42
|
|
|
Aga milleks, leiutada ratast ?
_________________ Piilu siia, progreja!
Vajad abi Node.JS-ga ?
Võta ühendust ! |
|
| Kommentaarid: 15 loe/lisa |
Kasutajad arvavad: |
   |
:: |
0 :: |
0 :: |
13 |
|
| tagasi üles |
|
 |
Celos
Kreisi kasutaja

liitunud: 23.08.2005

|
19.10.2009 17:58:07
|
|
|
| lehm2 kirjutas: |
Aga milleks, leiutada ratast ?  |
Eks õppimise eesmärgil võib endale igasuguseid ülesandeid püstitada.
|
|
| Kommentaarid: 17 loe/lisa |
Kasutajad arvavad: |
   |
:: |
0 :: |
0 :: |
16 |
|
| tagasi üles |
|
 |
inzinz
HV kasutaja
liitunud: 26.01.2005
|
21.10.2009 11:08:48
|
|
|
| for($i = 1;$i < count($arg_list);$i++) $new_list[] = $arg_list[$i]; |
Antud koht lausa karjub SQL injectionit näkku
Korrektne oleks
| $new_list[] = mysql_real_escape_string($arg_list[$i]); |
Probleemiks siis kõige tavalisem user inputi usaldamine, näidiskood ärakasutamiseks:
//$_GET['name'] väärtuseks on: olematunimiplapla' union SELECT username,password FROM users WHERE id='2'#
$name = $_GET['name'];
$q = "select väli1,väli2 from mingitabel where name='%s'";
$r = $db->squery($q, $name);
//päring mis baasi tehakse on järgnev
//select väli1,väli2 from mingitabel where name='olematunimiplapla' union SELECT username,password FROM users WHERE id='2'#'
//# kommenteerib välja kõik järgnevad märgid mis muudab päringu stringi korrektseks
|
Antud näite põhjal valitakse baasist hoopis teisest tabelist väärtuseid kui progejal plaanis oli.
Mitte kunagi ei tohi inputi usaldada, pisut oskajama häkkeri kätes tähendab progejapoolne usaldavus veebilehe või lausa terve serveri metsa keeramist, olenevalt kui laialdaselt ja kui kriitilistes kohtades sellised input usaldamise kohad koodis levinud on
_________________ Upload.ee - eestimaine failiupload |
|
| Kommentaarid: 4 loe/lisa |
Kasutajad arvavad: |
   |
:: |
0 :: |
0 :: |
4 |
|
| tagasi üles |
|
 |
keevitaja
AM 10 aastat

liitunud: 05.11.2001
|
30.10.2009 19:32:25
|
|
|
mul nüüd lsb (alates PHP 5.3) küsimus:
| php:
|
<?php class A { public static function init ($one = '', $two = '') { $obj = new self; $obj->one = $one; $obj->two = $two; $obj-> static_text = static:: $text; return $obj; } public function output_text() { } } class B extends A { protected static $text = 'see on staatiline tekst'; } $b = B::init('see on esimine', 'see on teine'); echo "esimine: {$b->one}<br>teine: {$b->two},<br>static_text: {$b->static_text}<hr>"; $b->output_text(); ?>
|
kuhu kaob $b->output_text() väljastades see static::$text väärtus??? mis mul valesti on kirjutatud?
samas B::output_text(); jälle töötab
see kah on ok:
$b = new B;
$b->output_text(); |
_________________ Hinnavaatlus ei ole koht arvamuse avaldamiseks! |
|
| Kommentaarid: 51 loe/lisa |
Kasutajad arvavad: |
   |
:: |
1 :: |
3 :: |
40 |
|
| tagasi üles |
|
 |
keevitaja
AM 10 aastat

liitunud: 05.11.2001
|
30.10.2009 20:28:22
|
|
|
leidsin lahenduse! äkki kellelegi abiks:
public static function init($one = '', $two = '') {
$obj = new static; |
_________________ Hinnavaatlus ei ole koht arvamuse avaldamiseks! |
|
| Kommentaarid: 51 loe/lisa |
Kasutajad arvavad: |
   |
:: |
1 :: |
3 :: |
40 |
|
| tagasi üles |
|
 |
keevitaja
AM 10 aastat

liitunud: 05.11.2001
|
16.04.2010 15:52:26
|
|
|
SELECT:
$yhendus = new mysqli("localhost", "kasutaja1", "salasona1", "minuDB");
$kask = $yhendus->prepare("SELECT id, nimi, asi FROM naide");
$kask->bind_result($id, $nimeke $asjandus);
$kask->execute();
while($kask->fetch != NULL) {
echo $id." / ".$nimeke." / ".$asjandus
}
$yhendus->close();
|
$kask->bind_result($id, $nimeke $asjandus);
kas seda rida selliselt ei saaks kirjutada, et need väljade muutuja nimetused tekivad automaatselt väljade nimetuste järgi
_________________ Hinnavaatlus ei ole koht arvamuse avaldamiseks! |
|
| Kommentaarid: 51 loe/lisa |
Kasutajad arvavad: |
   |
:: |
1 :: |
3 :: |
40 |
|
| tagasi üles |
|
 |
mark11
HV vaatleja
liitunud: 28.01.2006
|
16.04.2010 18:18:05
|
|
|
function wrap_it($obj, $arr) { call_user_func_array(array($obj, "bind_result"), compact($arr)); }
$fields = array("id", "nimi", "asi");
$kask = $yhendus->prepare("SELECT " . implode($fields, ",") . " FROM naide");
wrap_it($kask, $fields);
|
põhimõtteliselt selline värk töötaks küll.
|
|
| Kommentaarid: 1 loe/lisa |
Kasutajad arvavad: |
   |
:: |
0 :: |
0 :: |
1 |
|
| tagasi üles |
|
 |
keevitaja
AM 10 aastat

liitunud: 05.11.2001
|
16.04.2010 20:32:33
|
|
|
krt, see tundub kuidagi liiga keeruline. siis võiks ise ju neid querysid kontrollida.
põmst ma tahaks ainult, et need queryd oleks prepared (eelvormindatud???). fetchida võiks ka muud muudi äkki?
_________________ Hinnavaatlus ei ole koht arvamuse avaldamiseks! |
|
| Kommentaarid: 51 loe/lisa |
Kasutajad arvavad: |
   |
:: |
1 :: |
3 :: |
40 |
|
| tagasi üles |
|
 |
keevitaja
AM 10 aastat

liitunud: 05.11.2001
|
22.04.2010 23:12:01
|
|
|
klge olete te kindel selle mysqli prepared statementide headuses? ma siin üritasin nüüd asjast sotti saada ja jõudsin sellisele tulemusele:
| php:
|
<?php class DB { function __construct() { $this->connection = new mysqli('localhost', 'root', '', 'test'); } function prep_query($query) { $this->stmt = $this->connection->prepare($query); } function bind_params($params) { $referenced_params = array(); foreach($params as $key => $value) { $referenced_params[] = &$params[$key]; $param_types .= $this->get_param_type($value); } $this->stmt->execute(); } function exec_query($query, $params) { $this->prep_query($query); $this->bind_params($params); } function get_param_type($param) { case 'integer': $param_type = 'i'; break; case 'double': $param_type = 'd'; break; case 'string': $param_type = 's'; break; default: $param_type = 'b'; break; } return $param_type; } } $db = new DB(); $db-> exec_query("insert into proov(yks, kaks) values(?, ?)", array('see ondsf proov', 43424234)); ?>
|
ma ei tea, kas nüüd on kõik nii nagu peab, aga igatahes muud moodi ma ei suutnud. eriti nõme on, et parameetrid peab muuta viideteks ja peab muutujate tüübid ette andma. muidugi see bindimine on ka oma olemuselt juba nõme
ehk siis selle minu klassi mõte on see, et ei peaks iga queryga mingit ullu lugulaulu kirjutama
edit: ja kui nüüd hakata veel mõtlema mark11 näite peale, kuidas resulte kätte saada, siis tuleb ikka päris nutu maitse suhu
või kus seda mysqli preparet krt kasutama peaks?
_________________ Hinnavaatlus ei ole koht arvamuse avaldamiseks!
viimati muutis keevitaja 23.04.2010 00:14:34, muudetud 1 kord |
|
| Kommentaarid: 51 loe/lisa |
Kasutajad arvavad: |
   |
:: |
1 :: |
3 :: |
40 |
|
| tagasi üles |
|
 |
nene
Kreisi kasutaja

liitunud: 20.03.2004
|
22.04.2010 23:30:50
|
|
|
| keevitaja kirjutas: |
| klge olete te kindel selle mysqli prepared statementide headuses? |
Puutusin ka kunagi kokku selle mysqli prepared statementidega. Peale mõningast mässamist jõudsin järeldusele, et nii haiget API-it pole lihtsalt võimalik normaalselt kasutada - lihtsam kui seda kasutada on kirjutada ise andmebaasiklass, mis neid prepared statemente sulle simuleerib kasutades lihtsaid tekstilisi päringuid. Seda ma ka toona tegin.
Ma arvan, et see mysqli liides on algselt kirjutatud C jaoks, kus kõik need viidad jms igati mõttekad on, ja siis on keegi hea inimene selle üks-ühele PHP-sse ringi pannud: tulemuseks on porno.
_________________ Mõistus otsas? Pane pinusse... |
|
| Kommentaarid: 24 loe/lisa |
Kasutajad arvavad: |
   |
:: |
0 :: |
1 :: |
23 |
|
| tagasi üles |
|
 |
keevitaja
AM 10 aastat

liitunud: 05.11.2001
|
23.04.2010 00:17:46
|
|
|
jumal tänatud. ma siin kartsin, et panin siin oma katsetamisega mööda täiega kuna väideti, et ma oma eelpool mainutud klassiga leiutan jalgratast...
see mysqli on pealegi veel bugine kah. näiteks long integeri peab sisestama stringina...
_________________ Hinnavaatlus ei ole koht arvamuse avaldamiseks! |
|
| Kommentaarid: 51 loe/lisa |
Kasutajad arvavad: |
   |
:: |
1 :: |
3 :: |
40 |
|
| tagasi üles |
|
 |
iceincube
HV veteran

liitunud: 18.11.2005
|
23.04.2010 22:54:13
|
|
|
Ma kasutaks ka muid asju.
Kuna kasutan ise Zend'i päris palju siis soovitan seda.
Samuti kavas doctrine'i proovida.
|
|
| Kommentaarid: 39 loe/lisa |
Kasutajad arvavad: |
   |
:: |
0 :: |
0 :: |
37 |
|
| tagasi üles |
|
 |
keevitaja
AM 10 aastat

liitunud: 05.11.2001
|
29.04.2010 21:54:12
|
|
|
no zend framework lihtsalt andmebaasiga suhtlemiseks vist oleks liiast... kui sa nüüd seda mõtlesid
_________________ Hinnavaatlus ei ole koht arvamuse avaldamiseks! |
|
| Kommentaarid: 51 loe/lisa |
Kasutajad arvavad: |
   |
:: |
1 :: |
3 :: |
40 |
|
| tagasi üles |
|
 |
iceincube
HV veteran

liitunud: 18.11.2005
|
29.04.2010 22:46:11
|
|
|
eks ta mõnes mõttes õige ole..
Ma toon sulle näite, kui tahad proovida...
//config fail
$dbCongig = array(
'adapter' => 'Pdo_Mysql',
'logindata' => array(
'host' => 'localhost',
'username' => '',
'password' => '',
'dbname' => ''
),
);
//bootstrap
set_include_path( '/usr/local/lib/ZendFramework/library' . PATH_SEPARATOR . get_include_path() );
require_once 'Zend/Db.php';
require_once 'Zend/Db/Table.php';
require_once 'Zend/Registry.php';
require_once 'Zend/Db/Table/Abstract.php';
$db = Zend_Db::factory($dbCongig['adapter'], $dbCongig['logindata']);
$db->query("SET NAMES 'utf8'");
Zend_Db_Table_Abstract::setDefaultAdapter($db);
//see osa kontrollerisse
$tTable = new Zend_Db_Table('minutabel'); //loome tabeli objekti
$data = array(
'date_inserted' => date('Y-m-d H:i:s')
);
$id = $tTable->insert( $data ); //sisestame uue rea
if($id){
echo 'inserted: ' . $id;
}
|
baasis peaks siis olema tabel nimega 'minutabel' väljaga 'date_inserted' ja mingi primary auto incremental key
viimati muutis iceincube 30.04.2010 00:49:51, muudetud 1 kord |
|
| Kommentaarid: 39 loe/lisa |
Kasutajad arvavad: |
   |
:: |
0 :: |
0 :: |
37 |
|
| tagasi üles |
|
 |
keevitaja
AM 10 aastat

liitunud: 05.11.2001
|
29.04.2010 23:28:57
|
|
|
ma kunagi midagi postitasin kah siia, aga hetkel olen kirjutanud selle klassi andmebaasiga suhtlemiseks:
| php:
|
<?php class MysqlDB { private $link; function __construct() { $this->open_connection(); } public function open_connection() { if(@! $this-> link = mysql_connect(SQL_HOST, SQL_USER, SQL_PASS )) { } } public function query($query) { return $result; } else { $error_msg = 'Mysql fatal error: ' . mysql_error() . '<br>'; $error_msg .= 'Last query: ' . $query; } } public function fetch_array($result) { } public function fetch_assoc($result) { } private function sformat($arg_list) { foreach($arg_list as $arg) { $new_list[] = $this->escape_value($arg); } return $string; } public function squery() { return $this->query($query); } public function insert_id() { } public function affected_rows() { } public function num_rows($result) { } public function escape_value($value) { } public function count_rows_from_table($table) { $result = $this->query("select count(*) from " . $table); return $count; } } ?>
|
$id = 7;
$db = new MysqlDB;
$result = $db->squery("select name from tabel where id='%s'", $id); |
ehk kellelegi abiks...
_________________ Hinnavaatlus ei ole koht arvamuse avaldamiseks! |
|
| Kommentaarid: 51 loe/lisa |
Kasutajad arvavad: |
   |
:: |
1 :: |
3 :: |
40 |
|
| tagasi üles |
|
 |
morgoth
HV kasutaja

liitunud: 14.01.2004
|
30.04.2010 00:06:45
|
|
|
IMO DB klassil võiks ka mingi error handling olla. Hea kuskile logisse salvestada, kui midagi nihu läheb, või transaktsioonile rollbacki teha.
Zend_Db_Table abil annab suht hästi table data gateway patterni kasutada: Extendid oma klassi sellest ning pärast on väga mugav andmeid muuta/lisada:
$data = $this->createRow();
$data->username = 'username';
$data->save();
|
Suht win ju.
|
|
| Kommentaarid: 11 loe/lisa |
Kasutajad arvavad: |
   |
:: |
0 :: |
0 :: |
10 |
|
| tagasi üles |
|
 |
keevitaja
AM 10 aastat

liitunud: 05.11.2001
|
30.04.2010 01:08:47
|
|
|
mul endal selline süsteem tehtud. aga alates PHP 5.3 late static bindinguga... kus siis esimine klass sisaldab funktsioone, ja teine siis extendib teda kus ma kirjeldan ära siis tabeli nime ja vajadusel siis custom funktsioonid. saab samuti teha näiteks:
$page = Pages::find_by_id(4);
$page->name = 'uus nimi';
$page->save();
uus kanne oleks siis
$page = new Pages;
$page->save();
<?php
class Pages extends DatabaseObject {
protected static $table_name = DB_PAGES;
}
?> |
_________________ Hinnavaatlus ei ole koht arvamuse avaldamiseks! |
|
| Kommentaarid: 51 loe/lisa |
Kasutajad arvavad: |
   |
:: |
1 :: |
3 :: |
40 |
|
| tagasi üles |
|
 |
keevitaja
AM 10 aastat

liitunud: 05.11.2001
|
28.05.2010 10:13:36
|
|
|
kas keegi viitsiks mulle seletada, mis point on abstract classidel. ma siin vaatasin manuali, kuid ei saa pihta, miks neid vaja on...
_________________ Hinnavaatlus ei ole koht arvamuse avaldamiseks! |
|
| Kommentaarid: 51 loe/lisa |
Kasutajad arvavad: |
   |
:: |
1 :: |
3 :: |
40 |
|
| tagasi üles |
|
 |
Ho Ho
HV Guru

liitunud: 16.02.2002
|
28.05.2010 17:11:15
|
|
|
Kui üldised OO põhimõtted selged ei tohiks aru saamine väga keerukas olla, kui ei ole selged siis pole vist eriti mõtet isegi üritada selgitada.
Sisuliselt abstraktne klass on selline klass, mida otseselt kusagil ei kasutata, see on ette nähtud ainult extendimiseks teiste klasside poolt. A'la midagi sellises stiilis (pseudokood c++ baasil):
abstract class Shape {
Type type();
int numPoints();
};
class Triangle extends Shape {
Type type() {
return Type::Triangle;
}
int numPoints() {
return 3;
}
};
class Square extends Shape {
Type type() {
return Type::Square;
}
int numPoints() {
return 4;
}
}; |
Edaspidi kirjutad koodi, mis tegeleb kõiksugu kujunditega siis kasutad üldiste operatsioonide jaoks abstraktset baasklassi ning saad endiselt kasutada kõiki sellest tuletatud klasside funktsioone. Baasklassi ennast ei saa otse luua. Koos kompilaatori poolt tehtavate lisakontrollidega peaks see tagama, et kõik abstraktses klassis defineeritud funktsioonid on kõigis sellest tuletatud klassides implementeeritud.
Alternatiivselt võib abstraktseid klasse ka interface'ks kutsuda, kui mälu ei peta siis Javas seda tehaksegi.
_________________ Teach a man to reason and he'll think for a lifetime
Common sense - so rare that it's a damn superpower
Vaadates paljude inimeste sõnavõtte siin ja mujal jääb üle ainult klassikuid tsiteerida - "I weep for humanity" |
|
| Kommentaarid: 106 loe/lisa |
Kasutajad arvavad: |
   |
:: |
0 :: |
1 :: |
86 |
|
| tagasi üles |
|
 |
Fukiku
Kreisi kasutaja

liitunud: 06.11.2003
|
28.05.2010 17:45:39
|
|
|
| Ho Ho kirjutas: |
| Alternatiivselt võib abstraktseid klasse ka interface'ks kutsuda, kui mälu ei peta siis Javas seda tehaksegi. |
Päris nii lihtne see ei ole, Java kontekstis on olemas nii liidesed (interface) kui abstraktsed klassid. Liidesed defineerivad ära portsu meetodeid millele antud liidest realiseeriv klass peab andma sisu. Abstraktne klass on klass, milles on meetodeid, mis on realiseerimata (e. puudub sisu) ja vajavad alamklassis realiseerimist ning meetodid, mis on juba realiseeritud (sisu on olemas). Liides on seega mõistlik kasutada mingi klassi omaduste kirjeldamiseks ja jätta realisatsioon täielikult arendaja teha, abstraktne klass juhul, kui sa soovid osa klassi omadustest ise ära realiseerida ning osa jätta arendajale tegemiseks. Tegin ka mingi pisikese Java põhise näite, mis ehk aitab ka üldisemas plaanis pärilusest ja muust seonduvast aru saada. Loodud on siis liides Loom, abstraktne klass Imetaja, mis defineerib ära midagi, mis on kõigil imetajail ühine ning konkreetne klass Kass, mis realiseerib kõik nõutud meetodid et tagada Loom'ale vajalik käitumine.
| java:
|
interface Loom { int leiaJalgadeArv(); boolean sööLoom(Loom ohver); boolean sööTaim(Taim ohver); } abstract class Imetaja implements Loom { // määrame sisu ainult ühele meetodile, sest tegemist on abstraktse klassiga // me ei pea kõike ise tegema public int leiaJalgadeArv() { // sest kõigil imetajail on neli jalga return 4; } } class Kass extends Imetaja { // siin realiseerime kõik, mis vaja, aga jalgade arvu uuesti tegema ei pea // see on Imetaja abstraktses klassis juba tehtud. // ühtlasi on ka see klass kasutatav igal pool kui Loom, sest läbi Imetaja // pärib ta Looma omadused public boolean sööLoom(Loom ohver) { // kass sööb teisi loomi return true; } public boolean sööTaim(Taim ohver) { // taimi ei söö return false; } return "mjäu"; } }
|
_________________ Foxic is just a simple fox
Enne kui sa küsid oma küsimuse - küsi seda vannipardilt! Rangelt soovitatav enne programmeerimise alafoorumisse uue teema tegemist. |
|
| Kommentaarid: 2 loe/lisa |
Kasutajad arvavad: |
   |
:: |
0 :: |
0 :: |
2 |
|
| tagasi üles |
|
 |
keevitaja
AM 10 aastat

liitunud: 05.11.2001
|
28.05.2010 18:55:39
|
|
|
ka php-s on olemas interfaced...
_________________ Hinnavaatlus ei ole koht arvamuse avaldamiseks! |
|
| Kommentaarid: 51 loe/lisa |
Kasutajad arvavad: |
   |
:: |
1 :: |
3 :: |
40 |
|
| tagasi üles |
|
 |
telefoon
HV vaatleja
liitunud: 05.05.2003
|
29.05.2010 12:54:17
|
|
|
Abstract class'i kasutamiseks peab tegema sellele alamklassi. Üks alamklass aga ei saa extendida mitut ülemklassi.
Interface'ga on aga nii, et üks klass võib implementeerida mitmeid interface'e. Selles mõttes on interface palju dünaamilisem.
|
|
| Kommentaarid: 7 loe/lisa |
Kasutajad arvavad: |
   |
:: |
0 :: |
0 :: |
7 |
|
| tagasi üles |
|
 |
blinx
HV vaatleja
liitunud: 28.11.2009
|
29.05.2010 20:12:57
|
|
|
Ei ole tõesti kiiruse vahet abstraktklasside meetoditel ja tavalistel.
_________________ 'Just buy everything then you're safe'
viimati muutis blinx 31.05.2010 00:20:21, muudetud 2 korda |
|
| tagasi üles |
|
 |
Ho Ho
HV Guru

liitunud: 16.02.2002
|
29.05.2010 23:17:56
|
|
|
| blinx kirjutas: |
Minuarust pole mõtet abstraktklasse ilmaasjata kasutada. Kui õigesti mäletan siis kaasneb sellega käitusaegne töötlusaja
pikenemine igas keeles. |
Ei tohiks olla mingist otsast keerulisem, kui hariliku klassi extendimine. Abstraktse klassi otse loomise kontroll tehakse ära kompileerimise ajal.
_________________ Teach a man to reason and he'll think for a lifetime
Common sense - so rare that it's a damn superpower
Vaadates paljude inimeste sõnavõtte siin ja mujal jääb üle ainult klassikuid tsiteerida - "I weep for humanity" |
|
| Kommentaarid: 106 loe/lisa |
Kasutajad arvavad: |
   |
:: |
0 :: |
1 :: |
86 |
|
| tagasi üles |
|
 |
keevitaja
AM 10 aastat

liitunud: 05.11.2001
|
29.05.2010 23:38:58
|
|
|
kas oleks võimalik saada klassi nimi ilma namespaceta kätte?
| php:
|
<?php //PHP 5.3.x namespace some\where; abstract class ParentClass { public static function name () { } public static function get_name () { } } class ChildClass extends ParentClass { } ChildClass::get_name(); ?>
|
tulemus mis ma tahan: childclass
tulemus mille saan: some\where\childclass
ja kas kuidagi saaks selle name() statilisse muutujasse kui ainult staatiline meetod on väljakutsutud?
edit: krt nüüd hakkasin ise mõtlema selle muutujasse saamise üle. sel juhul peaks nagu __construct käivituma kui statiline meetod välja kutsutakse... aga seda ju ei saagi juhtuda
_________________ Hinnavaatlus ei ole koht arvamuse avaldamiseks! |
|
| Kommentaarid: 51 loe/lisa |
Kasutajad arvavad: |
   |
:: |
1 :: |
3 :: |
40 |
|
| tagasi üles |
|
 |
keevitaja
AM 10 aastat

liitunud: 05.11.2001
|
30.05.2010 15:44:31
|
|
|
| morgoth kirjutas: |
IMO DB klassil võiks ka mingi error handling olla. Hea kuskile logisse salvestada, kui midagi nihu läheb, või transaktsioonile rollbacki teha.
|
mida sa selle all mõtled?
_________________ Hinnavaatlus ei ole koht arvamuse avaldamiseks! |
|
| Kommentaarid: 51 loe/lisa |
Kasutajad arvavad: |
   |
:: |
1 :: |
3 :: |
40 |
|
| tagasi üles |
|
 |
Fukiku
Kreisi kasutaja

liitunud: 06.11.2003
|
30.05.2010 23:56:23
|
|
|
| keevitaja kirjutas: |
| morgoth kirjutas: |
IMO DB klassil võiks ka mingi error handling olla. Hea kuskile logisse salvestada, kui midagi nihu läheb, või transaktsioonile rollbacki teha.
|
mida sa selle all mõtled? |
Milline osa arusaamatuks jääb, et mitte tervet maad ja ilma lahti seletada?
_________________ Foxic is just a simple fox
Enne kui sa küsid oma küsimuse - küsi seda vannipardilt! Rangelt soovitatav enne programmeerimise alafoorumisse uue teema tegemist. |
|
| Kommentaarid: 2 loe/lisa |
Kasutajad arvavad: |
   |
:: |
0 :: |
0 :: |
2 |
|
| tagasi üles |
|
 |
keevitaja
AM 10 aastat

liitunud: 05.11.2001
|
31.05.2010 00:24:54
|
|
|
põmst kogu see jutt. ehk siis mingeid erroried see klass ju vajadusel kuvab. kas oleks pigem passlikum need errorid kuhugi muutujasse panna? mida tähendab transaktsioonile rollback...
_________________ Hinnavaatlus ei ole koht arvamuse avaldamiseks! |
|
| Kommentaarid: 51 loe/lisa |
Kasutajad arvavad: |
   |
:: |
1 :: |
3 :: |
40 |
|
| tagasi üles |
|
 |
raido357
HV veteran
liitunud: 26.09.2002
|
31.05.2010 06:30:49
|
|
|
| keevitaja kirjutas: |
| ... mida tähendab transaktsioonile rollback... |
Seda, et enne enne kui lõplikult andmed andmebaasi kirjutatakse on võimalik seda tühistada.
A'la teed mingise INSERTI aga siis juhtub järgmises rakenduse faasis midagi ja siis saad tegevuse katkestada ja andmebaasist kah andmed kustutada, kasutades ROLLBACK käsku. Mitte ei pea hakkama DELETE statementi tekitama.
http://www.databasejournal.com/features/mysql/article.php/3382171/Transactions-in-MySQL.htm
|
|
| Kommentaarid: 78 loe/lisa |
Kasutajad arvavad: |
   |
:: |
0 :: |
0 :: |
70 |
|
| tagasi üles |
|
 |
Le Inc
HV Guru

liitunud: 06.09.2002
|
31.08.2011 07:56:10
|
|
|
Küsimus. Kas objekti meetoditest saab kuidagi "väljundit" kätte ilma return'ita. Ehk on meetod (funktisioon) mis teeb midagi tarka, kuid vahel võib ka viga tulla mis try ja catch kinni püütakse. Kui ma "echo" kirjutan siis see pritsitakse html, AGA tahaks kuskile muutujasse susata ja koodis "õiges kohas" uuesti välja lasta. Ainuke hetkel töötav variant on return susata ja sealt a la echo $klass->TereTore(); (// samal ajal käivitatakse funktsioon) kätte saada.
Kas saaks kuidagi teistmoodi ka?
|
|
| Kommentaarid: 56 loe/lisa |
Kasutajad arvavad: |
   |
:: |
0 :: |
0 :: |
54 |
|
| tagasi üles |
|
 |
jnt
HV Guru

liitunud: 10.05.2005
|
31.08.2011 07:58:43
|
|
|
& märk pane funktsiooni/meetodi argumendi ette. Siis muutes seda sees pool funktsiooni/meetodit muutub ka väljas pool see sama muutuja sisu. Lisaks olemas $_GLOBALS ja lihtsalt muutujate globaalseks tegemine.
_________________ Progemisest: https://byteaether.github.io/
Seisab keldris vana 386-486-Pentium1? Räägime! Ehk saan vanakesele uue elu anda.  |
|
| Kommentaarid: 116 loe/lisa |
Kasutajad arvavad: |
   |
:: |
2 :: |
0 :: |
107 |
|
| tagasi üles |
|
 |
Le Inc
HV Guru

liitunud: 06.09.2002
|
31.08.2011 08:09:59
|
|
|
| jnt kirjutas: |
| & märk pane funktsiooni/meetodi argumendi ette. Siis muutes seda sees pool funktsiooni/meetodit muutub ka väljas pool see sama muutuja sisu. Lisaks olemas $_GLOBALS ja lihtsalt muutujate globaalseks tegemine. |
Tänud proovin järgi.
Heh, leidsin just ka lahenduse. Tuleb uus meetod teha mis lihtsalt tagastab väärtuse.
function annaViga () {
return $this->error;
}
hiljem koodis echo $klass->annaViga();
|
|
| Kommentaarid: 56 loe/lisa |
Kasutajad arvavad: |
   |
:: |
0 :: |
0 :: |
54 |
|
| tagasi üles |
|
 |
jnt
HV Guru

liitunud: 10.05.2005
|
31.08.2011 08:13:09
|
|
|
Le Inc, muidugi saad klassis olevaid property'eid funktsiooni sees kasutada. Vaata ainult, et siis korraliku koodi mõistes klassis nood property'd ära ka defineerid.
Errorite jaoks võiks üldse üks staatiline error klass olla või veel enam, tee enda error handler ja siis lihtsalt trigger'dad erroreid ja su enda klass püüab nad kinni ja teeb, mida vaja.
_________________ Progemisest: https://byteaether.github.io/
Seisab keldris vana 386-486-Pentium1? Räägime! Ehk saan vanakesele uue elu anda.  |
|
| Kommentaarid: 116 loe/lisa |
Kasutajad arvavad: |
   |
:: |
2 :: |
0 :: |
107 |
|
| tagasi üles |
|
 |
Le Inc
HV Guru

liitunud: 06.09.2002
|
31.08.2011 08:30:16
|
|
|
Põmst trein üht klassi mis SOAP kaudu majandaks mobiil-id. Hetkel on plaanis piirduda ainult autentimisega, signeerimine jääb kunagi tulevikku, kui mul endal tekib selle järgi otsene vajadus.
Veakoodid mis tekivad SOAP päringust kutsuvad php Fatal Error'i välja (milleks!?). Ilma try ja catch jääks kood kinni. Hetkel olen veamajanduse array ära lahendanud (catch püüab SoapFault veastringi kinni), kus vastavale veakoodile on masiivis ka "tõlge".
Vististi on SK ka sarnasest koodist huvitatud (nende näide on PEAR põhine). Võimalik kui koodi valmis saan panen siisa üles, saate suuremad OOP kunnid üle kaeda (see mul esimene OOP moodi progemine). hetkel väga ei julge avalikult turule minna.
|
|
| Kommentaarid: 56 loe/lisa |
Kasutajad arvavad: |
   |
:: |
0 :: |
0 :: |
54 |
|
| tagasi üles |
|
 |
Erti-Chris
HV vaatleja

liitunud: 23.07.2011
|
31.08.2011 11:43:07
|
|
|
| Le Inc kirjutas: |
Põmst trein üht klassi mis SOAP kaudu majandaks mobiil-id. Hetkel on plaanis piirduda ainult autentimisega, signeerimine jääb kunagi tulevikku, kui mul endal tekib selle järgi otsene vajadus.
Veakoodid mis tekivad SOAP päringust kutsuvad php Fatal Error'i välja (milleks!?). Ilma try ja catch jääks kood kinni. Hetkel olen veamajanduse array ära lahendanud (catch püüab SoapFault veastringi kinni), kus vastavale veakoodile on masiivis ka "tõlge".
Vististi on SK ka sarnasest koodist huvitatud (nende näide on PEAR põhine). Võimalik kui koodi valmis saan panen siisa üles, saate suuremad OOP kunnid üle kaeda (see mul esimene OOP moodi progemine). hetkel väga ei julge avalikult turule minna.  |
http://php.net/manual/en/function.set-error-handler.php
püüab kõik errorid kinni..
|
|
| Kommentaarid: 1 loe/lisa |
Kasutajad arvavad: |
   |
:: |
0 :: |
0 :: |
1 |
|
| tagasi üles |
|
 |
|