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 Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи


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

> Без описания
assd
Отправлено: 25 Декабря, 2012 - 15:55:22
Post Id


Гость


Покинул форум
Сообщений всего: 113
Дата рег-ции: Апр. 2012  


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




Здравствуйте. Подскажите правильное ли это написание, структура и т.д.? Заранее спасибо.

PHP:
скопировать код в буфер обмена
  1.  
  2. classDB.php
  3.  
  4. class DB{
  5.     private $host="localhost";//имя машины где находится базы
  6.     private $db="testproject";//имя базы данных
  7.     private $user="admin";//имя пользователя базы данных
  8.     private $pass="";//пароль для доступа
  9.     private $enc="utf8";//кодировка сайта
  10.     private $pref="DB";//префикс в базе данных
  11.     private $spref="";//префикс используемый на сайте
  12.     private $dataset="";//здесь будем хранить результат запроса
  13.     private $record="";//а здесь будем хранить текущую запись
  14.     private $link;//и здесь будем хранить линк на подключение к базе данных.
  15.     function db(){//инициализируем класс
  16.         $this->link = mysql_connect($this->host, $this->user, $this->pass) or exit("Could not connect");
  17.         //соединяемся с базой
  18.         mysql_select_db($this->db);
  19.         //выбираем базу данных
  20.         mysql_query("SET CHARSET ".$this->enc);
  21.         //устанавливаем нашу кодировку
  22.     }          
  23.  
  24.         private function addTabPrefix($query){
  25.                 return str_replace($this->pref,$this->spref,$query);
  26.                 // просто возвращаем результат замены, большего нам и не надо.
  27.                 }
  28.                
  29.         function Query($query){
  30.                 $this->dataset = mysql_query($this->addTabPrefix($query)) or die("Internal Error: ".mysql_error());
  31.                 // отправляем запрос в базу и сохраняем результат, иначе вызываем ошибку.
  32.                 return $this->dataset;
  33.                 // на всякий пожарный возвращаем результат вне класса, вдруг понадобится.
  34.                 }
  35.                
  36.         function Next(){
  37.         //Эта функция будет перемещать нас от строки до строки, если строки не существует она вернет FALSE
  38.                 if($this->record = mysql_fetch_array($this->dataset,MYSQL_ASSOC)){
  39.                         return TRUE;
  40.                 }else{ 
  41.                         return FALSE;
  42.                 }
  43.         }
  44.         function Vall($vall){
  45.         // а эта будет возвращать нам значение поля по его имени.
  46.                 return $this->record[$vall];
  47.         }
  48.  
  49.         function getResult($query,$vall){
  50.                 $this->dataset = mysql_query($this->addTabPrefix($query)) or die("Internal Error: ".mysql_error());
  51.                 // посылаем запрос в базу
  52.                 $this->Next();// переходим на первую запись
  53.                 $ret = $this->Vall($vall);//забираем нужную нам величину
  54.                 $this->ClearDataSet();//очищаем запрос
  55.                 return $ret;//и возвращаем величину
  56.         }
  57.         function NumRows(){
  58.                 return mysql_num_rows($this->dataset);// возвращаем количество строк
  59.         }
  60.         function ClearDataSet(){
  61.                 $this->dataset = "";// убиваем наш запрос
  62.         }
  63. }
  64.  
  65.  


PHP:
скопировать код в буфер обмена
  1.  
  2. index.php
  3.  
  4. include "classDB.php";
  5.         $db = new DB();
  6.         $query = "SELECT * FROM articles";
  7.         $db->Query($query);
  8.         while($db->Next()){
  9.                 $title = $db->Vall("tittle");
  10.                 $text = $db->Vall("text");
  11.                 include "index.tpl.php";
  12.         }
  13.  


PHP:
скопировать код в буфер обмена
  1.  
  2. index.tpl.php
  3.  
  4. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
  5. <html xmlns="http://www.w3.org/1999/xhtml">
  6. <head>
  7. <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
  8. <title>Документ без названия</title>
  9. </head>
  10.  
  11. <body>
  12. <div>
  13.         <h2><?PHP echo $title; ?></h2>
  14.         <p><?PHP echo $text; ?></p>
  15. </div>
  16.  
  17. </body>
  18. </html>
  19.  
  20.  
  21.  
 
 Top
Zuldek
Отправлено: 25 Декабря, 2012 - 16:01:21
Post Id


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


Покинул форум
Сообщений всего: 2122
Дата рег-ции: Июнь 2010  


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




Если уж использовать свой класс для работы с БД, включите средства фильтрации запросов, чтобы использовать метод query() и не думать о проверке запросов на безопасность.
Откройте PDO, посмотрите как там сделано и напишите свой велик, если так нравиться.

(Отредактировано автором: 25 Декабря, 2012 - 16:02:18)

 
 Top
sKaa
Отправлено: 25 Декабря, 2012 - 16:02:22
Post Id



Частый посетитель


Покинул форум
Сообщений всего: 979
Дата рег-ции: Окт. 2011  
Откуда: Россия г. Нижний Новгород


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

[+]


Здравствуйте. Неправильно.
 
 Top
assd
Отправлено: 25 Декабря, 2012 - 16:07:02
Post Id


Гость


Покинул форум
Сообщений всего: 113
Дата рег-ции: Апр. 2012  


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




Спасибо пошел читать.
 
 Top
assd
Отправлено: 26 Декабря, 2012 - 10:53:34
Post Id


Гость


Покинул форум
Сообщений всего: 113
Дата рег-ции: Апр. 2012  


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




А так получше?

PHP:
скопировать код в буфер обмена
  1.  
  2. define ( SQLCHARSET, "uft8" );  
  3. define ( ALL, "*" );  
  4.  
  5. class DB{
  6.  
  7.         private $dbhost = "localhost";  
  8.     private $dbname = "testproject";  
  9.     private $dbuser = "admin";  
  10.     private $dbpass = "";
  11.         public $db;    
  12.  
  13.         function connectDB(){
  14.                 $this->db = new PDO ( 'mysql:host=' . $this->dbhost . ';dbname=' . $this->dbname, $this->dbuser, $this->dbpass );  
  15.                 $this->db->query ( 'SET character_set_connection = ' . SQLCHARSET . ';' );  
  16.                 $this->db->query ( 'SET character_set_client = ' . SQLCHARSET . ';' );  
  17.                 $this->db->query ( 'SET character_set_results = ' . SQLCHARSET . ';' );
  18.                 return $this->db;
  19.         }
  20.        
  21.         function closeConn(){
  22.                 $this->db = NULL;
  23.                 return $this->db;
  24.         }
  25.        
  26.         function getAllRec($fields, $table){
  27.                 $sql = "SELECT $fields from $table";  
  28.                 $result = $this->db->prepare ( $sql );  
  29.                 $result->execute ();  
  30.                 $tdata = $result->fetchAll ();  
  31.                 foreach ($tdata as $row){  
  32.                         $title = $row['text'];  
  33.                         $text = $row['tittle'];  
  34.                         include "index.tpl.php";
  35.                 }
  36.         }
  37.        
  38. }
  39.  
  40.  


PHP:
скопировать код в буфер обмена
  1.  
  2.         include "classDB.php";
  3.         $bd = new DB();
  4.         $bd->connectDB();
  5.         $table = 'articles';
  6.         $fields = ALL; 
  7.         $bd->getAllRec($fields, $table);
  8.         $bd->closeConn();
  9.  
 
 Top
assd
Отправлено: 27 Декабря, 2012 - 11:40:35
Post Id


Гость


Покинул форум
Сообщений всего: 113
Дата рег-ции: Апр. 2012  


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




Вот немного модефицировал:

PHP:
скопировать код в буфер обмена
  1.  
  2. define ( SQLCHARSET, "uft8" );  
  3.  
  4. class DB{
  5.  
  6.         private $dbhost = "localhost";  
  7.     private $dbname = "testproject";  
  8.     private $dbuser = "admin";  
  9.     private $dbpass = "";
  10.         public $db;    
  11.  
  12.         function connectDB(){
  13.                 $this->db = new PDO ( 'mysql:host=' . $this->dbhost . ';dbname=' . $this->dbname, $this->dbuser, $this->dbpass );  
  14.                 $this->db->query ( 'SET character_set_connection = ' . SQLCHARSET . ';' );  
  15.                 $this->db->query ( 'SET character_set_client = ' . SQLCHARSET . ';' );  
  16.                 $this->db->query ( 'SET character_set_results = ' . SQLCHARSET . ';' );
  17.                 return $this->db;
  18.         }
  19.        
  20.         function closeConn(){
  21.                 $this->db = NULL;
  22.                 return $this->db;
  23.         }
  24.        
  25. }
  26.  


PHP:
скопировать код в буфер обмена
  1.  
  2. define ( ALL, "*" );  
  3. require_once  "classDB.php";
  4.  
  5. class GetContent extends DB {
  6.  
  7.         public $fields = ALL;
  8.         public $table = 'articles';
  9.         public $nameTpl = 'content';
  10.        
  11.         function getAllRec(){
  12.                 $db = $this->connectDB();      
  13.                 $id = $this->IdGet();
  14.                 $sql = " SELECT $this->fields from $this->table WHERE `contentID` = $id ";  
  15.                 $this->closeConn();
  16.                 $result = $db->prepare ( $sql );  
  17.                 $result->execute ();  
  18.                 $tdata = $result->fetchAll ();  
  19.                 foreach ($tdata as $row){
  20.                         $title = $row['tittle'];  
  21.                         $text = $row['text'];  
  22.                         include "/lib/tpl/".$this->nameTpl.".tpl.php";
  23.                 }
  24.         }
  25.         function IdGet(){
  26.                 $id = (int)$_GET['id'];
  27.                 return $id;
  28.         }
  29. }
  30.  


PHP:
скопировать код в буфер обмена
  1.  
  2.         include "/lib/classGetContent.php";
  3.  
  4.         $bd = new GetContent();
  5.         $bd->getAllRec();
  6.  


Я хоть немного приблизился к истине?
 
 Top
sKaa
Отправлено: 27 Декабря, 2012 - 14:16:22
Post Id



Частый посетитель


Покинул форум
Сообщений всего: 979
Дата рег-ции: Окт. 2011  
Откуда: Россия г. Нижний Новгород


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

[+]


Опять плохо... Ещё нужен синглтон!
(Добавление)
assd пишет:
Я хоть немного приблизился к истине?

Ни на йоту!
 
 Top
assd
Отправлено: 27 Декабря, 2012 - 15:22:33
Post Id


Гость


Покинул форум
Сообщений всего: 113
Дата рег-ции: Апр. 2012  


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




Ну по темплейтам щас розбираюсь, + нужно добавить плейсхолдеры к запросу. А вообще по структуре как? или полностью все неправильно?
 
 Top
phpnovichok
Отправлено: 27 Декабря, 2012 - 15:27:12
Post Id


Новичок


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


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




Еще не забудьте проверку на существование PDO. Если не изменяет память он по дефолту только в >5.1


-----
Адепт Е.Попова
 
 Top
sKaa
Отправлено: 27 Декабря, 2012 - 15:56:47
Post Id



Частый посетитель


Покинул форум
Сообщений всего: 979
Дата рег-ции: Окт. 2011  
Откуда: Россия г. Нижний Новгород


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

[+]


phpnovichok, а у вас, если не подводит моя логика 5.4, потому, что DEPRECATED mysql_ появились именно там.

Какие к черту плейсхолдеры?)
Послушайте меня, вам нужно вооружиться очень простыми вещами :
1) гугл (начальный запрос для гугла : "Singleton php примеры $DB")
2) мануалы.
3) терпение. Когда оно начнет иссякать, снова, сначала по пунктам - гугл, маны итд...
(Добавление)
phpnovichok, прошу прощения. Не у вас.

(Отредактировано автором: 27 Декабря, 2012 - 15:57:39)

 
 Top
assd
Отправлено: 27 Декабря, 2012 - 16:02:50
Post Id


Гость


Покинул форум
Сообщений всего: 113
Дата рег-ции: Апр. 2012  


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




Я так понял, что синглтон нужен, чтобы обращаться к классу всего одни раз и предотвратить повторное обращение? Один раз вызвали подключение и один раз его закрыли, а не каждый раз подключаем-закрываем соединение с бд. так?
 
 Top
sKaa
Отправлено: 27 Декабря, 2012 - 16:03:47
Post Id



Частый посетитель


Покинул форум
Сообщений всего: 979
Дата рег-ции: Окт. 2011  
Откуда: Россия г. Нижний Новгород


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

[+]


С DEPRECATED, я что-то погорячился ))) Это из другой темы, а значит у вас может и не быть 5.4
(Добавление)
assd, верно! Синглтон - паттерн одиночка.
Мы один раз создаем экземпляр объекта, а при инициализации объекта (__construct()) выполняем подключение к базе.
Иначе у вас этих подключений может в процессе работы сильно кривых скриптов до нескольких штук накапливаться.
 
 Top
assd
Отправлено: 27 Декабря, 2012 - 16:07:30
Post Id


Гость


Покинул форум
Сообщений всего: 113
Дата рег-ции: Апр. 2012  


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




Вот нашел пример:

http://www[dot]matthewelliston[dot]com/p[dot][dot][dot]-database-class/

щас буду разгребать.
Спасибо.
 
 Top
Мелкий Супермодератор
Отправлено: 27 Декабря, 2012 - 16:08:59
Post Id



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


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


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




sKaa пишет:
если не подводит моя логика 5.4, потому, что DEPRECATED mysql_ появились именно там.

Подводит, это вторая альфа 5.5 только.

assd пишет:
Один раз вызвали подключение и один раз его закрыли, а не каждый раз подключаем-закрываем соединение с бд. так?

Да, для этого.

assd пишет:
define ( ALL, "*" );

Включите вывод ошибок. Здесь - E_NOTICE. А как можно что-то делать, не слушая, что говорит компилятор?


-----
PostgreSQL DBA
 
 Top
assd
Отправлено: 27 Декабря, 2012 - 16:14:38
Post Id


Гость


Покинул форум
Сообщений всего: 113
Дата рег-ции: Апр. 2012  


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




define ( ALL, "*" );

у меня не матюкалось.
 
 Top
Страниц (2): [1] 2 »
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« Вопросы новичков »


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



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

 
Powered by ExBB FM 1.0 RC1. InvisionExBB