За последние 24 часа нас посетили 39372 программиста и 1722 робота. Сейчас ищут 657 программистов ...

Принципы программирования и написания скриптов.

Тема в разделе "PHP для новичков", создана пользователем Ігор, 9 янв 2009.

  1. Ігор

    Ігор Активный пользователь

    С нами с:
    7 апр 2008
    Сообщения:
    195
    Симпатии:
    0
    Вопрос, наверное, глупый.
    Нужен скрипт галереи. Вот как лучше поступить: писать свой, или переработать готовый под свои нужды.
    Полностью готовый не хочу.
    Пытался разобраться с singapore-0.10.1 но пока для меня сложновато.
    Может вы посоветуете с чего начать.
    Скрипты писал раньше, но как-то кострубато выходит все, некрасиво :(
    Но впринципе, работет.
     
  2. [vs]

    [vs] Суперстар
    Команда форума Модератор

    С нами с:
    27 сен 2007
    Сообщения:
    10.559
    Симпатии:
    632
    В быдлокоде (95% бесплатных галлерей) бывает разбираться себе дороже, если нужна глубокая интеграция в сайт, проще, конечно, написать.
     
  3. Ігор

    Ігор Активный пользователь

    С нами с:
    7 апр 2008
    Сообщения:
    195
    Симпатии:
    0
    Тем более, если буду писать сам с вкипте будет только то что мне нужно и ничего другого.
    Сам php сейчас изучаю, кое-что уже знаю.
    Как бы сказать, не совсем хорошо представляю саму "логику" написания скрипта. Где можно почитать?
    Как я понял изученим готовых скриптов -- не стоит.
     
  4. Greg1978

    Greg1978 Активный пользователь

    С нами с:
    18 окт 2008
    Сообщения:
    484
    Симпатии:
    0
    Адрес:
    class SenjorUser{}
    По мне так на проектирование системы открыла дорогу книга PHP5 для профессионалов Эд-Леки Томпсон, .....
    Есть баги но всё же ....
     
  5. sword dancer

    sword dancer Активный пользователь

    С нами с:
    17 фев 2008
    Сообщения:
    295
    Симпатии:
    0
    скрипты по которым действительно стоит учиться - найти ой как сложно :) проще самому шишки набить
     
  6. Ігор

    Ігор Активный пользователь

    С нами с:
    7 апр 2008
    Сообщения:
    195
    Симпатии:
    0
    Думаю, что в процессе написания - возникнет масса вопросов.
    Остается надеяться только на вашу помощь.
    Сразу вопрос: лучше создать класс, или на отдельных функциях?
    Скажем, кроме галереии будут и другие рубрики. Думаю разумно написать один раз форму и скрипт для комментариев и использовать во всех рубриках.
    Разница будет только в базе данных, в которую производиться запись данного комментария.
     
  7. для начала лучше функции.

    ООП требует несколько другого подхода и мышления, желательно перед этим иметь просто опыт программирования.
     
  8. Ігор

    Ігор Активный пользователь

    С нами с:
    7 апр 2008
    Сообщения:
    195
    Симпатии:
    0
    ну я на vb6 программировал.
    та же проблема. Знаю язык, а как красивее написать и правельней :(
     
  9. Ігор

    Ігор Активный пользователь

    С нами с:
    7 апр 2008
    Сообщения:
    195
    Симпатии:
    0
    Все-таки решил на классах.
    Смастерил пока 2.
    Первый
    PHP:
    1.  
    2. <?php
    3. /*************************************************
    4.  * ek-image  1.0
    5.  * by: Юхименко Игорь
    6.  * e-mail: [email=igor@ekklesiast.org.ua]igor@ekklesiast.org.ua[/email]
    7.  *************************************************/
    8.  
    9. if ((!defined ('ROOT_DIR'))||(ADMIN!==-1)) {
    10.  die ('Internal error');
    11. }
    12.  
    13. require_once ROOT_DIR."set/config.php";
    14.  
    15. class ekio {
    16.  
    17. var $id; //индетификатор ресурса
    18. var $res; //индетифокатор запроса
    19.  
    20.  
    21. function open()
    22.   {
    23.    global $database;
    24.    echo $database;
    25.    if (!$this->id) $this->id = sqlite_open($database);
    26.   }
    27.  
    28.  
    29. function getName()
    30.   {
    31.     return "SQLite";
    32.   }
    33.  
    34.  
    35. function query($query)
    36.   {
    37.     $this->res= sqlite_query($this->id, $query);
    38.     return $this->res;
    39.   }
    40.  
    41. function exes($query)
    42.   {
    43.     sqlite_exec($this->id, $query);
    44.   }
    45.  
    46.  
    47.  
    48. function escape_string($query)
    49.   {
    50.     return sqlite_escape_string($query);
    51.   }
    52.  
    53. function fetch_single()
    54.  
    55.   {
    56.    return sqlite_fetch_single($this->res);
    57.   }
    58.  
    59.  
    60. function fetch_array()
    61.   {
    62.     return sqlite_fetch_array($this->res);
    63.   }
    64.  
    65. function fetch_array_asinc($res)
    66.   {
    67.     return sqlite_fetch_array($res);
    68.   }
    69.  
    70. function fetch_all ()
    71.   {
    72.     return sqlite_fetch_all($this->res);
    73.   }
    74.  
    75. function num_rows()
    76.   {
    77.     return sqlite_num_rows($this->res);
    78.   }
    79.  
    80.  
    81. function error()
    82.   {
    83.     return sqlite_error_string(sqlite_last_error($this->id));
    84.   }
    85.  
    86.  
    87. function close()
    88.   {
    89.     return sqlite_close($this->id);
    90.   }
    91.  
    92. }
    93.  
    94. ?>
    95.  
    Использую так
    PHP:
    1.  
    2. <?php
    3.  /*************************************************
    4.  * ek-image  1.0
    5.  * by: Юхименко Игорь
    6.  * e-mail: [email=igor@ekklesiast.org.ua]igor@ekklesiast.org.ua[/email]
    7.  *************************************************/
    8.  
    9.  //Установлен ли базовый путь?
    10.  
    11. if ((!defined('ROOT_DIR'))|| (ADMIN!==-1))  {
    12.     die ("Internal error!");
    13. }
    14.  
    15.  require (ROOT_DIR."includes/io.php");
    16.  
    17.  
    18. //---------------------------------------------------------------------//
    19. //                                                                     //
    20. //========== Главный класс адиминистратирования =======================//
    21. //====== Содержит все функции для работы с галереей ===================//
    22. //                                                                     //
    23. //---------------------------------------------------------------------//
    24.  
    25. class ekimage extends ekio {
    26.  
    27.  
    28. function readfoto () {
    29.  
    30.  $this->open();
    31.  $addquery.=!empty($_GET['type'])? " AND types.type_name='$type' ":"";
    32.  $addquery.=!empty($_GET['user'])? " AND fotos.user='$user' ":"";
    33.  
    34.  
    35.  //Узнать количество записей
    36.  $count_query="SELECT COUNT(*) from fotos
    37.                           LEFT JOIN types ON (fotos.type=types.id)
    38.                           WHERE types.id>0".$addquery;
    39.  
    40.  
    41.  $this->query($count_query);      //запрос на количество данных
    42.  $datacount=$this->fetch_single();      //получаем количество  данных в базе
    43.  
    44.  $pages=ceil($datacount/$perpage);          //Количество страниц
    45.  $p=(isset ($_GET["p"]))? $_GET["p"] : 1;   //Установлено ли?
    46.  $p=($p>0)?$p : 1;                          //Коректировка, страница меньше 1
    47.  $p=($p>$pagecount)? $p=$pagecount : $p;    //Больше количества страниц
    48.  $lp=$p;
    49.  $lp--;
    50.  $offset=$lp*$perpage;
    51.  
    52.  //Строка запроса
    53.  $query="SELECT * FROM  fotos
    54.         LEFT JOIN types
    55.         ON (fotos.type=types.id)
    56.         WHERE types.id>0".$addquery." LIMIT $perpage
    57.         OFFSET $offset ";
    58.  
    59.  $this->query($querty);
    60.  
    61.  $fotoarray=$this->fetch_all ();
    62.  
    63.  }
    64.  
    65. function deletetype($id) {
    66.  
    67.   if ($id<1) {return "Ошибка удадения";
    68.   $this->open();
    69.   $this->query("select * from types WHERE id='$id'");
    70.   $is_ext=$this->fetch_single();
    71.   if (empty($is_ext)) {
    72.     $this->exes("delete * from types WHERE id='$id'");
    73.   } else return "Категоря не пуста";
    74.  
    75. }
    76.  
    77. function deletefoto ($arr) {
    78.  
    79.   $this->open();
    80.   $count=count($arr);
    81.   for ($r=0; $r<$count; $r++) {
    82.  
    83.    //удаляем все комментарии
    84.    $this->exes("delete * from coments WHERE link='$r'")
    85.  
    86.    //Получим имена всех файлов
    87.    $this->query("SELECT fotos.id,
    88.                        fotos.filename,
    89.                        types.path
    90.                        FROM fotos
    91.                        LEFT JOIN types
    92.                        ON (fotos.type=types.id)
    93.                        WHERE fotos.id='$r'");
    94.  
    95.    $arr=$this->fetch_array();
    96.    $this->deleteparticle[$arr['fotos.filename'], $arr['types.path']);
    97.    $this->exec("delete * from fotos WHERE id='$r'");
    98.  
    99.   }
    100.   $this->close();
    101.  
    102. }
    103.  
    104.  
    105. function readtypes() {
    106.  
    107.  $this->open();
    108.  $query="SELECT * FROM types";
    109.  $this->query($$type_query);
    110.  $types=$this->fetch_all();
    111.  $this->close();
    112.  return $types;
    113.  
    114. }
    115.  
    116.  
    117. function create_db() {
    118.  
    119.  $this->open();
    120.  echo $this->database;
    121.  //Создаем таблицу с описанием видов альбомов
    122.  $this->exes ("Create table IF NOT EXISTS types (id integer primary key,
    123.                                        path TEXT,
    124.                                        type_name TEXT,
    125.                                        type_deskr TEXT,
    126.                                        user_add TEXT,
    127.                                        user_visible TEXT,
    128.                                        type_date TEXT,
    129.                                        reserv1 TEXT)");
    130.  
    131.  //Таблица с путями
    132.  $this->exes ("CREATE TABLE fotos (id integer primary key,
    133.                                        type TEXT,
    134.                                        filename TEXT,
    135.                                        name TEXT,
    136.                                        user TEXT,
    137.                                        data TEXT,
    138.                                        ip TEXT,
    139.                                        size TEXT,
    140.                                        resolution TEXT,
    141.                                        description TEXT,
    142.                                        loaded TEXT,
    143.                                        reserv1 TEXT,
    144.                                        reserv2 TEXT)");
    145.  
    146.  
    147.  //Таблица комментариев
    148.  $this->exes ("CREATE table coments (id integer primary key,
    149.                                          link INTEGER,
    150.                                          comment TEXT,
    151.                                          user TEXT,
    152.                                          data TEXT,
    153.                                          ip TEXT,
    154.                                          admin_coment TEXT,
    155.                                          admin_data TEXT)");
    156.  $this->close();
    157.  
    158.  
    159.  }
    160. }
    161. ?>
    Стоит ли двигаться в таком направлении, или код никуда не годиться.
    Дальше: как лучше подключить файл параметров (имя базы данных, пути для хранения фоток, для уменьшенных копий и т.д.)
     
  10. Greg1978

    Greg1978 Активный пользователь

    С нами с:
    18 окт 2008
    Сообщения:
    484
    Симпатии:
    0
    Адрес:
    class SenjorUser{}
    Мне кажется лучше было бы не расширять класс а получить в конструкторе ссылку на обьект класса БД, а потом присвоить закрытой переменной и манипулировать методами класса БД.
    Ещё лучше, наверное сделать класс БД статическим и все методы его статические, так как он не требует инстанцирования экземпляра.
    Если будут другие рубрики то следует продумать общие методы с другими рубриками админки.
     
  11. Frozen

    Frozen Активный пользователь

    С нами с:
    20 окт 2008
    Сообщения:
    540
    Симпатии:
    0
    Адрес:
    Москва
    PHP:
    1.  
    2. <?php
    3.  
    4. class DB_Mysql {
    5.     protected $conn=null;
    6.     protected $Host;
    7.     protected $User;
    8.     protected $Pass;
    9.     protected $Database;
    10.    
    11.     public function __construct($DB_Host, $DB_User, $DB_Pass, $DB_Database) {
    12.         $this->Host = $DB_Host;
    13.         $this->User = $DB_User;
    14.         $this->Pass = $DB_Pass;
    15.         $this->Database = $DB_Database;
    16.     }
    17.    
    18.     protected function connect() {
    19.         if (is_null($this->conn)) {
    20.             if (!$this->conn = @mysql_pconnect($this->Host, $this->User, $this->Pass)) {
    21.                 throw new Mysql_Exception();
    22.             }
    23.             if (!@mysql_select_db($this->Database, $this->conn)) {
    24.                 throw new Mysql_Exception();
    25.             }
    26.         }
    27.         return true;
    28.     }
    29.    
    30.     public function query($sql) {
    31.         if (is_null($this->conn)) $this->connect();
    32.         //
    33.         $ret = mysql_query($sql);
    34.         if ($ret===false) {
    35.             throw new Mysql_Exception($sql);
    36.         }
    37.         return new DB_Mysql_Statement($ret, $sql);
    38.     }
    39. }
    40.  
    41. class DB_Mysql_Statement {
    42.     protected $Resourse;
    43.     protected $query;
    44.     public function __construct($resourse, &$sql=null) {
    45.         $this->Resourse = $resourse;
    46.         $this->query = $sql;
    47.     }
    48.     public function fetchRow() {
    49.         return mysql_fetch_assoc($this->Resourse);
    50.     }
    51.     public function getQuery() {
    52.         return $this->query;
    53.     }
    54.     public function fetchObject() {
    55.         return mysql_fetch_object($this->Resourse);
    56.     }
    57.     public function numRows() {
    58.         return mysql_num_rows($this->Resourse);
    59.     }
    60. }
    61.  
    62.  
    63. class SQLException extends Exception {
    64.         protected $query;
    65.         function getQuery() {return $this->query;}
    66. }
    67.  
    68.  
    69. /**
    70.  * Enter description here...
    71.  *
    72.  */
    73. class Mysql_Exception extends SQLException {
    74.     function __construct($query = null) {
    75.         parent::__construct(mysql_error(), mysql_errno());
    76.         $this->query = $query;
    77.     }
    78. }
    79.  
    80.  
    81.  
    82.  
    83.  
    84.  
    85. try {
    86. $db = new DB_Mysql(DB_HOST, DB_USER, DB_PASS, DB_DB);
    87. $rs = $db->query($sql)->fetchRow();
    88.  
    89.  
    90. catch (SQLException $sqlException) {
    91. ?>
    92.    
    93.     <table width="50%">
    94.         <tr>
    95.             <th colspan="2">SQL Exception</th>
    96.         </tr>
    97.         <tr>
    98.             <td>Сообщение</td>
    99.             <td><?php echo $sqlException->getMessage();?></td>
    100.         </tr>
    101.         <tr>
    102.             <td>Запрос</td>
    103.             <td><?php echo $sqlException->getQuery();?></td>
    104.         </tr>
    105.         <tr>
    106.             <td>Код</td>
    107.             <td><?php echo $sqlException->getCode();?></td>
    108.         </tr>
    109.         <tr>
    110.             <td>Файл</td>
    111.             <td><?php echo $sqlException->getFile();?></td>
    112.         </tr>
    113.         <tr>
    114.             <td>Строка</td>
    115.             <td><?php echo $sqlException->getLine();?></td>
    116.         </tr>
    117.         <tr>
    118.             <td>trace</td>
    119.             <td><?php echo $sqlException->getTraceAsString();?></td>
    120.         </tr>
    121.    
    122.     </table>
    123.    
    124.     <?php
    125. }
    126.  
    127.  
    128.  
    129.  
     
  12. Frozen

    Frozen Активный пользователь

    С нами с:
    20 окт 2008
    Сообщения:
    540
    Симпатии:
    0
    Адрес:
    Москва
    PHP:
    1.  
    2. $db->query('SELECT count(*) as cnt from table")->fetchObject()->cnt
    3.  
     
  13. Greg1978

    Greg1978 Активный пользователь

    С нами с:
    18 окт 2008
    Сообщения:
    484
    Симпатии:
    0
    Адрес:
    class SenjorUser{}
    SQLException, Exception и др. это встроенные классы подскажите где можно почитать про них?
     
  14. Frozen

    Frozen Активный пользователь

    С нами с:
    20 окт 2008
    Сообщения:
    540
    Симпатии:
    0
    Адрес:
    Москва
  15. Frozen

    Frozen Активный пользователь

    С нами с:
    20 окт 2008
    Сообщения:
    540
    Симпатии:
    0
    Адрес:
    Москва
  16. и чем лучше?
     
  17. Ігор

    Ігор Активный пользователь

    С нами с:
    7 апр 2008
    Сообщения:
    195
    Симпатии:
    0
    Вот что я сделал:
    В io.php функцию open переименовал в __construct
    PHP:
    1. <?php
    2. function __construct()
    3.   {
    4.    global $database;
    5.    if (!$this->id) $this->id = sqlite_open($database);
    6.   }
    7. ?>
    Вот мне не нравиться global $database; как лучше "подключить" имя базы данных? (sqlite)
    А в самом admin_class
    такие функции как добавления нового альбома и т.д.
    Как лучше его имя передать в функцию аргументом, или сама функция должна прочитать его из _POST?
    Как более красиво и правильней?
     
  18. Frozen

    Frozen Активный пользователь

    С нами с:
    20 окт 2008
    Сообщения:
    540
    Симпатии:
    0
    Адрес:
    Москва
    синглтон
    гугли
     
  19. Frozen

    Frozen Активный пользователь

    С нами с:
    20 окт 2008
    Сообщения:
    540
    Симпатии:
    0
    Адрес:
    Москва
  20. Mr.M.I.T.

    Mr.M.I.T. Старожил

    С нами с:
    28 янв 2008
    Сообщения:
    4.586
    Симпатии:
    1
    Адрес:
    у тебя канфетка?
    можешь покапаться в phpc - http://phpc.ru
    он совместим с PHP4 так что чудес ООП не жди, зато там есть много других неплохих идей..
     
  21. S.t.A.M.

    S.t.A.M. Активный пользователь

    С нами с:
    10 сен 2007
    Сообщения:
    1.041
    Симпатии:
    0
    Скачал книжку...
    Кто скажет на сколько она адекватная и можно ли верить автору (Джордж Шлосснейгл)?
     
  22. Frozen

    Frozen Активный пользователь

    С нами с:
    20 окт 2008
    Сообщения:
    540
    Симпатии:
    0
    Адрес:
    Москва
    думаю если бы ты открыл и почитал то вопросы бы отпали
     
  23. Шлосс не плох.
     
  24. Ігор

    Ігор Активный пользователь

    С нами с:
    7 апр 2008
    Сообщения:
    195
    Симпатии:
    0
    Подскажите, как сделать красивей.
    А ток получается очень запутанный.

    Вкратце: галлереи храняться в отдельной таблице
    Код (Text):
    1. id - Ид
    2. pId - Ид родителя
    3. name - Имя галлереи (можно русскими, любые символы (это то, что пишеться как ссылка))
    4. path - Только латиница и цифры (Уникальное в даной подгалереи) для передачи GETом, чтобы не кодировать
    PHP:
    1. <?php
    2.   //Функция получает информацию о текущей галлереи
    3.   function getFolderInfo()
    4.   {
    5.  
    6.    if ((isset($_REQUEST['gallery'])) && (!empty($_REQUEST['gallery'])))
    7.    {
    8.       $this->fullpath = $_REQUEST['gallery'];
    9.    }
    10.    else
    11.    {
    12.       $this->fullpath="";
    13.       $this->cId=0;
    14.       $this->pId=0;
    15.       return;
    16.    }
    17.  
    18.    $prevId=0;
    19.    $folderitems=split('/',$this->fullpath);
    20.    $itemcount=count($folderitems);
    21.    $this->folderpaths[-1]="";
    22.  
    23.    for ($r=0; $r<$itemcount; $r++)
    24.  
    25.      {
    26.         $this->pId=$prevId;
    27.         $this->dbio->query("SELECT id, path from gallerys
    28.                    WHERE path='".$folderitems[$r]."' AND parent='$prevId' LIMIT 1");
    29.  
    30.         $arr=$this->dbio->fetch_array();
    31.         if (empty($arr))  return false;
    32.         $prevId=$arr['id'];  //Это id текущего каталога, но за следующим проходом он станет родительським
    33.         $this->folderpaths[$r]=$this->folderpaths[$r-1].'/'.$folderitems[$r];
    34.         $this->foldernames[$r]=$arr['path'];
    35.         $this->cId=$prevId;
    36.  
    37.     }
    38.     unset ($this->folderpaths[-1]);
    39. }?>
    Получаем инфу о текущей галлереи, ее ид, ид родителя
    PHP:
    1. <?php
    2. //Поличим информацию о всех потомках данной папки
    3.   function getFolderChildrens()
    4.   {
    5.     $query="SELECT * FROM gallerys WHERE parent = '".$this->cId."' ORDER BY name";
    6.     $this->dbio->query($query);
    7.     $this->childs=$this->dbio->fetch_all();
    8.  
    9.     if ($this->hasParent())
    10.       {
    11.               $count=count($this->childs);
    12.             for ($r=0; $r<$count; $r++)
    13.               $this->childs[$r]['path']=$this->fullpath.'/'.$this->childs[$r]['path'];
    14.       }
    15.  
    16.   }
    17.  
    18. //Получим всех сестёр для данной папки
    19.   function getFolderSisters()
    20.   {
    21.     $query="SELECT path, name FROM gallerys WHERE parent = '".$this->pId."' ORDER BY name";
    22.     $this->dbio->query($query);
    23.     $this->sisters=$this->dbio->fetch_all();
    24.     if ($this->hasParent())
    25.       {
    26.               $count=count($this->sisters);
    27.             for ($r=0; $r<$count; $r++)
    28.               $this->sisters[$r]['path']=$this->parentpath.'/'.$this->sisters[$r]['path'];
    29.       }
    30.   }
    31. ?>
    Очень некрасиво получается
    Код (Text):
    1.   if ($this->hasParent())
    2.       {
    3.               $count=count($this->childs);
    4.             for ($r=0; $r<$count; $r++)
    5.               $this->childs[$r]['path']=$this->fullpath.'/'.$this->childs[$r]['path'];
    6.       }
    Хоть подскажите, как лучше[/url]