PHP.SU

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

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

> Найдено сообщений: 55
Данил Банаев Отправлено: 24 Ноября, 2011 - 23:06:47 • Тема: Доска объявлений • Форум: SQL и Архитектура БД

Ответов: 2
Просмотров: 34
Доброго времени суток всем.
Делаю маленькую базу для доски обхъявлений.

Существует объявление у него есть идентификатор и прочие атрибуты, включая имя категории и имя раздела.

Существует справочник с категориями, 2 категории могу быть с одинаковыми именами, но должны быть в разных разделах.

В таблице с разделами имя раздела должно быть уникальным

Мне кажется я не правильно связал таблицы, что можно было решить более рационально.

Все ли правильно?
Спасибо.

CODE (SQL):
скопировать код в буфер обмена
  1. CREATE TABLE parts(
  2.         name VARCHAR(20) NOT NULL,
  3.         description TEXT NOT NULL,
  4.         CONSTRAINT pkIdParts PRIMARY KEY(name)
  5. );
  6. CREATE TABLE category(
  7.         name VARCHAR(20) NOT NULL,
  8.         part VARCHAR(20) NOT NULL,
  9.         CONSTRAINT pkIdCat PRIMARY KEY(name,part),
  10.         CONSTRAINT fkCatagoryPart FOREIGN KEY(part)
  11.                 REFERENCES parts(name)
  12. );
  13. CREATE TABLE ads(
  14.         id INT UNSIGNED NOT NULL AUTO_INCREMENT,
  15.         name VARCHAR(20) NOT NULL,
  16.         text TEXT NOT NULL,
  17.         cat VARCHAR(20) NOT NULL,
  18.         part VARCHAR(20) NOT NULL,
  19.         email VARCHAR(20) NOT NULL,
  20.         fio VARCHAR(50) NOT NULL,
  21.         CONSTRAINT pkIdAds PRIMARY KEY(id),
  22.         CONSTRAINT fkAdsCat FOREIGN KEY(cat,part)
  23.                 REFERENCES category(name,part)
  24. );
Данил Банаев Отправлено: 24 Ноября, 2011 - 14:51:10 • Тема: Доска объявлений • Форум: Вопросы новичков

Ответов: 2
Просмотров: 128
не знаю как из таблицы объявлений исключить раздел, не нарушая связей.
про справочную по категориям можно поподробней?
Данил Банаев Отправлено: 24 Ноября, 2011 - 14:29:55 • Тема: Доска объявлений • Форум: Вопросы новичков

Ответов: 2
Просмотров: 128
Доброго времени суток всем.
Делаю маленькую базу для доски обхъявлений.

Существует объявление у него есть идентификатор и прочие атрибуты, включая имя категории и имя раздела.

Существует справочник с категориями, 2 категории могу быть с одинаковыми именами, но должны быть в разных разделах.

В таблице с разделами имя раздела должно быть уникальным

Все ли правильно?

CODE (SQL):
скопировать код в буфер обмена
  1. CREATE TABLE parts(
  2.         name VARCHAR(20) NOT NULL,
  3.         description TEXT NOT NULL,
  4.         CONSTRAINT pkIdParts PRIMARY KEY(name)
  5. );
  6. CREATE TABLE category(
  7.         name VARCHAR(20) NOT NULL,
  8.         part VARCHAR(20) NOT NULL,
  9.         CONSTRAINT pkIdCat PRIMARY KEY(name,part),
  10.         CONSTRAINT fkCatagoryPart FOREIGN KEY(part)
  11.                 REFERENCES parts(name)
  12. );
  13. CREATE TABLE ads(
  14.         id INT UNSIGNED NOT NULL AUTO_INCREMENT,
  15.         name VARCHAR(20) NOT NULL,
  16.         text TEXT NOT NULL,
  17.         cat VARCHAR(20) NOT NULL,
  18.         part VARCHAR(20) NOT NULL,
  19.         email VARCHAR(20) NOT NULL,
  20.         fio VARCHAR(50) NOT NULL,
  21.         CONSTRAINT pkIdAds PRIMARY KEY(id),
  22.         CONSTRAINT fkAdsCat FOREIGN KEY(cat,part)
  23.                 REFERENCES category(name,part)
  24. );


Далее я вывожу разделы с категориями, тоже хотелось узнать все ли правильно?

PHP:
скопировать код в буфер обмена
  1. $obj=new Board();
  2. $sql="SELECT name FROM parts";
  3. $parts=$obj->assocArrayQuery($sql);
  4. foreach($parts as $part){
  5.         echo "<u><b>".$part["name"]."</b></u><br>";
  6.         $sql="SELECT name FROM category WHERE part='{$part["name"]}'";
  7.         $category=$obj->assocArrayQuery($sql);
  8.         foreach($category as $cat){
  9.                 echo $cat["name"]."<br>";
  10.         }
  11. }
Данил Банаев Отправлено: 23 Ноября, 2011 - 22:23:59 • Тема: Проблема с внешним ключом • Форум: Вопросы новичков

Ответов: 2
Просмотров: 154
EuGen пишет:
Нарушена. Вы пытаетесь создать внешний ключ на поле VARCHAR(20), который будет ссылаться на поле типа INT
Типы полей должны совпадать.

Вот черт.
Спасибо большое.
Из-за такой мелочи еще и тему создал
(Добавление)
Сделал вот так.
Можете проверить правильна ли связь?
Ни разу не связывал сотавные первичные ключи.
Внешний ключ тоже должен быть составной?
CODE (SQL):
скопировать код в буфер обмена
  1.  
  2. CREATE TABLE parts(
  3.         name VARCHAR(20) NOT NULL,
  4.         description TEXT NOT NULL,
  5.         CONSTRAINT pkIdParts PRIMARY KEY(name)
  6. );
  7. CREATE TABLE category(
  8.         name VARCHAR(20) NOT NULL,
  9.         part VARCHAR(20) NOT NULL,
  10.         CONSTRAINT pkIdCat PRIMARY KEY(name,part),
  11.         CONSTRAINT fkCatagoryPart FOREIGN KEY(part)
  12.                 REFERENCES parts(name)
  13. );
  14. CREATE TABLE ads(
  15.         id INT UNSIGNED NOT NULL AUTO_INCREMENT,
  16.         name VARCHAR(20) NOT NULL,
  17.         text TEXT NOT NULL,
  18.         cat VARCHAR(20) NOT NULL,
  19.         part VARCHAR(20) NOT NULL,
  20.         email VARCHAR(20) NOT NULL,
  21.         fio VARCHAR(50) NOT NULL,
  22.         CONSTRAINT pkIdAds PRIMARY KEY(id),
  23.         CONSTRAINT fkAdsCat FOREIGN KEY(cat,part)
  24.                 REFERENCES category(name,part)
  25. );
Данил Банаев Отправлено: 23 Ноября, 2011 - 22:02:15 • Тема: Проблема с внешним ключом • Форум: Вопросы новичков

Ответов: 2
Просмотров: 154
Всем здравствуйте.
Помогите разобраться с ошибкой.
Создаю по очереди 3 таблицы, первые 2 создаются при создании 3-й вылетает ошибка.
ERROR 1005 (HY000): Can't create table
В гугле пишут что ошибка кроется во внешних ключах, но вроде логика не нарушена все правильно.
Спасибо
CODE (SQL):
скопировать код в буфер обмена
  1. CREATE TABLE parts(
  2.                 name VARCHAR(20) NOT NULL,
  3.                 description TEXT NOT NULL,
  4.                 src VARCHAR(20) NOT NULL,
  5.                 CONSTRAINT pkName PRIMARY KEY(name)
  6.         );
  7.         CREATE TABLE category(
  8.                 id_cat INT UNSIGNED NOT NULL AUTO_INCREMENT,
  9.                 name VARCHAR(20) NOT NULL,
  10.                 part VARCHAR(20) NOT NULL,
  11.                 CONSTRAINT pkId_cat PRIMARY KEY(id_cat),
  12.                 CONSTRAINT fkCatagoryPart FOREIGN KEY(part)
  13.                         REFERENCES parts(name)
  14.         );
  15.         CREATE TABLE ads(
  16.                 id_ad INT UNSIGNED NOT NULL AUTO_INCREMENT,
  17.                 title VARCHAR(20) NOT NULL,
  18.           type ENUM('demand','proposal') NOT NULL,
  19.                 datetime INT UNSIGNED NOT NULL,
  20.                 text TEXT NOT NULL,
  21.                 cat VARCHAR(20) NOT NULL,
  22.                 email VARCHAR(20) NOT NULL,
  23.                 fio VARCHAR(50) NOT NULL,
  24.                 address VARCHAR(50) NOT NULL,
  25.                 CONSTRAINT pkId_ad PRIMARY KEY(id_ad),
  26.                 CONSTRAINT fkAdsCat FOREIGN KEY(cat)
  27.                         REFERENCES category(id_cat)
  28.         );
Данил Банаев Отправлено: 23 Ноября, 2011 - 11:53:09 • Тема: Вопрос по процедурам • Форум: SQL и Архитектура БД

Ответов: 1
Просмотров: 15
Всем здравствуйте.
Вопрос:
Процедура должна обязательно что-то возвращать?
Я хочу создать 3 связанные таблицы,т.е. пихаю последовательность запросов в процедуру и далее ее вызываю.
Всели правильно делаю? Спасибо.
PHP:
скопировать код в буфер обмена
  1.  
  2. $sql="
  3. DELIMITER |
  4. CREATE PROCEDURE DB()
  5. BEGIN
  6.         CREATE TABLE parts(
  7.                 name VARCHAR(20) NOT NULL,
  8.                 description TEXT NOT NULL,
  9.                 src VARCHAR(20) NOT NULL,
  10.                 CONSTRAINT pkName PRIMARY KEY(name)
  11.         );
  12.         CREATE TABLE category(
  13.                 id_cat INT UNSIGNED NOT NULL AUTO_INCREMENT,
  14.                 name VARCHAR(20) NOT NULL,
  15.                 part VARCHAR(20) NOT NULL,
  16.                 CONSTRAINT pkId_cat PRIMARY KEY(id_cat),
  17.                 CONSTRAINT fkCatagoryPart FOREIGN KEY(part)
  18.                         REFERENCES parts(name)
  19.         );
  20.         CREATE TABLE ads(
  21.                 id_ad INT UNSIGNED NOT NULL AUTO_INCREMENT,
  22.                 title VARCHAR(20) NOT NULL,
  23.                 type ENUM('demand','proposal') NOT NULL,
  24.                 datetime INT UNSIGNED NOT NULL,
  25.                 text TEXT NOT NULL,
  26.                 cat VARCHAR(20) NOT NULL,
  27.                 email VARCHAR(20) NOT NULL,
  28.                 fio VARCHAR(50) NOT NULL,
  29.                 address VARCHAR(50) NOT NULL,
  30.                 CONSTRAINT pkId_ad PRIMARY KEY(id_ad),
  31.                 CONSTRAINT fkAdsCat FOREIGN KEY(cat)
  32.                         REFERENCES category(id_cat)
  33.         );
  34.         CREATE INDEX ixCat ON ads(cat);
  35.         CREATE INDEX ixPart ON category(part);
  36. END;
  37. |
  38. DELIMITER ;
  39. ");
  40. $sql="CALL DB()";
Данил Банаев Отправлено: 22 Ноября, 2011 - 22:30:42 • Тема: Хранимые процедуры MySQL & PHP • Форум: SQL и Архитектура БД

Ответов: 6
Просмотров: 53
Процедура обязательно должна что-то возвращать?
Или просто в нее можно запихать серию запросов не требующих что то вернуть?
Данил Банаев Отправлено: 21 Ноября, 2011 - 12:01:17 • Тема: Класс для работы с mysql • Форум: Напишите за меня, пожалуйста

Ответов: 10
Просмотров: 88
Мелкий пишет:
Данил Банаев пишет:
Работает, просто хотелось объеденить 2 метода или так как сейчас лучше?

Я бы сказал, что это больше на любителя.
Сам предпочитаю 2 класса. Первый, следуя singleton или factory, оперирует непосредственно соединением с базой и реализует самый минимум методов (что даёт возможность обращаться к базе откуда угодно без глобальных переменных и гарантирует открытие только 1 соединения к базе), второй - результат запроса (реализует несколько интерфейсов массивов).
А в методе query - разбираю, что вернул запрос:
0) если false - кидается exception
1) если true - возвращаю true
2) если ресурс - создаю объект результата на основе этого ресурса и возвращаю его.

Данил Банаев пишет:
И еще на счет закрытия соединения вопрос, как лучше метод реализовать?

Как правило, реализуются оба.
Отдельный метод закрытия соединения и в деструкторе вызывается этот метод. В этом случае получается корректное закрытие соединения как автоматически при завершении скрипта, так и возможность закрыть его руками.


Большое спасибо.
Направил в нужное русло.
Данил Банаев Отправлено: 21 Ноября, 2011 - 11:11:14 • Тема: Класс для работы с mysql • Форум: Напишите за меня, пожалуйста

Ответов: 10
Просмотров: 88
Мелкий пишет:
Вы в каждой итерации делаете заново запрос к базе, т.е. цикл закончится только тогда, когда база вернёт 0 записей.

Если коротко:
PHP:
скопировать код в буфер обмена
  1. $res = $this->query($sql);
  2. while($row=mysql_fetch_assoc($res)){
  3.                         $arr[]=$row;
  4.                 }


Вот исправил
Работает, просто хотелось объеденить 2 метода или так как сейчас лучше?
И еще на счет закрытия соединения вопрос, как лучше метод реализовать?
PHP:
скопировать код в буфер обмена
  1.  
  2. <?PHP
  3. class DB{
  4.         protected $_db;
  5.         function __construct($host,$login,$password){
  6.                 $this->_db=mysql_connect($host,$login,$password) or die("Ошибка соединения с сервером БД");
  7.                 mysql_select_db("gbook") or die(mysql_error());
  8.         }
  9.         function __destruct(){
  10.                 mysql_close($this->_db);
  11.         }
  12.         function query($sql){
  13.                 mysql_query($sql) or die(mysql_error());
  14.         }
  15.         function select($sql){
  16.                 $arr=array();
  17.                 $res=mysql_query($sql) or die(mysql_error());
  18.                 while($row=mysql_fetch_assoc($res)){
  19.                         $arr[]=$row;
  20.                 }
  21.                 return $arr;
  22.         }
  23. }
  24. $o1=new DB("localhost","root","");
  25. //$o1->query("insert into msg(name,email,msg,datetime,ip) values('asdas','dsdf@sdf.cv','dggdfg',24343,'123.9.9.4')");
  26.  
  27. $arr=$o1->select("select * from msgs");
  28.  
  29. foreach($arr as $el){
  30.         foreach($el as $el1){
  31.                 echo $el1."<br>";
  32.         }
  33. }
  34. ?>
  35.  

(Добавление)
Вообще я хотел из процедурной связки 2-х ф-й сделать так же с методами
PHP:
скопировать код в буфер обмена
  1.  
  2. function query($sql){
  3.    $res=mysql_query($sql) or die(mysql_error());
  4.    return db2Array($res);
  5. }
  6. function db2Array($data){
  7.     $arr=array();
  8.     while($row=mysql_fetch_assoc($data)){
  9.         $arr[]=$row;
  10.     }
  11.     return $arr;
  12. }
Данил Банаев Отправлено: 21 Ноября, 2011 - 10:23:37 • Тема: Класс для работы с mysql • Форум: Напишите за меня, пожалуйста

Ответов: 10
Просмотров: 88
все равно не понимаю Огорчение
Данил Банаев Отправлено: 21 Ноября, 2011 - 10:03:58 • Тема: Класс для работы с mysql • Форум: Напишите за меня, пожалуйста

Ответов: 10
Просмотров: 88
нет я потом объект создаю для пробы и там уже параметры ввожу, сс соединением нет проблем и с запросом тоже
Данил Банаев Отправлено: 21 Ноября, 2011 - 09:57:57 • Тема: Класс для работы с mysql • Форум: Напишите за меня, пожалуйста

Ответов: 10
Просмотров: 88
Fatal error: Maximum execution time of 30 seconds exceeded
пишет
не знаю чем он мог перегрузится
табличка небольшая с 3-мя записями, попробовал по одному чтолбцу массив вытянуть, даже так виснет
Данил Банаев Отправлено: 21 Ноября, 2011 - 09:13:23 • Тема: Класс для работы с mysql • Форум: Напишите за меня, пожалуйста

Ответов: 10
Просмотров: 88
Доброго времени суток.
Решил написать свой несложный класс для частых задач :
-соединение
-закрытие
-отправка запроса
-получение ассоциативного массива

выдает ошибку при вызове метода, который возвращает массив
пишет что прошло ожидание 30 сек и сервер перегружен((
PHP:
скопировать код в буфер обмена
  1.  
  2. <?PHP
  3. class DB{
  4.         protected $_db;
  5.         function __construct($host,$login,$password){
  6.                 $this->_db=mysql_connect($host,$login,$password) or die("Ошибка соединения с сервером БД");
  7.                 mysql_select_db("gbook") or die(mysql_error());
  8.         }
  9.         function __destruct(){
  10.                 unset($this->_db);
  11.               /*
  12.               function close(){
  13.                             mysql_close($this->_db);
  14.               }
  15.               */
  16.         }
  17.         function query($sql){
  18.                 $res=mysql_query($sql) or die(mysql_error());
  19.                             return $res;
  20.         }
  21.         function getArray($sql){
  22.                 $arr=array();
  23.                 while($row=mysql_fetch_assoc($this->query($sql))){
  24.                         $arr[]=$row;
  25.                 }
  26.                 return $arr;
  27.         }
  28. }
  29. ?>
  30.  

прошу помощи, желетельно с объяснениями.
еще интересует как реализовать лучше метод с закрытием соединения, так как написал изначально, так как в коментах или вообще по другому?
Спасибо заранее за помощь
Данил Банаев Отправлено: 21 Октября, 2011 - 15:04:17 • Тема: Для портфолио • Форум: FreeLance

Ответов: 7
Просмотров: 1969
Хотелось с реальными заказчиками но пока за бесплатно
И с минимальными запросами.
Не ясно видимо выразился.
А то что трудится надо это итак понятно
Данил Банаев Отправлено: 21 Октября, 2011 - 07:03:06 • Тема: Для портфолио • Форум: FreeLance

Ответов: 7
Просмотров: 1969
Просто хотелось с более опытным человеком поработать.
И хотелось бы с реальными заказами работать, или написать бесплатный скрипт тоже вариант?

Страниц (4): « 1 2 [3] 4 »
Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS  RSS

 
Powered by ExBB FM 1.0 RC1. InvisionExBB