камрады, есть прогер, что то пишет, это что то вроде как то работает, поскольку никто толком в пхп ни бум бум то сложно понять по ушам товарищ ездит или кропотливо и качественно делает свою работу. как разобраться? может есть какой аудит признанный ?
igordata но тут ньюанс - жена то "отработать" может за плохо сваренный суп, а программер тут в проигрышном положении оказывается
Padaboo а.. ну я тогда, видать, не в курсе)) http://fc02.deviantart.net/fs44/f/2009/ ... nova84.jpg а этот чтото на путина у меня похож))))
камрады, как бы хочется денег платить за хорошую работу а не говнокод все таки мы не альтруисты хочется за вложенные деньги иметь КПД не 25% а 125% ))))) вобщем хочется лаконичное что то 1 гнат в шею и искать нового 2. вобщем то пойдет для сельской местности 3. да парень талантище ну или что то промежуточное между 2 и 3 ))) заранее спасибо ну вот самый маленьки cron.php я так разумею с кроном работает PHP: <?php class controller_cron extends controller_base { /** * Class entry point */ function cron() { $act = isset($_GET['act'])?$_GET['act']:false; switch($act) { case 'sendtextmsg': self::sendtextmsg(); break; case 'rates': self::rates(); break; } exit(); } /** * Add messages to sendtextmsg table */ function sendtextmsg() { $lang = lang::getmass(); $db = $this->registry['db']; //get msgs $msgs = $db->fetch_assoc('SELECT * FROM sendtextmsg_cron ORDER BY id ASC'); foreach($msgs as $msg) { $msg['timing'] = unserialize($msg['timing']); if($msg['timing']['type'] == 'one_time_repeat') { if($msg['timing']['date'] <= time() && $msg['timing']['repeat'] > $msg['send_count']) { $interval = $msg['timing']['interval'] * 60; if(($msg['send_last_time'] + $interval) < time()) //SEND! { //add messsage $q = 'INSERT INTO sendtextmsg (target, owner, text, repeatcount, sended) VALUES ('.$msg['target'].', '.$msg['owner'].', \''.$msg['text'].'\', '.$msg['repeatcount'].', \'f\')'; $db->query($q); //update msg $db->query('UPDATE sendtextmsg_cron SET send_count = send_count + 1, send_last_time = '.time().' WHERE id = '.$msg['id']); } } } elseif($msg['timing']['type'] == 'regular') { if($msg['timing']['date_from'] <= time() && $msg['timing']['date_to'] >= time()) { $interval = $msg['timing']['interval'] * 60; if(($msg['send_last_time'] + $interval) < time()) { //add messsage $q = 'INSERT INTO sendtextmsg (target, owner, text, repeatcount, sended) VALUES ('.$msg['target'].', '.$msg['owner'].', \''.$msg['text'].'\', '.$msg['repeatcount'].', \'f\')'; $db->query($q); //update msg $db->query('UPDATE sendtextmsg_cron SET send_count = send_count + 1, send_last_time = '.time().' WHERE id = '.$msg['id']); } } } } //send notify to control email exit('sendtextmsg called'); } /** * Get CBRF rates */ function rates() { $db = $this->registry['db']; $rates = $this->registry->getClass('rates'); //clean currency table $db->query('TRUNCATE TABLE curr_rates'); //get new rates $currencies = array(643 => 1); foreach($rates->rates->ValuteData->ValuteCursOnDate as $val) { //insert new rates $db->query('INSERT INTO curr_rates (vcode, vchcode, vcurs) VALUES ('.(int)$val->Vcode.', \''.$val->VchCode.'\', '.(float)$val->Vcurs.')'); //the array $currencies[(int)$val->Vcode] = (float)$val->Vcurs; } //get halls $halls = $db->fetch_assoc('SELECT * FROM hall'); foreach($halls as $hall) { $db->query('UPDATE hall SET currency = '.(float)$currencies[$hall['curr']].' WHERE id = '.$hall['id']); } //send notify to control email exit('rates called'); } } //endof class ?> хотя не факт что он писал сам - мог где нить скачать вот кусок кода из engine/base.php PHP: <?php abstract class controller_base { protected $registry; function __construct($registry, $id = 0) { $this->registry = $registry; $this->id = $id; $this->sess = $_SESSION['CFG_USER']; $this->arrDvesti = array (1, 256, 65536, 16777216 ); } function get_route() { $route = (empty ( $_GET ['route'] )) ? '' : $_GET ['route']; if (empty ( $route )) $route = 'online-models'; //$route = $_GET['route']; $route = trim ( $route, '/\\' ); $parts = explode ( '/', $route ); // Находим правильный контроллер //print_r($parts); return $alias = array_shift ( $parts ); } function protect($out, $arr = array()) { $lang = lang::getmass(); $_CFG_USER = $this->sess; if(!in_array($_CFG_USER['permission'], $arr)) return $lang['basefile_not_permission']; return $out; } function redirect($url) { exit(header('Location: '.site_url.'/'.$url)); } function get_text($id) { $db = $this->registry ['db']; $sql = "select `text` from `text` where `id`='$id'"; $result = $db->fetch_rows ( $sql ); return $result [0] ['text']; } это 100% он писал
ну и третий кусок да простите меня за длинную портянку но хотел какой нить модуль целиком бросить ибо за cron.php как уже писал я не уверен PHP: <?php class controller_gateway extends controller_base { /** * Allowed servers adresses - $_SERVER['REMOTE_HOST'] * * @var array */ private $allowedServers = array(); /** * Handle errors * * @var array */ private $errors = array(); /** * Hall data * * @var array */ private $_hallData = array(); /** * User data * * @var array */ private $_userData = array(); /** * Operator data * * @var array */ private $_operData = array(); /** * Request array * * @var array() */ private $reqData = array(); /** * Handle payment request from remote server */ public function payment_gateway() { $lang = lang::getmass(); $out = null; //Act if(isset($_GET['act'])) { switch($_GET['act']) { case 'user_add_money': $this->_actUserAddMoney($_POST); break; } } $this->_getAllowedServers(); //check server name if(!in_array($_SERVER['REMOTE_HOST'], $this->allowedServers)) $this->errors[] = $lang['gatefile_error1']; /* Check for requested data --------------------------------------*/ if(!isset($_POST['srv']) || ($_POST['srv'] != 'RU' && $_POST['srv'] != 'UA')) $this->errors[] = $lang['gatefile_error2']; if(!isset($_POST['pays']) || !ctype_digit($_POST['pays'])) $this->errors[] = $lang['gatefile_error3']; if(!isset($_POST['from']) || !ctype_digit($_POST['from'])) $this->errors[] = $lang['gatefile_error4']; if(!isset($_POST['operid']) || !ctype_digit($_POST['operid'])) $this->errors[] = $lang['gatefile_error5']; if(!isset($_POST['to']) || !ctype_digit($_POST['to'])) $this->errors[] = $lang['gatefile_error6']; if(!isset($_POST['hash']) || !isset($_POST['key'])) $this->errors[] = $lang['gatefile_error7']; /* Handle request ------------------------------------*/ $this->_handleRequest(); if(!empty($this->errors)) $out = 'res=error&errors='.serialize($this->errors); else $out = 'res=ok'; print_r($out); exit(); } /** * Get allowed server names from console config */ private function _getAllowedServers() { $this->allowedServers[] = ''; //allow from all } /** * Trying to halnde request and process payment_gateway */ private function _handleRequest() { $lang = lang::getmass(); if(empty($this->errors)) { //get db $db = $this->registry['db']; //set up request data $this->reqData['srv'] = $_POST['srv']; $this->reqData['summ'] = (int)$_POST['pays']; $this->reqData['hall'] = (int)$_POST['from']; $this->reqData['operid']= (int)$_POST['operid']; $this->reqData['user'] = (int)$_POST['to']; $this->reqData['hash'] = $_POST['hash']; $this->reqData['key'] = $_POST['key']; /* Check user, hall and operator -------------------------------------------*/ $this->_getData(); if(empty($this->_userData)) { $this->errors[] = $lang['gatefile_error14']; return; } if(empty($this->_userData)) { $this->errors[] = $lang['gatefile_error8']; return; } if(empty($this->_operData)) { $this->errors[] = $lang['gatefile_error9']; return; } //check for op_id = hall op_id $q = 'SELECT idhall FROM hall_operators WHERE idoperator = '.$this->reqData['operid']; $halls = array(); $a = $db->fetch_assoc($q); foreach($a as $t => $row) $halls[] = $row['idhall']; if(!in_array($this->reqData['hall'], $halls)) { $this->errors[] = $lang['gatefile_error10']; return; } //check hash $generatedHash = md5('srv='.$this->reqData['srv'].' pays='.$this->reqData['summ'].' from='.$this->reqData['hall'].' operid='.$this->reqData['operid'].' to='.$this->reqData['user'].' key='.$this->reqData['key']); if($generatedHash != $this->reqData['hash']) { $this->errors[] = $lang['gatefile_error11']; return; } /* Change balance -------------------------------------------*/ $balance = $this->reqData['summ']; //generate ticket $secretkey = self::generation(); $query = 'SELECT tid FROM tickets WHERE secretkey=\''.$secretkey.'\''; $db->query($query); while( $db->num_rows() || strlen( $secretkey ) < 10 ) { $secretkey = self::generation(); $query = 'SELECT tid FROM tickets WHERE secretkey=\''.$secretkey.'\''; $db->query($query); } //calculate new balance $query = 'SELECT balance, roomnumber FROM users WHERE uid='.$this->reqData['user']; $terminalbalance = $db->fetch_assoc($query); $terminalbalance = $terminalbalance[0]; $newbalance_t = $newbalance = $terminalbalance['balance'] + $balance; $roomnumber = $terminalbalance['roomnumber']; if($balance < $this->_hallData['minamount']) { $this->errors[] = $lang['gatefile_error12']; return; } if($balance > $this->_hallData['balance']) { $this->errors[] = $lang['gatefile_error13']; return; } //insert ticket and payment $q = 'INSERT INTO tickets ( creator, balance, secretkey, active, cancelby ) VALUES ('.$this->reqData['operid'].', '.$balance.', \''.$secretkey.'\', 3, '.$this->reqData['user'].')'; $db->query($q); $q = 'INSERT INTO payments ( uid, payment ) VALUES ( '.$this->reqData['user'].', '.$balance.' );'; $db->query($q); //update operator and hall balance $this->_operData['balance'] += $balance; $q = 'UPDATE administrators SET balance = '.$this->_operData['balance'].' WHERE aid = '.$this->_operData['aid']; $db->query($q); $q = 'UPDATE hall SET balance = balance-'.$balance.' WHERE id = '.$roomnumber; $db->query($q); //insert payment /* $qPayment = 'UPDATE users SET balance = (balance + '.$this->reqData['summ'].') WHERE id = '.$this->reqData['user']; */ //$db->query($qPayment); // insert history data $qHistory = 'INSERT INTO remote_payments (pdate, ip, hall_id, user_id, oper_id, summ) VALUES ('.mktime().', \''.$_SERVER['REMOTE_ADDR'].'\', '.$this->reqData['hall'].', '.$this->reqData['user'].', '.$this->reqData['operid'].', '.$this->reqData['summ'].') '; $db->query($qHistory); } } /** * Get hall and user data */ private function _getData() { $db = $this->registry['db']; //get hall $qHall = 'SELECT * FROM hall WHERE id = '.$this->reqData['hall'].' AND secret_code = \''.$this->reqData['key'].'\' '; if($db->num_rows($qHall) > 0) { $hdata = $db->fetch_assoc($qHall); $this->_hallData = $hdata[0]; } else return; //hall not exist //check for op_id = hall op_id $qOper = 'SELECT * FROM administrators WHERE aid = '.$this->reqData['operid']; if($db->num_rows($qOper) > 0) { $opdata = $db->fetch_assoc($qOper); $this->_operData = $opdata[0]; } else return; //get user $qUser = 'SELECT * FROM users WHERE uid = '.$this->reqData['user']; if($db->num_rows($qUser) > 0) { $udata = $db->fetch_assoc($qUser); $this->_userData = $udata[0]; } } function _actUserAddMoney($PaymentSystemResponse) { $log = "answer: ".print_r($PaymentSystemResponse, 1)."\r\nxml: ".base64_decode($PaymentSystemResponse['operation_xml']); $filename = ROOT_PATH.'public/'.time().'.txt'; file_put_contents($filename, $log); chmod($filename, 0777); $db = $this->registry['db']; $lang = lang::getmass(); if(!isset($_GET['uid']) || !ctype_digit($_GET['uid']) || !isset($_GET['hid']) || !ctype_digit($_GET['hid'])) exit('Incorrect user id or hall id'); //hall data $hall = $db->fetch_assoc('SELECT * FROM hall WHERE id = '.(int)$_GET['hid']); $hallData = $hall[0]; $response = array( 'merchant_id' => null, 'order_id' => null, 'amount' => null, 'currency' => null, 'description' => null, 'status' => null, 'code' => null, 'transaction_id'=> null, 'pay_way' => null, 'sender_phone' => null, ); $xml_string = base64_decode($PaymentSystemResponse['operation_xml']); $got_signature = $PaymentSystemResponse['signature']; $Xml = simplexml_load_string($xml_string); if (!$Xml) { exit('Invalid XML received'); } foreach ($Xml->children() as $k => $node) { if (array_key_exists($k, $response)) { $response[$k] = (string)$node; } } $expected_signature = base64_encode( sha1( $hallData['merch_sign'] . $xml_string . $hallData['merch_sign'], true ) ); //check for payment $extOrder = $db->fetch_assoc('SELECT * FROM visa_log WHERE order_id = \''.$response['order_id'].'\''); if(empty($extOrder) || $extOrder[0]['status'] != 'process') exit('Payment already successed'); list($invoice_id, $user_id) = explode(':', $response['order_id']); if ($invoice_id < 1 || $user_id < 1 || $expected_signature !== $got_signature) exit('Incorrect result data'); if($response['status'] == 'success') { $amount = (float)$response['amount'] * 100; //add balance to user /* $db->query('UPDATE users SET balance = balance + '.$amount.' WHERE uid = '.(int)$user_id ); //delete from hall $db->query('UPDATE hall SET balance = balance - '.$amount.' WHERE id = '.(int)$_GET['hid'] );*/ //--------------------------------- // Increase user balance //--------------------------------- $roomnumber = (int)$_GET['hid']; //hall id compability $terminalid = $user_id; //user id compability $balance = $amount; //entered balance $_CFG_USER['userid'] = $hallData['creatorid']; $secretkey = parent::generation(); $query = 'SELECT tid FROM tickets WHERE secretkey=\''.$secretkey.'\''; while( $db->num_rows($query) || strlen( $secretkey ) < 10 ) { $secretkey = $this->generation(); $query = 'SELECT tid FROM tickets WHERE secretkey=\''.$secretkey.'\''; } //увеличиваем баланс терминала $query = 'SELECT balance,roomnumber FROM users WHERE uid='.$terminalid; $terminalbalance = $db->fetch_rows($query); $terminalbalance = $terminalbalance[0]; $newbalance_t = $newbalance = $terminalbalance[0] + $balance; $roomnumber = $terminalbalance[1]; /*if(($balance/100) < $this->get_hall_minamount($roomnumber)) { exit('Less than min hall amount'); } if(($balance) > $this->get_hall_balance($roomnumber)) { exit('Too low hall balance'); } */ //пишем тикет как уже активированный юзером $terminalid - статус 3 $query = 'INSERT INTO tickets ( creator, balance, secretkey, active, cancelby ) VALUES (\''.$_CFG_USER['userid'].'\', '.$balance.', \''.$secretkey.'\', 3, '.$terminalid.')'; $db->query($query); //------------------------------------ // Add bonus money //------------------------------------ $sql = 'SELECT mbonus,pbonus from hall where id = (select roomnumber from users where uid = '.$terminalid.' limit 1)'; $bonusres = $db->fetch_rows( $sql ); $bonusmoney = 0; if( $bonusres ) { $mbonus = $bonusres[0][0]; $pbonus = $bonusres[0][1]; if( $balance/100 > $mbonus ) $bonusmoney = ( $balance * $pbonus ) / 100; else $bonusmoney = 0; } else $bonusmoney = 0; $query = 'INSERT INTO payments ( uid, payment, bonus ) VALUES ( '.$terminalid.', '.$balance.', '.$bonusmoney.' )'; $db->query($query); /* увеличиваем текущий баланс РЅР° операторе $newbalance = $_CFG_USER['balance']; $newbalance += $balance; $_CFG_USER['balance'] = $newbalance; $_SESSION['CFG_USER'] = $_CFG_USER; //$query = 'UPDATE administrators SET balance='.$_CFG_USER['balance'].' WHERE aid='.$_CFG_USER['userid']; //$db->query($query); */ $query = 'UPDATE hall SET balance=balance-'.$balance.' WHERE id='.$roomnumber; $db->query($query); //$this->write_log(22, 'terminal: '. $this->get_user_name($terminalid) . ' , new balance: ' . $this->balance_to_rubles($newbalance_t)); //--------------------------------- // Update VISA log //--------------------------------- $db->query('UPDATE visa_log SET status = \'success\' WHERE order_id = \''.$response['order_id'].'\' '); exit('Payment success'); } elseif($response['status'] == 'wait_secure') { exit('Awating for payment'); } else { $db->query('UPDATE visa_log SET status = \'failure\' WHERE order_id = \''.$response['order_id'].'\' '); exit('Payment failure'); } } /** * Get CBRF rates function rates() { $db = $this->registry['db']; $rates = $this->registry->getClass('rates'); //clean currency table $db->query('TRUNCATE TABLE curr_rates'); //get new rates $currencies = array(643 => 1); foreach($rates->rates->ValuteData->ValuteCursOnDate as $val) { //insert new rates $db->query('INSERT INTO curr_rates (vcode, vchcode, vcurs) VALUES ('.(int)$val->Vcode.', \''.$val->VchCode.'\', '.(float)$val->Vcurs.')'); //the array $currencies[(int)$val->Vcode] = (float)$val->Vcurs; } //get halls $halls = $db->fetch_assoc('SELECT * FROM hall'); foreach($halls as $hall) { $db->query('UPDATE hall SET currency = '.(float)$currencies[$hall['curr']].' WHERE id = '.$hall['id']); } exit(); }*/ } ?>
progman_rus по поводу первого куска Это все он писал, что тут можно сказать, он знает mvc, приводит типы, оптимизирует работу со строками из минусов не придерживается определенного стиля в задании имен переменных и функций (но это качество работы кода никак не сказывается) Покажите лучше какой нибудь контроллер controller_что то, только не index
ну вот еще контроллер logs.php PHP: <?php class controller_logs extends controller_base { /** * * Class router */ function logs() { $arguments = self::_parseArguments(); switch($argumenets['act']) { case 'halls': self::_showHallList(); break; case 'users': self::_showUserList(); break; case 'logs': self::_showLogList(); break; case 'game': self::_showGame(); break; } } function _parseArguments() { $args = array(); if(isset($this->registry['arguments'][0]) && !empty($this->registry['arguments'][0])) { $args['act'] = 'users'; $hallid = explode('-', $this->registry['arguments'][0]); $args['hallid'] = parent::dsCrypt($hallid[1], 1); } else $args['act'] = 'halls'; if(isset($this->registry['arguments'][1])) { $args['act'] = 'logs'; $userid = explode('-', $this->registry['arguments'][1]); $args['userid'] = parent::dsCrypt($userid[1], 1); } if(isset($this->registry['arguments'][2])) { $args['act'] = 'game'; $gameid = explode('-', $this->registry['arguments'][2]); $args['gameid'] = parent::dsCrypt($gameid[1], 1); } return $args; } /** * Show hall list for logs */ function _showHallList() { } } ?>
Apple я просто пока отправлял небыло еше progman_rus PHP: <?php if(!isset($_POST['srv']) || ($_POST['srv'] != 'RU' && $_POST['srv'] != 'UA')) $this->errors[] = $lang['gatefile_error2']; if(!isset($_POST['pays']) || !ctype_digit($_POST['pays'])) $this->errors[] = $lang['gatefile_error3']; if(!isset($_POST['from']) || !ctype_digit($_POST['from'])) $this->errors[] = $lang['gatefile_error4']; if(!isset($_POST['operid']) || !ctype_digit($_POST['operid'])) $this->errors[] = $lang['gatefile_error5']; if(!isset($_POST['to']) || !ctype_digit($_POST['to'])) $this->errors[] = $lang['gatefile_error6']; if(!isset($_POST['hash']) || !isset($_POST['key'])) $this->errors[] = $lang['gatefile_error7']; еше не пришел к универсальной обработке форм, но уже близок (скоро ему это должно надоесть )) да нормально все, в принципе, смотря как давно эти куски были написаны, скорее всего сейчас лучше пишет самописная система, человек сам думает/развивается сколько платите ему если не сикрет?
да не секрет, 35 штук, сидит дома на удаленке ну пишет уже 3й или 4й месяц. ну в целом ясно - значит по чисто писанию зачот, спасибо успокоил ;-)
Кавайно по-ходу mysqli, это хорошо. считается, что вместо такого приведения лучше делать проверку и если не тот - выводить ошибку и что убивать скрипт внутри класса - плохо. Хотя если это у вас скрипт, который должен быть вызван удаленно другим скриптом и получить простой ответ - почему бы и нет. имена классов по-соглашению пишутся с большой буквы. Куски закомментированного кода - мусор, который признак того, что программист не уверен, что сейчас все правильно. Хотя на стадии разработки тоже не страшно. Грубых ошибок нет.
[vs] спасибо за коммент. возможно то что закоментарено писал другой программист. когда он к нам пришел, старый прогер процентов 10 написал там кода. или мы сменили какие то условия по ходу пьессы.
progman_rus можно конечно лучше, но для этого нужно уделить намного больше времени самой основе системы, для этого быть nolife задротом и фанатиком типа меня либо иметь больший опыт