Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/topic.php on line 737
Форумы портала PHP.SU :: Идиотская ошибка!

 PHP.SU

Программирование на PHP, MySQL и другие веб-технологии
PHP.SU Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи


 Страниц (1): [1]   

> Описание: ООП, include, статические методы
XuPoH
Отправлено: 19 Марта, 2014 - 16:14:46
Post Id


Новичок


Покинул форум
Сообщений всего: 8
Дата рег-ции: Март 2014  


Помог: 0 раз(а)




Вообщем. Суть такова:
Имеется индексная страница такого содержания:
PHP:
скопировать код в буфер обмена
  1. <?PHP
  2. ini_set("display_errors", true);
  3. include('system/include.php');
  4.  
  5. Security::CheckLogin($login);
  6. if(empty($_GET['m'])){
  7.         $template->exec_template("news");
  8. }
  9. else{
  10.         Pages($_GET['m']);
  11. }
  12. ?>

Файл по пути system/include.php:
PHP:
скопировать код в буфер обмена
  1. <?PHP
  2. include("engine.php");
  3. include("connect.php");
  4. include("config/defines.php");
  5. include("config/config.php");
  6. include("config/navbar.php");
  7. include("config/personal.php");
  8. include("config/phrases.php");
  9. //RU-ru: Основные классы: MyPDO, ConfigMGR, template - их всегда ставить в начале.
  10. //EN-uk: Base classes: MyPDO, ConfigMGR, template - you should include them in the beginning!
  11.  
  12. loadclass( array('MyPDO','ConfigMGR','template','security','news','navbar','user','monitoring','users','breadcrumb','lang') );
  13.  
  14. //С v0.2.5 объявление переменных будет производиться автоматически, а пока что требуется объявить их вручную.
  15. //Since v0.2.4 all class variables were be set dynamically, but now you should set it manually.
  16. $news = new News;
  17. $template = new Template;
  18. $navbar = new Navbar;
  19. $nav = new Navbar;
  20. $user = new User;
  21. $mon = new MinecraftQuery;
  22. $config_mgr = new ConfigMGR;
  23. $security = new Security;
  24.  
  25. //Чтение текущего шаблона. Требуется для {theme}-переменной в шаблонизаторе
  26. $cur_tpl = ConfigMGR::ReadConfig('cur_tpl');
  27.  
  28. $login = (empty($_SESSION['login'])) ? false : $_SESSION['login'];
  29. ?>

Класс Security:
PHP:
скопировать код в буфер обмена
  1. <?PHP
  2. class Security extends MyPDO{
  3.         public static $salt;
  4.         public function __construct(){
  5.                 global $database, $_SESSION;
  6.                
  7.                 try{
  8.                         parent::__construct("mysql:host=$database[host];dbname=$database[base]", $database['user'], $database['pass']);
  9.                 }catch (PDOException $e) {
  10.                         echo 'Подключение не удалось: ' . $e->getMessage();
  11.                 }
  12.                
  13.                 $this->salt = ConfigMGR::ReadConfig("salt");
  14.         }
  15.         public function CheckLogin($login){
  16.                 $pass = self::EncodePassword($_SESSION['password']);
  17.                 $check = parent::select("users", "login=:login", array(":login"=>$login));
  18.                 if($check['password'] != $pass){
  19.                         header("Location: /");
  20.                 }
  21.                 echo "<table border=\"1\" style='border:1px solid black;'>
  22.                 <tr><td>Ваш пасс в бд</td>
  23.                 <td>{$check['password']}</td></tr>
  24.                 <tr><td>Ваш пас в сессиях: {$pass}</tr></table>";
  25.         }
  26.         public function EncodePassword($password, $salt=null){
  27.                 $salt = self::$salt;
  28.                 $algorithm = ConfigMGR::ReadConfig("algorithm");
  29.                 switch($algorithm){
  30.                         case "md5":
  31.                                 $return = md5($password);
  32.                                 break;
  33.                         case "double_md5":
  34.                                 $return = md5(md5($password));
  35.                                 break;
  36.                         case "mega":
  37.                                 $return = md5(hash("sha256", $password).md5($salt));
  38.                                 break;
  39.                         default:
  40.                                 $return = md5($password);
  41.                                 break;
  42.                 }
  43.                 return $return;
  44.         }
  45.        
  46.         public static function calculate($password){
  47.                   //SEARCHES FOR EACH OF THESE PATTERNS FOR VARIETY
  48.                   $lo = '/[a-z]+/';
  49.                   $up = '/[A-Z]+/';
  50.                   $num = '/[0-9]+/';
  51.                   $sym = '/[^A-Za-z0-9]+/';
  52.                    //BLANK UNTIL COUNTS VARIETY AND SYMBOLS (DO NOT REMOVE)
  53.                   $variety = 0;
  54.                   $symbols = 0;
  55.                   $strlen = strlen($password);
  56.                   if(preg_match($lo,$password)){
  57.                           $variety++;
  58.                   }
  59.                   if(preg_match($up,$password)){
  60.                           $variety++;
  61.                   }else{
  62.                           $variety--;
  63.                   }
  64.                   if(preg_match($num,$password)){
  65.                           $variety++;
  66.                   }else{
  67.                           $variety--;
  68.                   }
  69.                   if(preg_match($sym,$password)){
  70.                           $variety++;
  71.                   }else{
  72.                           $variety--;
  73.                   }
  74.                   if(is_numeric($password)){
  75.                         $variety--;
  76.                   }
  77.                   if($strlen <= 6){
  78.                         $variety--;
  79.                   }else{
  80.                         $variety++;
  81.                   }
  82.                           //COUNTS SYMBOLS, USED FOR EXTRA POINTS
  83.                   for($i=0; $i < $strlen; $i++){
  84.                           if(preg_match($sym,substr($password, $i))){
  85.                                 $symbols++;
  86.                           }
  87.                   }
  88.                           $score = $strlen; //POINT GIVEN FOR EVERY CHARACTER
  89.                           //IF THERE ARE 3 VARIETIES, 1.5 FOR EACH & 2 FOR EACH SYMBOL
  90.                   if($variety==2){
  91.                          $score += ($variety * 1.5)+($symbols*2);
  92.                   }
  93.                   //IF THERE ARE >=3 VARIETIES, 1.5 FOR EACH & 3 FOR EACH SYMBOL
  94.                   //BUT, IF <= 8 CHARS, ONLY 2 GIVEN FOR EACH SYMBOL
  95.                   if($variety>=3){
  96.                          if($strlen>=8){
  97.                         $score += ($variety * 1.5)+($symbols*3);
  98.                          } else {
  99.                         $score += ($variety * 1.5)+($symbols*2);
  100.                          }
  101.                   }
  102.                   $scale = 25; //MEASURES OUT OF 25 PTS, MAY BE MORE FOR SUPERSTRONG PASSWORDS
  103.                   $percent = ($score / $scale) * 100; //GETS PERCENT OF THE SCALE
  104.                   //MAY BE > 100%, THEREFORE SCALES BACK TO 100 FOR CSS PURPOSES
  105.                   if($percent>100){
  106.                          $percent = 100;
  107.                   }
  108.                   //WIDTH OF SHADED AREA
  109.                   return $percent;
  110.         }
  111. }

Класс MyPDO:
PHP:
скопировать код в буфер обмена
  1. <?PHP
  2. class MyPDO extends PDO {
  3.         private $error;
  4.         private $sql;
  5.         private $bind;
  6.         private $errorCallbackFunction;
  7.         private $errorMsgFormat;
  8.  
  9.         public function __construct($dsn, $user="", $passwd="") {
  10.                 $options = array(
  11.                         PDO::ATTR_PERSISTENT => true,
  12.                         PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION
  13.                 );
  14.  
  15.                 try {
  16.                         parent::__construct($dsn, $user, $passwd, $options);
  17.                 } catch (PDOException $e) {
  18.                         $this->error = $e->getMessage();
  19.                 }
  20.         }
  21.  
  22.         private function debug() {
  23.                 if(!empty($this->errorCallbackFunction)) {
  24.                         $error = array("Error" => $this->error);
  25.                         if(!empty($this->sql))
  26.                                 $error["SQL Statement"] = $this->sql;
  27.                         if(!empty($this->bind))
  28.                                 $error["Bind Parameters"] = trim(print_r($this->bind, true));
  29.  
  30.                         $backtrace = debug_backtrace();
  31.                         if(!empty($backtrace)) {
  32.                                 foreach($backtrace as $info) {
  33.                                         if($info["file"] != __FILE__)
  34.                                                 $error["Backtrace"] = $info["file"] . " at line " . $info["line"];     
  35.                                 }              
  36.                         }
  37.  
  38.                         $msg = "";
  39.                         if($this->errorMsgFormat == "html") {
  40.                                 if(!empty($error["Bind Parameters"]))
  41.                                         $error["Bind Parameters"] = "<pre>" . $error["Bind Parameters"] . "</pre>";
  42.                                 $css = trim(file_get_contents(dirname(__FILE__) . "/error.css"));
  43.                                 $msg .= '<style type="text/css">' . "\n" . $css . "\n</style>";
  44.                                 $msg .= "\n" . '<div class="db-error">' . "\n\t<h3>SQL Error</h3>";
  45.                                 foreach($error as $key => $val)
  46.                                         $msg .= "\n\t<label>" . $key . ":</label>" . $val;
  47.                                 $msg .= "\n\t</div>\n</div>";
  48.                         }
  49.                         elseif($this->errorMsgFormat == "text") {
  50.                                 $msg .= "SQL Error\n" . str_repeat("-", 50);
  51.                                 foreach($error as $key => $val)
  52.                                         $msg .= "\n\n$key:\n$val";
  53.                         }
  54.  
  55.                         $func = $this->errorCallbackFunction;
  56.                         $func($msg);
  57.                 }
  58.         }
  59.  
  60.         public function delete($table, $where, $bind="") {
  61.                 $sql = "DELETE FROM " . $table . " WHERE " . $where . ";";
  62.                 $this->run($sql, $bind);
  63.         }
  64.  
  65.         private function filter($table, $info) {
  66.                 $driver = $this->getAttribute(PDO::ATTR_DRIVER_NAME);
  67.                 if($driver == 'sqlite') {
  68.                         $sql = "PRAGMA table_info('" . $table . "');";
  69.                         $key = "name";
  70.                 }
  71.                 elseif($driver == 'mysql') {
  72.                         $sql = "DESCRIBE " . $table . ";";
  73.                         $key = "Field";
  74.                 }
  75.                 else { 
  76.                         $sql = "SELECT column_name FROM information_schema.columns WHERE table_name = '" . $table . "';";
  77.                         $key = "column_name";
  78.                 }      
  79.  
  80.                 if(false !== ($list = $this->run($sql))) {
  81.                         $fields = array();
  82.                         foreach($list as $record)
  83.                                 $fields[] = $record[$key];
  84.                         return array_values(array_intersect($fields, array_keys($info)));
  85.                 }
  86.                 return array();
  87.         }
  88.  
  89.         private function cleanup($bind) {
  90.                 if(!is_array($bind)) {
  91.                         if(!empty($bind))
  92.                                 $bind = array($bind);
  93.                         else
  94.                                 $bind = array();
  95.                 }
  96.                 return $bind;
  97.         }
  98.  
  99.         public function insert($table, $info) {
  100.                 $fields = $this->filter($table, $info);
  101.                 $sql = "INSERT INTO " . $table . " (" . implode($fields, ", ") . ") VALUES (:" . implode($fields, ", :") . ");";
  102.                 $bind = array();
  103.                 foreach($fields as $field)
  104.                         $bind[":$field"] = $info[$field];
  105.                 return $this->run($sql, $bind);
  106.         }
  107.  
  108.         public function run($sql, $bind="") {
  109.                 $this->sql = trim($sql);
  110.                 $this->bind = $this->cleanup($bind);
  111.                 $this->error = "";
  112.  
  113.                 try {
  114.                         $pdostmt = $this->prepare($this->sql);
  115.                         if($pdostmt->execute($this->bind) !== false) {
  116.                                 if(preg_match("/^(" . implode("|", array("select", "describe", "pragma")) . ") /i", $this->sql))
  117.                                         return $pdostmt->fetchAll(PDO::FETCH_ASSOC);
  118.                                 elseif(preg_match("/^(" . implode("|", array("delete", "insert", "update")) . ") /i", $this->sql))
  119.                                         return $pdostmt->rowCount();
  120.                         }      
  121.                 } catch (PDOException $e) {
  122.                         $this->error = $e->getMessage();       
  123.                         $this->debug();
  124.                         return false;
  125.                 }
  126.         }
  127.  
  128.         public function select($table, $where="", $bind="", $fields="*") {
  129.                 $sql = "SELECT " . $fields . " FROM " . $table;
  130.                 if(!empty($where))
  131.                         $sql .= " WHERE " . $where;
  132.                 $sql .= ";";
  133.                 return $this->run($sql, $bind);
  134.         }
  135.  
  136.         public function setErrorCallbackFunction($errorCallbackFunction, $errorMsgFormat="html") {
  137.                 //Variable functions for won't work with language constructs such as echo and print, so these are replaced with print_r.
  138.                 if(in_array(strtolower($errorCallbackFunction), array("echo", "print")))
  139.                         $errorCallbackFunction = "print_r";
  140.  
  141.                 if(function_exists($errorCallbackFunction)) {
  142.                         $this->errorCallbackFunction = $errorCallbackFunction; 
  143.                         if(!in_array(strtolower($errorMsgFormat), array("html", "text")))
  144.                                 $errorMsgFormat = "html";
  145.                         $this->errorMsgFormat = $errorMsgFormat;       
  146.                 }      
  147.         }
  148.  
  149.         public function update($table, $info, $where, $bind="") {
  150.                 $fields = $this->filter($table, $info);
  151.                 $fieldSize = sizeof($fields);
  152.  
  153.                 $sql = "UPDATE " . $table . " SET ";
  154.                 for($f = 0; $f < $fieldSize; ++$f) {
  155.                         if($f > 0)
  156.                                 $sql .= ", ";
  157.                         $sql .= $fields[$f] . " = :update_" . $fields[$f];
  158.                 }
  159.                 $sql .= " WHERE " . $where . ";";
  160.  
  161.                 $bind = $this->cleanup($bind);
  162.                 foreach($fields as $field)
  163.                         $bind[":update_$field"] = $info[$field];
  164.                
  165.                 return $this->run($sql, $bind);
  166.         }
  167. }      
  168. ?>
  169.  


Итак, все это чудо с самого начала моего перехода на PDO с mysql_* не работало.
Что выводится в index.php:

Warning: session_start(): Cannot send session cache limiter - headers already sent (output started at /home/u335361938/public_html/index.php:1) in /home/u335361938/public_html/sys tem/include.php on line 2

Fatal error: Using $this when not in object context in /home/u335361938/public_html/sys tem/classes/MyPDO.class.php on line 133
 
 Top
DlTA
Отправлено: 19 Марта, 2014 - 17:02:51
Post Id



Постоянный участник


Покинул форум
Сообщений всего: 2952
Дата рег-ции: Окт. 2010  


Помог: 53 раз(а)




ну а чего тут удивительного?!
смотрим в файл "Класс Security:"
строка 17
и что видим?
parent::select("users", "l

а это пример статического вызова метода, внутри которого юзается $this что ну не как нельзя!
тоесть нужно
1) изметь форму вызова метода,
либо
2) не юзать $this, в методе select(...)

но второй вариант внешне сложнее, так как за собой требует изменения в куче кода
 
 Top
XuPoH
Отправлено: 19 Марта, 2014 - 17:24:56
Post Id


Новичок


Покинул форум
Сообщений всего: 8
Дата рег-ции: Март 2014  


Помог: 0 раз(а)




DlTA пишет:
ну а чего тут удивительного?!
смотрим в файл "Класс Security:"
строка 17
и что видим?
parent::select("users", "l

а это пример статического вызова метода, внутри которого юзается $this что ну не как нельзя!
тоесть нужно
1) изметь форму вызова метода,
либо
2) не юзать $this, в методе select(...)

но второй вариант внешне сложнее, так как за собой требует изменения в куче кода

как сделать 1ое?)
 
 Top
DlTA
Отправлено: 19 Марта, 2014 - 17:50:38
Post Id



Постоянный участник


Покинул форум
Сообщений всего: 2952
Дата рег-ции: Окт. 2010  


Помог: 53 раз(а)




XuPoH пишет:
как сделать 1ое?)

вообще нужно разбираться в коде, почему именно нужно вызывать родительский метод, а не тот что наследуется, внешне я не видел чтоб этот метод переопределялся, ну а там фиг его знает

метод в лоб:
заменить
в 17 строке
$check = parent::select("users", "login=:login", array(":login"=>$login));
на
$check = $this->select("users", "login=:login", array(":login"=>$login));
 
 Top
Hapson
Отправлено: 19 Марта, 2014 - 18:47:18
Post Id



Посетитель


Покинул форум
Сообщений всего: 356
Дата рег-ции: Июнь 2013  
Откуда: Ставропольский край


Помог: 10 раз(а)

[+]


DlTA пишет:
и что видим?
parent::select("users", "l

а это пример статического вызова метода, внутри которого юзается $this что ну не как нельзя!

Да ладно!!! Не понял

PS тогда вопрос:
1) как вызвать родительский метод
2) почему в нем нельзя использовать $this
3) да и вообще... что будет в $this родительского метода, если вызвать его из дочернего класса???

(Отредактировано автором: 19 Марта, 2014 - 18:50:02)



-----
ПЫХ тут - ходи туда, прежде чем писать сюда (толку больше будет)
 
 Top
esterio
Отправлено: 19 Марта, 2014 - 18:55:28
Post Id



Активный участник


Покинул форум
Сообщений всего: 5025
Дата рег-ции: Нояб. 2012  
Откуда: Украина, Львов


Помог: 127 раз(а)




XuPoH пишет:
Warning: session_start(): Cannot send session cache limiter - headers already sent (output started at /home/u335361938/public_html/index.php:1) in /home/u335361938/public_html/sys tem/include.php on line 2

Сессия стартует ранее вывода в браузер

XuPoH пишет:
try{
parent::__construct("mysql:host=$database[host];dbname=$database[base]", $database['user'], $database['pass']);
}catch (PDOException $e) {
echo 'Подключение не удалось: ' . $e->getMessage();
}


Вы так каждый раз при создании нового екземпляра класа планируете делать коннект к базе?
 
 Top
Hapson
Отправлено: 19 Марта, 2014 - 19:03:01
Post Id



Посетитель


Покинул форум
Сообщений всего: 356
Дата рег-ции: Июнь 2013  
Откуда: Ставропольский край


Помог: 10 раз(а)

[+]


esterio пишет:
Сессия стартует ранее вывода в браузер

Точнее после начала вывода
XuPoH
Кодировка файлов какая?


-----
ПЫХ тут - ходи туда, прежде чем писать сюда (толку больше будет)
 
 Top
DlTA
Отправлено: 19 Марта, 2014 - 22:17:12
Post Id



Постоянный участник


Покинул форум
Сообщений всего: 2952
Дата рег-ции: Окт. 2010  


Помог: 53 раз(а)




Hapson пишет:
PS тогда вопрос:
1) как вызвать родительский метод
2) почему в нем нельзя использовать $this
3) да и вообще... что будет в $this родительского метода, если вызвать его из дочернего класса???

1) зачем?
2) это зарезервированное слово(переменгая) , а при статическом вызове метода класса этой переменной нет, так как обьект не создавался
3) это не возможно, можно вызвать наследуемый метод который будет работать с контекстом нынешнего обьекта а не родительского
 
 Top
Мелкий Супермодератор
Отправлено: 20 Марта, 2014 - 08:45:54
Post Id



Активный участник


Покинул форум
Сообщений всего: 11926
Дата рег-ции: Июль 2009  
Откуда: Россия, Санкт-Петербург


Помог: 618 раз(а)




DlTA пишет:
1) зачем?

Бывает нужно. В частности, если хочется сделать что-нибудь до и/или после определённого метода, не изменяя клиентский код.

DlTA пишет:
а при статическом вызове метода класса этой переменной нет, так как обьект не создавался

Всё бы так, но не так.
parent::method - не статический вызов, а вызов метода родительского класса в контексте именно этого объекта.


-----
PostgreSQL DBA
 
 Top
LIME
Отправлено: 20 Марта, 2014 - 09:02:35
Post Id


Активный участник


Покинул форум
Сообщений всего: 10732
Дата рег-ции: Нояб. 2010  


Помог: 322 раз(а)




DlTA пишет:
2) это зарезервированное слово(переменгая) , а при статическом вызове метода класса этой переменной нет, так как обьект не создавался
может он и создавался
и даже несколько
но тогда тем более непонятно какой из них имеется ввиду под this
статические методы вызываются в контексте класса а не конкретного экземпляра(то есть хз какой тут может быть this)
(Добавление)
например
PHP:
скопировать код в буфер обмена
  1. class A{
  2.  
  3.     public $a;
  4.  
  5.     public static sayA(){
  6.         echo $this->a;
  7.     }
  8.  
  9. }
  10.  
  11. $a1 = new A;
  12. $a1->a = 1;
  13.  
  14. $a2 = new A;
  15. $a2->a = 2;
  16.  
  17. A::sayA(); //// AAAA караул что делать???!!!
 
 Top
DlTA
Отправлено: 20 Марта, 2014 - 09:28:18
Post Id



Постоянный участник


Покинул форум
Сообщений всего: 2952
Дата рег-ции: Окт. 2010  


Помог: 53 раз(а)




Мелкий пишет:
родительского класса в контексте именно этого объекта.
может класса?
 
 Top
Мелкий Супермодератор
Отправлено: 20 Марта, 2014 - 09:35:53
Post Id



Активный участник


Покинул форум
Сообщений всего: 11926
Дата рег-ции: Июль 2009  
Откуда: Россия, Санкт-Петербург


Помог: 618 раз(а)




DlTA пишет:
может класса?

Именно объекта. Контекст объекта сохраняется.
http://www.php.net/manual/en/key...parent.php#42153


-----
PostgreSQL DBA
 
 Top
DlTA
Отправлено: 20 Марта, 2014 - 11:03:46
Post Id



Постоянный участник


Покинул форум
Сообщений всего: 2952
Дата рег-ции: Окт. 2010  


Помог: 53 раз(а)




мда, я ошибся

Спойлер (Отобразить)
two a 1
one a 2
two b
one b

для parent:: пофигу каой метод вызывать статический/динамический, главное чтоб соблюдался вызов динамических методов только из объекта

(Отредактировано автором: 20 Марта, 2014 - 11:05:16)

 
 Top
Hapson
Отправлено: 20 Марта, 2014 - 15:25:43
Post Id



Посетитель


Покинул форум
Сообщений всего: 356
Дата рег-ции: Июнь 2013  
Откуда: Ставропольский край


Помог: 10 раз(а)

[+]


DlTA пишет:
для parent:: пофигу каой метод вызывать статический/динамический

Главное чтобы он был в классе родителе. parent - родитель.
А еще про константы почитай
http://www.php.net/manual/ru/lan...p5.constants.php

DlTA пишет:
чтоб соблюдался вызов динамических методов только из объекта

в контексте объекта
PS если конечно родительский метод не статический

(Отредактировано автором: 20 Марта, 2014 - 15:28:22)



-----
ПЫХ тут - ходи туда, прежде чем писать сюда (толку больше будет)
 
 Top
Страниц (1): [1]
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« Вопросы новичков »


Все гости форума могут просматривать этот раздел.
Только зарегистрированные пользователи могут создавать новые темы в этом разделе.
Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
 



Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS  RSS

 
Powered by ExBB FM 1.0 RC1. InvisionExBB