Jump to content

fiver

User
  • Posts

    155
  • Joined

  • Last visited

Posts posted by fiver

  1. Вот и я говорю что ошибка проектирования структуры базы!!!

    У тебя участвуют не ЛЮДИ, а РАБОТЫ (ФОТОГРАФИИ). А значит баллы прибавляются работам.. А вот уже к работам привязываются пользователи.. Нужно или новое поле вводить ИМЯ_РАБОТЫ или делать согласующую таблицу пользователей. А скорее всего и то и другое.

    И тогда ты просто в запросе получаешь рейтинг работ отсортированных по баллам и сгруппированных по пользователям

    Баллы и прибавляются работам. А к работам привязываются пользователи. Так сейчас все и есть. У каждой работы есть id_work, он уникален.

    Код в первом посте выводит работы по всем категориям по кол-ву голосов.

    Мне надо из этого списка убрать лишнее, работы не занявшие 1, 2 и 3 места.

    Условия я все описал. 1 чел в 1 номинации не может занять 2 и более мест, и челы с одинаковым кол-м голосов делят место.

    Все.

    Но никак не могу сделать.

    На данный момент я могу вывести 1, 2, 3 места с учетом одинакового кол-ва голосов.

    Никак не смекну, как граматно удалить людей занявших несколько мест.

  2. fiver, хотел тебе помочь, но чувствую что запутался :facepalmxd: Как так получается что у тебя один и тот же человек в одной и той же категории, в одной и той же подкатегории, в одной и той же группе имеет несколько очков (т.е. несколько записей)?

    Я так понимаю это ошибка проектирования базы данных :) Пример очень не удачный, при правильно проектировании дублирование не может быть (ну или не должно)

    И тут вообще не зачем работать с массивом. Нужно изначально делать нужный запрос к базе. Например, сделать функцию которой отдавать категорию+подкатегорию+возраст и получать массив готового результата

    Это не ошибка. Каждый участник может выложить на суд несколько работ.

    Например у тебя есть 10 классных фоток и ты не знаешь какая лучше и выкладываешь на голосование все фото.

    А так как у других участников фотки говно, то очень часто получается что у одного участника все 3 места за 3 разных работы.

    Но он и так уже победитель и у него 1 место. поэтому 2 и 3 место должны занять другие участники, это только в 1 категории 1-1-1.

    В 1-2-1 , это уже другие работы по другой теме, но в той же возрастной категории, он опять может выложить свои работы и опять занять какое то место.

    Вообще сайт делал не я (меня попросили помочь с определением победителей, вот я и снашаюсь).

    Там конечно есть косяки. Например информация об участнике хранится в другой таблице, и связь с таблицей с работами и номинациями осуществляется по id участника (общее поле для 2-х таблиц). Но весь прикол в том, что бы выложить работу, участник каждый раз регится заново. В итоге у участника не 1 id, а целая куча.

    Поэтому надо отсекать участников не по их id, а сравнивать 2 поля Имя и Фамилия.

    А они еще могут там и ошибку сделать или 1 раз написать Иван, другой Ваня, третий ИВАН.

    Короче одни косяки.

  3. Смысл в том, что бы научиться работать со строками, отсекать лишнее, изымать нужное.

    Ну так спрашивай.. Я в своём примере несколько подходов к обработки данных в строке предложил ;)

    То что сделал ты, круто.

    Кратенько, сам бы я до такого не дошел. Это надо видеть готовые примеры и на них учиться.

    Вот такой еще вопрос.

    У меня есть таблица, которая содержит названия всех улиц Москвы, и относит их соответственно к нужным АО и районам.

    Но данные содержатся в таком виде -

    Большой Николопесковский переулок

    Ленина улица

    Лесная 2-я улица

    А в ексель улицы в виде

    Большой Николопесковский пер.

    Ленина ул.

    2-я Лесная ул.

    С пер. ул. пр. пл. и т.п. я решил проблему просто.

    С помощью str_replace заменяю их на полное наименование, т.е. ул. на улица и т.д.

    Там немного всего, еще тупики, набережные, мосты, проезды, поселки ну и т.д.

    А вот как быть с Лесная 2-я на 2-я Лесная

    Или Микраройон 3-й Зеленоград на

    3-й Микраройон Зеленограда.

    У меня на данный момент 4243 улиц, и частенько встречаются перемена мест в названиях.

  4. array_unique(); вам в помощь.

    А как его заставить работать по нескольким фиксированным ключам?

    В частности для каждой номинации 5 параметров. Три определяют саму номинацию, плюс 2 параметра Имя и Фамилия.

    Можно примерчик.

  5. Ну да, работа с CVS.

    Я и извлекаю из cvs файла данные, бью на строки и вгоняю эти строки в переменную, которую потом потрошу на нужные мне составляющие, которые вношу в нужном виде в БД. Так что бы в результате и сортировка работала и поиск по данным и прочее. Еще есть автоопределение района и АО по названию улицы и т.п.

    Смысл не в том, что бы взять готовое решение. Смысл в том, что бы научиться работать со строками, отсекать лишнее, изымать нужное. Можно это и самому освоить. Что я и делаю параллельно общению на форуме. Но всегда хочется узнать как это делают профи, что бы оценить свои решения и оптимизировать их.

    Поэтому большое спасибо всем кто откликнулся.

    По поводу в "в теге <a> стоит nofollow", обратил внимание, что почему то не всегда это срабатывает.

    Вот если параметр применить ко всей странице, то результат есть, а к одной ссылке, частенько не работает.

    Т.е. делал ссылки с одного своего сайта на другой с nofollow, а когда захожу в мои сайты в яндекс и смотрю внешние ссылки, то ссылка там есть.

    Да и с форумов ссылки тоже всегда добавляются.

  6. Помогите сделать выборку из БД. Сделал кучу вложенных циклов. Вроде все работает, но в некоторых случаях получается не то что надо. Причем не понятно почему.

    Дела обстоят так:

    Есть куча конкурсантов, все делятся по категориям, подкатегориям и возрасту.

    Например 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 место, то все, он убирается с других мест, а номинируются те, кто ниже его.

  7. главное что работает =)

    хотя

    trim(str_replace('п','',str_replace('т','',$vtok[2])));

    меня пугает =)

    а не секрет зачем тогда trim

    trim, что бы удалить пробелы спереди и сзади. После удаления п или т, после цифры образуется пробел, который до этого разделял цифру и букву.

  8. не знаю на сколько это правильно и оптимально


    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 проверял на истину ложь.

  9. Предложенный ранее $blablalba = explode (';', $value) работает как надо.

    теперь возникают частые нюансы.

    например разбить 5п или 15т на 2 переменных 1-я только цифра, и 2-я в зависимости от буквы п или т = пешком или транспортом.

    Только цифру можно оставить например 2 раза воспользовавшись функцией str_replace и заменив т и п на '' пусто.

    А с т и п, проверить наличие на символ т, если есть, то транспортом, если нет, то значит пешком.

    Это вот с моей точки зрения, как можно сделать.

    Просто интересно узнать, а как правильно и оптимально это сделать.

    И вообще вот такая запись работает, но имеет ли она право на жизнь, или можно сделать все проще?


    $min_ot_m = trim(str_replace('п','',str_replace('т','',$vtok[2])));

  10. Если значения в строке 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];

    Выводится какая то хренатень.

    А так все выводится прям от ; к ;

  11. Здравствуйте!

    Столкнулся с задачей переноса данных из 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 символа до первой ;

    На этом знания мои иссякли.

    Что бы извлечь метро, надо вернуть строку от первой ; до второй ;, потом убрать м., потом убрать пробелы с начала и конца.

    Все могу, кроме как вернуть значение второй ;

  12. пробел, перевод строки, табуляция - это всё тоже символы которые улетают и сервер перед ними шлёт заголовки, удалите всё с конца что после ?>

    Дело было в том, что chpu.php вызывался раньше чем sample-html-graphic.php в котором - session_start();

    Инициировав сессию до вызова chpu.php ошибка убралась.

    Вот только почему так произошло непонятно.

    Видимо какие то данные нельзя выводить до инициации сессии.

    И возможно что дело вовсе не в chpu.php

    В общем пока ошибку устранил, но без понимания почему она возникла.

  13. Здравствуйте!

    Возникла схожая проблемма.

    Начал делать форму отправки сообщений с сайта.

    При добавлении в файл 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 существует.

  14. Если рассматривать с точки зрения клиента, то он на свой POST или GET запрос должен получить данные какого-то конкретного типа, например text/plain, или text/html

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

    И просто выведенная запись может попасть каким то образом им в логи?

    А если они мне так же передают информацию? Т.е. тоже просто выводят

    <?xml version="1.0" encoding="utf-8"?>
    <response><result>0</result>

    Возможно извлечь result=0 ?

  15. Ну, так вам всего лишь нужно ответить на этот запрос. Но логи бывают разные, что именно нужно логировать и где?

    Уважаемый 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

  16. Давайте начнем сначала. Какую задачу вам нужно решить?

    Мне методом пост передается запрос, я должен его обработать и исходя из результатов запроса - ЦИТИРУЮ:

    В ответ на HTTP-запрос формируется ответ (response) в формате XML, кодировка UTF-8 (Content-type: text/plain):

    На вопрос у принимающей стороны, о том каким макаром вы обрабатываете переданный хмл, был получен ответ, что он записывается в логи.

    Собственно и все.

    Если есть какие то конкретные вопросы, задавайте, я попытаюсь все разузнать.

  17. Превратите 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);

  18. Сталкнулся с такой хренью, стоит задача по 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/


  19. Ознакомился с сокетами и curl, несмотря на подробное описание метода сокетами, у меня что то не вышло, ошибка 400.

    А вот с curl получилось, пришлось правда доставить библиотеки с функциями.

    А можно поподробнее про file_get_contents() , какие там нужны настроики и стоятли они по умолчанию на обычных хостингах.

    В частности hc.ru

    Спасибо всем кто откликнулся!

  20. Дело в том, что номер телефона и еще много чего должно отправляться на сторонний сервис. Моя задача им передать всю нужную информацию в нужном формате, желательно методом post, но можно get. Я все нужные данные собрал, привел к нужному виду, осталось туда приплюсовать номер телефона и надо отправить. Как это сделать, не заставляя пользователя еще раз жать на кнопку?

  21. Здравствуйте!

    Возник такой вопросик.

    У меня есть форма, куда посетитель вводит номер мобильного телефона.

    Далее нажимает кнопку и методом 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.

    В принципе я могу сделать кнопку типа - Подтверждаю, но хотелось бы этого избежать, т.к. данные на корректность уже проверились.

  22. так проблема решена или нет?

    можно логотип задать как фоновый рисунок для слоя с шириной на весь экран.

    типа такого


    bacground: ulr('logo.gif') 50% 0% no-repeat

    и в этом слое разместить ссылки, но при этом на сам логотип не получится установить ссылку.

    Проблемма решена. Навигацию разместил тоже в div с абсолютным позиционированием, но более высоким z-index.

    Логотип не стал делать фоном по той самой причине, что он является переходом на главную страницу.

    Надеялся что у кого нибудь есть готовое элегантное решение, как выравнять div по центру, учитывая сами размеры слоя.

  23. Делайте left: 50%; и добавьте z-index.

    left: 50% размещает по центру левый край логотипа. А сам лого смещается от центра на половину своей ширины, т.е 150 пикс. что очень заметно даже на большом мониторе.

    В этом случае z-index вообще не нужен.

    Я задал z-index слою с ссылками, но разница в z-index работает только когда и слой с ссылками имеет position: absolute;

    При другом позиционировании слой с position: absolute выше чем другой любой слой, в независимости от z-index

×
×
  • Create New...

Important Information

We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue. See more about our Guidelines and Privacy Policy