Страница 1 из 110

Программирование

СообщениеДобавлено: 02 Январь Воскресенье, 2005 18:25
bello
Предлагаю в этом топе делиться опытом программирования на PHP и MySQL. Вношу свою лепту в общее дело. Может кому будет интересно в папке timoshenko лежит несколько архивчиков, в том числе и phplib. Очень нужная штука, кто решил делать что-то большее нежели домашнюю страничку. Результат применения этой фичи выглядит примерно так http://www.rabota-ukraine.com
Кто заинтересуется, как с работать с библиотекой, пишите, отвечу.

СообщениеДобавлено: 02 Январь Воскресенье, 2005 19:49
Гость
Хотя сейчас на PHP программировать приходится изредка (дописываю расширения в phpNuke), опыта у меня немало.

Участвовал в разработке ряда проектов (и маленьких, и больших).

Участвовал в разработке библиотек классов. Одна из них (бесплатная, но не самая лучшая :-) доступна тут http://torba.sourceforge.net

По поводу phplib-7.4.tar.gz - беглый просмотр выявил "вонючку":
global $debug;

if ($debug) {
printf("<p>table_row()<br>\n");
}

Таких строк - пруд пруди. За такой стиль убивают на месте.

А теперь вопрос для разминки:

есть таблица
user_hotel (user_id INT, hotel_id INT)

ID пользователя и ID общаги, в которой бывал пользователь.

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


P.S. Тема хорошая, только просьба модераторам переместить её в "Общение".

СообщениеДобавлено: 02 Январь Воскресенье, 2005 20:16
bello
У меня опыта стало быть по меньше, набираться стал только с этого лета. А phplib здорово помогло в освоении php, да и вообще в автоматизации сайта и созданию движка. Хотелось бы узнать, чем плох такой стиль:
if ($debug) {
printf("<p>table_row()<br>\n");
}
В общем-то никто ведь не заставляет также писать, благо библиотека сама написана на php.
Теперь насчет SQL запроса. Я для того и сделал топик, чтобы более опытные отвечали на вопросы. Может просветишь, стало интересно.

СообщениеДобавлено: 02 Январь Воскресенье, 2005 21:07
Гость
bello писал(а):Хотелось бы узнать, чем плох такой стиль:
if ($debug) {
printf("<p>table_row()<br>\n");
}


1. Глобальная переменная. (в ОО-библиотеке)
2. Дублирование кода. (вынести в отдельную функцию, метод, класс)
3. Дублирование представления. (а если я захочу выводить это жирным или подчёркнутым?)
4. Некорректное представление. (отсутствует закрывающий тег параграфа).

bello писал(а):В общем-то никто ведь не заставляет также писать, благо библиотека сама написана на php.


Это понятно.
Но ограничения и косости библиотек меня просто бесят.
Свежий пример (Java)
javax.servlet.http.HttpServletRequest
(весьма распространённая библиотека).

getParameterMap
public java.util.Map getParameterMap()Returns a java.util.Map of the parameters of this request. Request parameters are extra information sent with the request. For HTTP servlets, parameters are contained in the query string or posted form data.
Returns:
an immutable java.util.Map containing parameter names as keys and parameter values as map values. The keys in the parameter map are of type String. The values in the parameter map are of type String array.


И что же мы имеем - оказывается этот метод возвращает то, что описано в документации всегда, кроме параметров, переданных через multipart/form-data форму (для аплоада файлов).
Убил полдня, чтобы найти это и написать обходной путь.

bello писал(а):Теперь насчет SQL запроса. Я для того и сделал топик, чтобы более опытные отвечали на вопросы. Может просветишь, стало интересно.


На самом деле, ничего сложного, но встряхивает сильно.
Попробуй найти ответ самостоятельно.

СообщениеДобавлено: 03 Январь Понедельник, 2005 03:19
vas1
az
ы.ыыыы... ты бы ещё первого числа подкинул бы эту задачку :))) я MySQL не очень хорошо знаю... на уровне SELECT, UPDATE, INSERT, DELETE а здесь я смотрю нужно встроенные функции использовать... типа count()... не сейчас.. :(
bello
по поводу этой библиотеки сказать не могу ничего кроме того, что она старенькая уже... и завести её не удалось.... копаться сейчас ой как лень... да и не хочется...
лучше скажите, кто какой шаблонной системой пользуется. и кто чё думает по поводу TYPO3 - стоит ли в ней копаться? то есть можно ли её применять для профессионального использования?

СообщениеДобавлено: 03 Январь Понедельник, 2005 11:07
bello
А где ты этот шаблонизатор брал? Скинь линк. Лично я пользуюсь шаблонизатором от phplib, очень доволен. Есть еще такие как FastTemplate и Smarty, но они мне меньше нравятся, FastTemplate для замены переменных использует ereg, что работает медленнее, чем preg. Это все, что я знаю.

СообщениеДобавлено: 03 Январь Понедельник, 2005 11:19
bello
Я тут в инете покопался и нашел русский форум про TYPO3. Линк:
http://www.typo3.ru/general.html

Говорят он чертовски сложный. Можешь почитать на http://drupal.ru/node/105

СообщениеДобавлено: 03 Январь Понедельник, 2005 11:25
Гость
vas1 писал(а):ы.ыыыы... ты бы ещё первого числа подкинул бы эту задачку :))) я MySQL не очень хорошо знаю... на уровне SELECT, UPDATE, INSERT, DELETE а здесь я смотрю нужно встроенные функции использовать... типа count()... не сейчас.. :(


Я не спешу.

vas1 писал(а):лучше скажите, кто какой шаблонной системой пользуется.


В PHP использовали 2 подхода (собственные).

1. Глобальные вставки.
Класс Template.
Вставки - ассоциативный массив.
Шаблон - текст, переменные в виде {%variable_name%}.
Когда парсим шаблон все переменные шаблона меняются на значения вставок, если нет, то на пустую строку.
Можно запарсить шаблон в переменную вставки и т.д.

2. Защищённые шаблоны и локальные вставки.
Каждый шаблон представляется отдельным объектом, имеет свои собственные вставки, валидируются имена переменных в тексте шаблона.


vas1 писал(а):и кто чё думает по поводу TYPO3 - стоит ли в ней копаться? то есть можно ли её применять для профессионального использования?


CMS?
Не знаю. Не использовал. Может и стоит.
Можно ли применять - нужно копать и смотреть, я бы в первую очередь обратил внимание на вопрос "на сколько легко добавить туда отсутствующую функциональность или подкорректировать имеющуюся?"

СообщениеДобавлено: 15 Январь Суббота, 2005 19:01
Гость
Итак, вопрос всё ещё открыт:

есть таблица
user_hotel (user_id INT, hotel_id INT)

ID пользователя и ID общаги, в которой бывал пользователь.

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



Этот вопрос поставил в тупик всех студентов ДонГИИИ, которым я его задавал (2, 3 и 5 курсы).
Я так понимаю, что здесь много людей из ДПИ.
Меня интересует как там обстоит с этим делом.

СообщениеДобавлено: 15 Январь Суббота, 2005 19:36
Гость
az писал(а):Итак, вопрос всё ещё открыт:

есть таблица
user_hotel (user_id INT, hotel_id INT)

ID пользователя и ID общаги, в которой бывал пользователь.

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

У меня есть вопрос:на чем мы делаем?На SQL или TSQL?Или какой там диалект у MySQL?

СообщениеДобавлено: 15 Январь Суббота, 2005 20:09
Гость
:arrow: Maz!1a

На самом деле, это не трудный вопрос.
Просто я сам на нём я споткнулся при жёстком лимите времени и понял, что это хороший тестовый вопрос по знанию SQL.


:arrow: Par2zan

Ограничений нет.

СообщениеДобавлено: 15 Январь Суббота, 2005 21:07
ded
az писал(а):Итак, вопрос всё ещё открыт:

есть таблица
user_hotel (user_id INT, hotel_id INT)

ID пользователя и ID общаги, в которой бывал пользователь.

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



Этот вопрос поставил в тупик всех студентов ДонГИИИ, которым я его задавал (2, 3 и 5 курсы).
Я так понимаю, что здесь много людей из ДПИ.
Меня интересует как там обстоит с этим делом.


SELECT user_id FROM user_hotel;
Данный запрос выведет ВСЕХ пользователей, в том числе и того, который побывал во всех общагах. (если такой имееца) :)

СообщениеДобавлено: 15 Январь Суббота, 2005 21:12
Гость
ded писал(а):SELECT user_id FROM user_hotel;
Данный запрос выведет ВСЕХ пользователей, в том числе и того, который побывал во всех общагах. :)



Да, выведет.
Только толку?

Нужно узнать кто конкретно (user_id) побывал во всех общагах.
Интересует любой из побывавших.

re

СообщениеДобавлено: 15 Январь Суббота, 2005 22:48
ded
SELECT user_id FROM user_hotel WHERE user_id IN (hotel_id);

Re: re

СообщениеДобавлено: 15 Январь Суббота, 2005 23:00
Гость
ded писал(а):SELECT user_id FROM user_hotel WHERE user_id IN (hotel_id);



Это вернёт тех пользователей, чьи номера совпадают с одним из общежитий, которые они посетили.

Т.е. для таблицы

1 1
1 2
1 3
2 1
2 2
3 1

будет возвращено две записи
1
2

СообщениеДобавлено: 16 Январь Воскресенье, 2005 16:11
vitalyb
az
А как коды общаг кодируются? ну, скажем от 1 до 500 по порядку. или?

СообщениеДобавлено: 16 Январь Воскресенье, 2005 16:15
Гость
vitalyb писал(а):az
А как коды общаг кодируются? ну, скажем от 1 до 500 по порядку. или?



Ну хорошо.

Упростим задачу.

Для простоты положим, что коды заполняют диапазон целых чисел от 1 и до 10.

Известно, что всего общаг - 10.

СообщениеДобавлено: 16 Январь Воскресенье, 2005 18:46
vitalyb
az
Ну, пусть так будет.

SELECT user_id FROM (SELECT user_id, SUM(hotel_id) AS q FROM user_hotel GROUP BY user_id) WHERE q=55;

Критика велком. :) но с sql я довольно редко и неглубоко сталкиваюсь...

СообщениеДобавлено: 16 Январь Воскресенье, 2005 18:55
Гость
vitalyb писал(а):az
Ну, пусть так будет.

select user_id from (select user_id, sum(hotel_id) as q from user_hotel group by user_id) where q=55;

Критика велком. :) но с sql я довольно редко и неглубоко сталкуюсь...



Внутренние подзапросы нельзя помещать в предложения from, а только в where и having (для оператора select).

Т.е запрос не работает.

Кроме того, зачем в подзапросе вычисляется сумма номеров, если можно было подсчитывать их количество (count)?

В общем-то, близко подошёл к ответу.

СообщениеДобавлено: 16 Январь Воскресенье, 2005 19:05
vitalyb
Ну, по поводу "не работает", это от диалекта зависит. И у меня работает ;)

Код: Выделить всё
sqlite> select * from user_hotel;
1|2
2|5
4|1
4|2
4|3
4|4
4|5
4|6
4|7
4|8
4|9
4|10
5|10
sqlite> SELECT user_id FROM (SELECT user_id, SUM(hotel_id) AS q FROM user_hotel GROUP BY user_id) WHERE q=55;
4


количество... да, действительно. :)

Может пусть студенты ДПИ дальше отшлифуют?