-
Posts
155 -
Joined
-
Last visited
Content Type
Profiles
Forums
Calendar
Store
Posts posted by fiver
-
-
fiver, хотел тебе помочь, но чувствую что запутался
Как так получается что у тебя один и тот же человек в одной и той же категории, в одной и той же подкатегории, в одной и той же группе имеет несколько очков (т.е. несколько записей)?
Я так понимаю это ошибка проектирования базы данных
Пример очень не удачный, при правильно проектировании дублирование не может быть (ну или не должно)
И тут вообще не зачем работать с массивом. Нужно изначально делать нужный запрос к базе. Например, сделать функцию которой отдавать категорию+подкатегорию+возраст и получать массив готового результата
Это не ошибка. Каждый участник может выложить на суд несколько работ.
Например у тебя есть 10 классных фоток и ты не знаешь какая лучше и выкладываешь на голосование все фото.
А так как у других участников фотки говно, то очень часто получается что у одного участника все 3 места за 3 разных работы.
Но он и так уже победитель и у него 1 место. поэтому 2 и 3 место должны занять другие участники, это только в 1 категории 1-1-1.
В 1-2-1 , это уже другие работы по другой теме, но в той же возрастной категории, он опять может выложить свои работы и опять занять какое то место.
Вообще сайт делал не я (меня попросили помочь с определением победителей, вот я и снашаюсь).
Там конечно есть косяки. Например информация об участнике хранится в другой таблице, и связь с таблицей с работами и номинациями осуществляется по id участника (общее поле для 2-х таблиц). Но весь прикол в том, что бы выложить работу, участник каждый раз регится заново. В итоге у участника не 1 id, а целая куча.
Поэтому надо отсекать участников не по их id, а сравнивать 2 поля Имя и Фамилия.
А они еще могут там и ошибку сделать или 1 раз написать Иван, другой Ваня, третий ИВАН.
Короче одни косяки.
-
Ну так спрашивай.. Я в своём примере несколько подходов к обработки данных в строке предложилСмысл в том, что бы научиться работать со строками, отсекать лишнее, изымать нужное.
То что сделал ты, круто.
Кратенько, сам бы я до такого не дошел. Это надо видеть готовые примеры и на них учиться.
Вот такой еще вопрос.
У меня есть таблица, которая содержит названия всех улиц Москвы, и относит их соответственно к нужным АО и районам.
Но данные содержатся в таком виде -
Большой Николопесковский переулок
Ленина улица
Лесная 2-я улица
А в ексель улицы в виде
Большой Николопесковский пер.
Ленина ул.
2-я Лесная ул.
С пер. ул. пр. пл. и т.п. я решил проблему просто.
С помощью str_replace заменяю их на полное наименование, т.е. ул. на улица и т.д.
Там немного всего, еще тупики, набережные, мосты, проезды, поселки ну и т.д.
А вот как быть с Лесная 2-я на 2-я Лесная
Или Микраройон 3-й Зеленоград на
3-й Микраройон Зеленограда.
У меня на данный момент 4243 улиц, и частенько встречаются перемена мест в названиях.
-
array_unique(); вам в помощь.
А как его заставить работать по нескольким фиксированным ключам?
В частности для каждой номинации 5 параметров. Три определяют саму номинацию, плюс 2 параметра Имя и Фамилия.
Можно примерчик.
-
Ну да, работа с CVS.
Я и извлекаю из cvs файла данные, бью на строки и вгоняю эти строки в переменную, которую потом потрошу на нужные мне составляющие, которые вношу в нужном виде в БД. Так что бы в результате и сортировка работала и поиск по данным и прочее. Еще есть автоопределение района и АО по названию улицы и т.п.
Смысл не в том, что бы взять готовое решение. Смысл в том, что бы научиться работать со строками, отсекать лишнее, изымать нужное. Можно это и самому освоить. Что я и делаю параллельно общению на форуме. Но всегда хочется узнать как это делают профи, что бы оценить свои решения и оптимизировать их.
Поэтому большое спасибо всем кто откликнулся.
По поводу в "в теге <a> стоит nofollow", обратил внимание, что почему то не всегда это срабатывает.
Вот если параметр применить ко всей странице, то результат есть, а к одной ссылке, частенько не работает.
Т.е. делал ссылки с одного своего сайта на другой с nofollow, а когда захожу в мои сайты в яндекс и смотрю внешние ссылки, то ссылка там есть.
Да и с форумов ссылки тоже всегда добавляются.
-
Помогите сделать выборку из БД. Сделал кучу вложенных циклов. Вроде все работает, но в некоторых случаях получается не то что надо. Причем не понятно почему.
Дела обстоят так:
Есть куча конкурсантов, все делятся по категориям, подкатегориям и возрасту.
Например 1-1-1 = 1 категория, 1 подкатегория, 1 возраст, там 100 участников
Или 7-14-4 = 7 категория, 14 подкатегория, 4 возраст, там 50 участников,
а в 15-15-2, может быть всего один участник.
Где то участников вообще нет.
У каждого участника есть Фамилия и какое то кол-во голосов.
Что бы вывести всех участников
я делаю так:
while($w_cat < 20)
{
while($w_sub < 18)
{
while($age < 6)
{
$query = "SELECT * FROM tbl WHERE w_cat=$w_cat and w_sub=$w_sub and age=$age ORDER BY work_count DESC";
$age++;
}
$age = 1;
$w_sub++;
}
$w_sub = 1;
$w_cat++;
}А мне надо вывести работы победителей в каждой категории, подкатегории и возрасте, но с такими условиями:
1. Всего - 3 места;
2. Если участники получили одинаковое к-во голосов, то они делят это место, неважно сколько их.
3. Один участник награждается 1 раз в одной номинации и не может занять несколько мест, только одно самое высокое.
ДЛЯ ПРИМЕРА ИМЕЕМ в 1-1-1
Вася - 200 голосов
Петя - 200 голосов
Коля - 200 голосов
Вася - 150 голосов
Вася - 100 голосов
Дима - 50 голосов
Толя - 50 голосов
Женя - 25 голосов
Гоша - 10 голосов
Результат:
1 место - Вася - 200 голосов
1 место - Петя - 200 голосов
1 место - Коля - 200 голосов
2 место - Дима - 50 голосов
2 место - Толя - 50 голосов
3 место - Женя - 25 голосов
Т.е. Вася по идее занял и 2 место и 3, но так как у него уже 1 место, то все, он убирается с других мест, а номинируются те, кто ниже его.
-
главное что работает =)
хотя
trim(str_replace('п','',str_replace('т','',$vtok[2])));
меня пугает =)
а не секрет зачем тогда trim
trim, что бы удалить пробелы спереди и сзади. После удаления п или т, после цифры образуется пробел, который до этого разделял цифру и букву.
-
не знаю на сколько это правильно и оптимально
if(strpos($blablalba[2],'т')){
$minut-ot-metro = str_replace ('т', ' ', $blablalba[2]);
$kak = 'Транспортом';
}
else {
$minut-ot-metro = str_replace ('п', ' ', $blablalba[2]);
$kak = 'Пешком';
}на работоспособность и правильность не проверял, может что то накосячил с аргументами, но суть думаю ясна
думаю не логично заменять символ на пробел, а потом этот пробел удалять тримом - ведь он может удалять не только пробелы, но и символы которые ему указать 2м параметром
if(strpos($blablalba[2],'т')){
$minut-ot-metro = trim ($blablalba[2], 'т');
$kak = 'Транспортом';
}
else {
$minut-ot-metro = trim($blablalba[2], 'п');
$kak = 'Пешком';
}так будет более красиво
Второй вариант выглядит более симпотно.
Для сравнения как это сделал я сам.
Не судите строго
$min_ot_m = trim(str_replace('п','',str_replace('т','',$vtok[2])));
$kak_ot_m = strpos($vtok[2], 'п');
if ($kak_ot_m === false) $kak_ot = 'Транспортом';
else $kak_ot = 'Пешком';Что касаемо замены, я менял не на пробел, а на пустой символ, т.е. просто удалял (в ковычках нет ничего '' , а не ' ').
а результат функции strpos проверял на истину ложь.
-
Предложенный ранее $blablalba = explode (';', $value) работает как надо.
теперь возникают частые нюансы.
например разбить 5п или 15т на 2 переменных 1-я только цифра, и 2-я в зависимости от буквы п или т = пешком или транспортом.
Только цифру можно оставить например 2 раза воспользовавшись функцией str_replace и заменив т и п на '' пусто.
А с т и п, проверить наличие на символ т, если есть, то транспортом, если нет, то значит пешком.
Это вот с моей точки зрения, как можно сделать.
Просто интересно узнать, а как правильно и оптимально это сделать.
И вообще вот такая запись работает, но имеет ли она право на жизнь, или можно сделать все проще?
$min_ot_m = trim(str_replace('п','',str_replace('т','',$vtok[2]))); -
Если значения в строке value идут в строго определенном порядке и розделены ";", то можно разбить ее на массив при помощи функции explode(';', $value), а потом уже заносить в переменные индексированные элементы массива
$blablalba = explode (';', $value)
$kol-komnat = $blablalba[0]
..........
$lift-gruz = $blablalba[n]Вас понял.
А я вот нарыл вот такую функцию
$vtok = strtok($value, ';');
while ($vtok)
{
echo $vtok;
echo "<br>";
$vtok = strtok(";");
}
тоже получается разбил на массив.
Но если пишу
echo $vtok[1];
Выводится какая то хренатень.
А так все выводится прям от ; к ;
-
Здравствуйте!
Столкнулся с задачей переноса данных из exel в уже существующую БД.
Да вот незадача, нихрена не умею работать со строками.
Возникает куча вопросов.
Я понимаю, что работа со стоками это важный атрибут php, но вот с опытом беда.
Задачка такая, преобразовать строку в переменные которые я смог бы внести в БД.
Строка имеет вид:
$value = "2;Цветной бульвар м.;5п;Печатников пер.;3;2/6 М;70,6/40/15;Б;П+Г;"
что к чему: 2- кол-во комнат, 5п - 5 минут пешком от метро, 2/6 М - 2 этаж 6 эт.зд. монолитного, 60/40/15 - площадь общ./жил/кухня, Б - балкон, П+Г (лифты пассажирски и грузовой).
Ну там еще куча всего в строке, но хотя бы разобраться с этим.
надо получить:
$kol-komnat = 2;
$metro = 'Цветной бульвар';
$minut-ot-metro = 5;
$kak = 'пешком';
$ul = 'Печатников пер.';
$dom = '3';
$etazh = 2;
$etazhnost = 6;
$zdanie = 'monolit';
$sq-ob = 60;
$sq-zh = 40;
$sq-kuh = 15;
$balkon = 'yes';
$lift-pas = 'yes';
$lift-gruz = 'yes';
ну и т.д, т.п.
Готов разобрать каждый шаг отдельно.
Например шаг 1 - $kol-komnat = 2;
Я сделал так:
$kkom = substr($value, 0, strpos($value,';'));
т.е. присвоил значение с 0 символа до первой ;
На этом знания мои иссякли.
Что бы извлечь метро, надо вернуть строку от первой ; до второй ;, потом убрать м., потом убрать пробелы с начала и конца.
Все могу, кроме как вернуть значение второй ;
-
до session_start() вообще ничего выводиться не должно, даже пробел один будет вызывать ошибку.
Да, вы правы, я уже нашел это. Спасибо!
-
пробел, перевод строки, табуляция - это всё тоже символы которые улетают и сервер перед ними шлёт заголовки, удалите всё с конца что после ?>
Дело было в том, что chpu.php вызывался раньше чем sample-html-graphic.php в котором - session_start();
Инициировав сессию до вызова chpu.php ошибка убралась.
Вот только почему так произошло непонятно.
Видимо какие то данные нельзя выводить до инициации сессии.
И возможно что дело вовсе не в chpu.php
В общем пока ошибку устранил, но без понимания почему она возникла.
-
Здравствуйте!
Возникла схожая проблемма.
Начал делать форму отправки сообщений с сайта.
При добавлении в файл sample-html-graphic.php
<?php session_start(); ?>
Выскакивает ошибка:
Warning: session_start() [function.session-start]: Cannot send session cache limiter - headers already sent (output started at Z:\home\barma\www\chpu.php:62) in Z:\home\barma\www\sample-html-graphic.php on line 1
chpu.php:
62 строка, это последняя пустая строка после ?>
<?php
// Получаем URL в переменную $result в случае yourdomain.com/name-page.html в $result окажется строка: /name-page.html
// $result = $_SERVER['REQUEST_URI'];
$result = parse_url($_SERVER['REQUEST_URI']);
$result = $result['path'];
// проверяем, что бы в URL не было ничего, кроме символов алфавита (a-z A-Z), цифр (0-9), а также . / — _ # в противном случае — выдать ошибку 404
$array_url = preg_split ("/(\/|\..*$)/", $result,1, PREG_SPLIT_NO_EMPTY);
// в случае, если обращение было только к домену (yourdomain.com/ или yourdomain.com), в $array_url будет пустой результат, такое событие нужно обработать, как страницу с ID_page = 1
if (!$array_url)
{
$ID_page = 1;
}
else
{
$sef_value = $array_url[0];
/* Далее идёт запрос в БД о наличие в столбце SEF строки $sef_value при положительном ответе получаем из БД соответствующий $sef_value $ID_page,
если такой строки не найдено — выводим страницу ошибки 404. */
$query = "SELECT id_menu FROM main_menu WHERE url = '".$sef_value."' LIMIT 1";
$result = mysql_query($query);
if ($row = mysql_fetch_array($result))
{
$ID_page = $row ['id_menu'];
}
else
{
// header("HTTP/1.0 404 Not Found");
echo "Страница не существует";
exit;
}
}
// Теперь обычная обработка, как если бы $ID_page был получен методом GET */
$cont = "SELECT * FROM main_menu WHERE id_menu = $ID_page LIMIT 1";
$conte = mysql_query($cont);
$row = mysql_fetch_array($conte);
?>Кодировка всех файлов ANSI, поэтому как я понимаю BOM исключается, он только в UTF-8 существует.
-
А если вы дадите документацию по интеграции сервисов, то дело пойдет гораздо быстрее.
На всякий случай сделал 2 вида. просто вывод.
И передача POST.
Отпишусь.
СПАСИБО!
-
Если рассматривать с точки зрения клиента, то он на свой POST или GET запрос должен получить данные какого-то конкретного типа, например text/plain, или text/html
Как именно формируется этот контент клиента не волнует. С точки зрения сервера, получив задание, он должен обработать запрос, и выдать его в ответ пользователю.
И просто выведенная запись может попасть каким то образом им в логи?
А если они мне так же передают информацию? Т.е. тоже просто выводят
<?xml version="1.0" encoding="utf-8"?>
<response><result>0</result>Возможно извлечь result=0 ?
-
Ну, так вам всего лишь нужно ответить на этот запрос. Но логи бывают разные, что именно нужно логировать и где?
Уважаемый s0rr0w!
Спасибо что возитесь с моей проблеммой.
Я понимаю, что мне надо ответить на запрос.
У меня попросили ссылку на скрипт, куда передают запрос типа //moy-site.ru/script.php?id=777
После чего в скрипте принимается параметр id, я его проверяю и формирую xml типа:
<response>
<result>0</result>
<descr>все ок!</descr>
</response>
или
<response>
<result>1</result>
<descr>все хреново!</descr>
</response>C первой частью проблемм нет, все обрабатываю, формирую xml.
А вот дальше в инструкции написанно
В ответ на HTTP-запрос формируется ответ (response) в формате XML, кодировка UTF-8 (Content-type: text/plain):
<?xml version="1.0" encoding="UTF-8"?>
<response>
<result>RESULT</result>
<descr>DESCRIPTION</descr>
</response>
Что сие означает, как это передается, куда это должно быть записанно, мне непонятно.
Именно поэтому я и обратился на форум, что бы спросить у тех, кто подобное делал.
Какие логи как и куда, представления не имею.
Просто думаю, что для тех кто реализовавал оплату посредством отправки смс и работал с сервисами которые называют себя агрегаторами, это все понятно сразу.
Они ведут обмен данными посредством передачи этих самых xml
-
Давайте начнем сначала. Какую задачу вам нужно решить?
Мне методом пост передается запрос, я должен его обработать и исходя из результатов запроса - ЦИТИРУЮ:
В ответ на HTTP-запрос формируется ответ (response) в формате XML, кодировка UTF-8 (Content-type: text/plain):
На вопрос у принимающей стороны, о том каким макаром вы обрабатываете переданный хмл, был получен ответ, что он записывается в логи.
Собственно и все.
Если есть какие то конкретные вопросы, задавайте, я попытаюсь все разузнать.
-
Превратите XML в текст при помощи метода saveXML()
И сделайте curl'ом POST-запрос по указанному адресу.
Возникают вопроосы. Тут в заголовке я указал, что те, кому передаю этот xml, читают его в логах.
А куда передастся этот запрос в данном случае? В логи хостинга? Или должен будет принят скриптом и извлечен из глабального массива POST?
Я не очень силен в этих материях. Я тут набросал то, что вы порекомендовали. Так сработает?
$dom = new domDocument("1.0", "utf-8"); // Создаём XML-документ версии 1.0 с кодировкой utf-8
$root = $dom->createElement("response"); // Создаём корневой элемент
$dom->appendChild($root);
$result = $dom->createElement("result", 0);
$disk = $dom->createElement("disk", 1);
$root->appendChild($result);
$root->appendChild($disk);
$dom->saveXML();
$curl = curl_init();
curl_setopt($curl, CURLOPT_URL, 'http://site.ru/id/ip/whrh');
curl_setopt($curl, CURLOPT_POST, 1);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($curl, CURLOPT_POSTFIELDS, 'xml='.$dom.'');
curl_setopt($curl, CURLOPT_USERAGENT, 'Opera 10.00');
$res = curl_exec($curl);
if(!$res){
$error = curl_error($curl).'('.curl_errno($curl).')';
echo $error;
}
else
{
echo "Все ОК!";
}
curl_close($curl); -
Сталкнулся с такой хренью, стоит задача по html запросу сформировать и отправить ответ в формате XML, кодировка UTF-8 (Content-type: text/plain).
Т.е. мне приходит POST запрос, я его обрабатываю, формирую xml и отсылаю по адресу сайта (адрес заранее известен типа: http://site.ru/id/ip/whrh/)
Загвоздка стала в том, как отправить мне готовый xml по ссылке.
Вот код моего готового xml, я знаю как например сохранить его, или отправить на печать.
$dom = new domDocument("1.0", "utf-8");
$root = $dom->createElement("response");
$dom->appendChild($root);
$result = $dom->createElement("result", 0);
$discr = $dom->createElement("sum", OK!);
$root->appendChild($result);
$root->appendChild($discr);
$dom-> А ЗДЕСЬ ДОЛЖНО БЫТЬ ЧТО ТО ПОЗВОЛЯЮЩЕЕ ОТПРАВИТЬ ВСЕ ЭТО ПО ССЫЛКЕ http://site.ru/id/ip/whrh/ -
Ознакомился с сокетами и curl, несмотря на подробное описание метода сокетами, у меня что то не вышло, ошибка 400.
А вот с curl получилось, пришлось правда доставить библиотеки с функциями.
А можно поподробнее про file_get_contents() , какие там нужны настроики и стоятли они по умолчанию на обычных хостингах.
В частности hc.ru
Спасибо всем кто откликнулся!
-
Дело в том, что номер телефона и еще много чего должно отправляться на сторонний сервис. Моя задача им передать всю нужную информацию в нужном формате, желательно методом post, но можно get. Я все нужные данные собрал, привел к нужному виду, осталось туда приплюсовать номер телефона и надо отправить. Как это сделать, не заставляя пользователя еще раз жать на кнопку?
-
Здравствуйте!
Возник такой вопросик.
У меня есть форма, куда посетитель вводит номер мобильного телефона.
Далее нажимает кнопку и методом POST передает данные другому скрипту, который проверяет данные на корректность, и в случае некорректного введения, возвращает посетителя опять к форме для повторного заполнения.
Вот код:
if (empty($_POST['phone']))
{
echo "Вы не ввели номер телефона!";
echo "<p><a href='javascript: history.back();' class='black'>Ввести номер телефона</a></p>";
exit();
}
else
{
if(!preg_match("/^[0-9]{7,7}+$/", $_POST['phone']))
{
echo ("Телефон задан в неверном формате, выбирите из списка код оператора и введите 7 значный номер без пробелов и тире!");
echo "<p><a href='javascript: history.back();' class='black'>Ввести номер телефона</a></p>";
exit();
}
else
{
$phone = $_POST['phone'];
$kod = $_POST['kod'];
$tlf = "7".$kod.$phone;
echo $tlf;
exit();
}
}А вот далее мне надо не выводить номер телефона как в последнем условии, а передать его для обработки следующему файлу. Метод передачи не важен, но желательно post.
В принципе я могу сделать кнопку типа - Подтверждаю, но хотелось бы этого избежать, т.к. данные на корректность уже проверились.
-
так проблема решена или нет?
можно логотип задать как фоновый рисунок для слоя с шириной на весь экран.
типа такого
bacground: ulr('logo.gif') 50% 0% no-repeatи в этом слое разместить ссылки, но при этом на сам логотип не получится установить ссылку.
Проблемма решена. Навигацию разместил тоже в div с абсолютным позиционированием, но более высоким z-index.
Логотип не стал делать фоном по той самой причине, что он является переходом на главную страницу.
Надеялся что у кого нибудь есть готовое элегантное решение, как выравнять div по центру, учитывая сами размеры слоя.
-
Делайте left: 50%; и добавьте z-index.
left: 50% размещает по центру левый край логотипа. А сам лого смещается от центра на половину своей ширины, т.е 150 пикс. что очень заметно даже на большом мониторе.
В этом случае z-index вообще не нужен.
Я задал z-index слою с ссылками, но разница в z-index работает только когда и слой с ссылками имеет position: absolute;
При другом позиционировании слой с position: absolute выше чем другой любой слой, в независимости от z-index
Выбрать победителей из БД
in PHP
Posted · Edited by fiver
Баллы и прибавляются работам. А к работам привязываются пользователи. Так сейчас все и есть. У каждой работы есть id_work, он уникален.
Код в первом посте выводит работы по всем категориям по кол-ву голосов.
Мне надо из этого списка убрать лишнее, работы не занявшие 1, 2 и 3 места.
Условия я все описал. 1 чел в 1 номинации не может занять 2 и более мест, и челы с одинаковым кол-м голосов делят место.
Все.
Но никак не могу сделать.
На данный момент я могу вывести 1, 2, 3 места с учетом одинакового кол-ва голосов.
Никак не смекну, как граматно удалить людей занявших несколько мест.