За последние 24 часа нас посетили 15230 программистов и 1671 робот. Сейчас ищут 793 программиста ...

Помогите вывести данные

Тема в разделе "PHP для новичков", создана пользователем SparrowRix, 3 май 2013.

  1. SparrowRix

    SparrowRix Новичок

    С нами с:
    3 май 2013
    Сообщения:
    8
    Симпатии:
    0
    помогите пожалуйста в базе огромное количество данных нектари данные повторяются.
    Нужно сделать проверку если запись в "Dogovor" встречается первая раз то нужно в "prioritet" записать "1" если второй раз тогда в "Prioriyet" записать "0"

    примерно нужно сделать вот так

    ID | Dogovor | prioritet
    1----- 0001---------1
    2 -----0002---------1
    3 -----0001---------0
    4 -----0003---------1
    5 -----0002---------0

    напиши пожалуйста PHP код или какую нибудь ссылку проста я в PHP еще новичок
     
  2. Dmitriy A. Arteshuk

    Dmitriy A. Arteshuk Активный пользователь

    С нами с:
    19 янв 2012
    Сообщения:
    2.445
    Симпатии:
    66
    Адрес:
    Зеленоград
    А если встречается в третий раз?

    Или запись всего одна?
     
  3. SparrowRix

    SparrowRix Новичок

    С нами с:
    3 май 2013
    Сообщения:
    8
    Симпатии:
    0
    только первая "1" а остальные 2,3,4............ "0"
    я хочу так подсчитать количество договоров
     
  4. SparrowRix

    SparrowRix Новичок

    С нами с:
    3 май 2013
    Сообщения:
    8
    Симпатии:
    0
    Ура мозг заработал сам решил проблему
    $result = mysql_query ("SELECT Nom,count(Nom),Id from Test GROUP BY Nom",$db);
    $myrow = mysql_fetch_array ($result);

    do {

    if ($myrow['count(Nom)']>1) {
    $Prio=1;
    $Prioo=0;
    $resulttt = mysql_query ("UPDATE Test SET Prio='$Prio' WHERE Nom=$myrow[Nom]&&Id=$myrow[Id]");
    $resulttt = mysql_query ("UPDATE Test SET Prio='$Prioo' WHERE Nom=$myrow[Nom]&&Id>$myrow[Id]");

    }

    else {
    $Prio=1;
    $resultt = mysql_query ("UPDATE Test SET Prio='$Prio' WHERE Nom=$myrow[Nom]");

    }
    }

    while ($myrow = mysql_fetch_array ($result));
     
  5. Ganzal

    Ganzal Суперстар
    Команда форума Модератор

    С нами с:
    15 мар 2007
    Сообщения:
    9.893
    Симпатии:
    965
    еще один дувайлодрочер... вы понимаете назначение цикла do{...}while(...) и его отличие от цикла while(...){...} ? вы понимаете, что если результат вернет ноль строк, то в ответе автоматом появится пучок ошибок?
     
  6. SparrowRix

    SparrowRix Новичок

    С нами с:
    3 май 2013
    Сообщения:
    8
    Симпатии:
    0
    а как вы решили бы мою проблему?
     
  7. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    для начала забить на курсы попова.
     
  8. Your

    Your Старожил

    С нами с:
    2 июл 2011
    Сообщения:
    4.074
    Симпатии:
    7
    Код (PHP):
    1. while($myrow=mysql_fetch_assoc($result)) {
    2.     if (1<$myrow['count(Nom)']) {
    3.     }
    4. }
     
  9. Ganzal

    Ganzal Суперстар
    Команда форума Модератор

    С нами с:
    15 мар 2007
    Сообщения:
    9.893
    Симпатии:
    965
    почему-то я сегодня добрый... игорь, забань меня до вечера а то я тут всем помогу =)

    SparrowRix, поэтапно:

    вот тут надо:
    1. обязательно все имена полей/таблиц/баз данных взять в соответствующие кавычки
    2. придумать псевдоним агрегированному полю просто потому что конструкция может быть значительно более емкой и обращаться потом к ней в коде просто полное уродство.
    3. чисто визуально удобнее читать когда ключевые слова набраны верхним регистром.

    $result = mysql_query ("SELECT `Nom`, COUNT(`Nom`) `Nom_cnt`, `Id` FROM `Test` GROUP BY `Nom`", $db);

    вот эту конструкцию заменить на while ($myrow = mysql_fetch_array ($result)) { ......... }
    разница в том что дувайл будет выполнена как минимум один раз, вне зависимости от состояния, так как проверка условия выхода из цикла происходит после цикла. вайл же не будет выполнен если на входе сразу условие выхода. если оставить как есть то когда база вернет ноль строк то фетч_эрэй получит bool false и дальше в этом булевом значении попробуется найти индекс ['count(Nom)'] которого там не может быть так как это булево значение а не массив. следовательно, иф получит НЕ выполнение условия $myrow['count(Nom)'] > 1 и будет выполнена ветка элс - $Prio=1; $resultt = mysql_query ("UPDATE Test SET Prio='$Prio' WHERE Nom=$myrow[Nom]");
    тут мы объявили переменную прио хотя мы можем сразу воткнуть эту единицу сразу в запрос. ну да ладно, не в этом проблема. проблема в том что Nom=$myrow[Nom] не будет работать даже когда там будет массив, не то что наш бул фолс. так вот короче этот запрос будет выполнен но вернет ошибку.
    но об этом чуть позже, сейчас закроем тему дувайлодрочерства. как уже было сказано, заменить надо на обычный вайл. тогда если строк в результате запроса не будет - сразу вернувшийся бул фолс заставит сразу обойти тело цикла. все в ожуре.


    ну тут с учетом того что мы от уродства избавляемся - имя соответствующее математике агрегирования меняется на псевдоним:
    if ($myrow['Nom_cnt']>1) {

    вот тут просто беда. делать надо не два а один запрос, && заменить на AND - так будет более наглядна разница между битовыми операциями и алгеброй логики, кавычки добавить и обязательно пофиксить добавление массива и работу с его индексом.
    "$myrow[Nom]" - для одномерного массива может и прокатит, но с многомерным обломаемся. первое что бросается в глаза это отсутствие кавычек вокруг имени индекса. значит это константа. ищем эту константу в памяти. не находим. заменяем на текстовое значение соответствующее имени не найденной константы. работает. но получим предупреждение. а если взять в кавычки то сразу обращаемся текстовым именем и все хорошо.
    теперь про многомерность. она потеряется так как работать будет до первой закрывающейся квадратной скобки. а поскольку она вернет массив то будет совершена попытка приведения массива к строке и все это дело заменится на простое слово Array
    пример:

    Код (Text):
    1. <?php
    2. error_reporting( E_ALL );
    3. $myrow = array(
    4.     'Nom' => array(1 => 3, 2 => 4),
    5.     'Id' => 8
    6. );
    7.  
    8. echo $myrow[Nom][1];
    9. echo "$myrow[Nom][2] $myrow[Id]";
    10. ?>
    ответ:
    Код (Text):
    1.  
    2. PHP Notice:  Use of undefined constant Nom - assumed 'Nom' in /tmp/tmp.php on line 8
    3. PHP Stack trace:
    4. PHP   1. {main}() /tmp/tmp.php:0
    5. 3Array[2] 8
    то есть мы видим что после замены константы на слово мы спокойно получаем нужную нам тройку из элемента с индексом 1. а вот значение индекса 2 там же но в контексте вставки в строку мы уже не можем получить. $myrow[Nom] заменяется на Array а указание индекса вставляется простым текстом [2]
    фикс:
    Код (Text):
    1. echo $myrow['Nom'][1];
    2. echo "{$myrow['Nom'][2]} {$myrow[Id]}";
    тест:
    Код (Text):
    1. 34 8
    получили все что нужно и без предупреждений

    на один запрос переписывать не буду - лениво. и позволю себе сразу грохнуть три ненужные переменные
    $resulttt = mysql_query ("UPDATE `Test` SET `Prio`= 1 WHERE `Nom`={$myrow['Nom']} AND `Id`= {$myrow['Id']}");
    $resulttt = mysql_query ("UPDATE `Test` SET `Prio`= 0 WHERE `Nom`={$myrow['Nom']} AND `Id`> {$myrow['Id']}");

    $resultt = mysql_query ("UPDATE `Test` SET `Prio`= 1 WHERE `Nom`={$myrow['Nom']}");

    как-то так...
     
  10. nixx

    nixx Активный пользователь

    С нами с:
    20 фев 2013
    Сообщения:
    132
    Симпатии:
    0
    WAMP иногда глючит ,приходится перезагружать ...