Перейти к содержимому


ошибка в вычислении


Сообщений в теме: 10

#1 aleks.goodcolor

    Активный участник

  • Пользователи
  • PipPipPip
  • 198 сообщений
  • Пол:Мужчина
  • Город:Йошкар-ола

Отправлено 09 Июль 2014 - 08:45

Подскажите пожалуйста где у меня ошибка в коде. До этого все работало и при изменении условия в data_select появилась ошибка:

Ошибка SQL запроса:
SELECT * FROM f_data42 WHERE `f438`='
You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ''' at line 1


if ($line['незачет'] === 'да')
{
$kontr = data_select(42, "`status`=0 AND `f3730`='",$line['Пользователь'],"'");
while($row2 = sql_fetch_assoc($kontr))
{
  $res = data_select(46, "`status`=0 AND `f3720`='нет' AND `f3710`= 0");
  while ($row = sql_fetch_assoc($res)) // цикл чтения строк из массива сверху, каждая строка читается в $row
  {
   $mas[] = $row; // а тут помещаем очередной считанный $row в массив $mas как новый элемент этого массива
   $rand_key = array_rand($mas, 1); // функция array_rand возвращает КЛЮЧ массива, а не элемент (см. описание функции)
   $rand_row = $mas[$rand_key]; // поэтому чтобы получить элемент массива, нужно подставить полученный ключ
   $shtraf = $rand_row['f1400'];
   //$shtraf = $line['штраф'];
   //$res2 = data_select(42, "`status`=0 AND `f438`='",$line['Пользователь'],"'");
   //$row2 = sql_fetch_assoc($res2);
  }
$row2['f3750'] = $shtraf;
update_query($row2, "Контрагенты", "`f438`='",$line['Пользователь'],"'");
}
//data_update(42, array('f3750'=>$shtraf), "`f438`='",$line['Пользователь'],"'");
//data_update(42, array('f3750'=>$shtraf), "`f3730`='",$line['Пользователь'],"'");[/b]
[b]}
if ($line['незачет'] ==='нет' || $line['замена'] != 0 )
{
data_update(42, array('f3750'=>0), "`f438`='",$line['Пользователь'],"'");
}

Сообщение отредактировал aleks.goodcolor: 09 Июль 2014 - 08:46


#2 CbCoder

    Активный участник

  • Программист ООО "КБ"
  • PipPipPip
  • 8 759 сообщений
  • Пол:Мужчина
  • Город:Казань

Отправлено 09 Июль 2014 - 10:32

update_query($row2, "Контрагенты", "`f438`='",$line['Пользователь'],"'");

В update_query не используются запятые в условии. Либо используйте точки, либо функцию data_update. Второй вариант предпочтительнее, т.к. не понятно, зачем вам мешанина из разных функций: в одних местах data_update, в других - update_query. Используйте везде функции одного типа: либо для работы с внешними именами, либо - с внутренними, хотя бы чтобы самому не путаться. В варианте с внутренними код работает быстрее и безопаснее (хотя и выглядит менее наглядно).

#3 aleks.goodcolor

    Активный участник

  • Пользователи
  • PipPipPip
  • 198 сообщений
  • Пол:Мужчина
  • Город:Йошкар-ола

Отправлено 09 Июль 2014 - 11:45

понятно, спасибо.

#4 aleks.goodcolor

    Активный участник

  • Пользователи
  • PipPipPip
  • 198 сообщений
  • Пол:Мужчина
  • Город:Йошкар-ола

Отправлено 09 Июль 2014 - 11:48

Я уже переделал тот код под это:

if ($line['незачет'] === 'да')
{
$kontr = data_select(42, "`status`=0 AND `f3730`='",$line['Пользователь'],"'");
$kolvo = count($kontr);
$res = data_select(46, "`status`=0 AND `f3720`='нет' AND `f3710`= 0");
  foreach ($kontr as $key=>$val)
{

  while ($row = sql_fetch_assoc($res)) // цикл чтения строк из массива сверху, каждая строка читается в $row
  {
   $mas[] = $row;   // а тут помещаем очередной считанный $row в массив $mas как новый элемент этого массива
   //$rand_key = rand(0,$kolvo);
	
   $rand_key = array_rand($mas, 1); // функция array_rand возвращает КЛЮЧ массива, а не элемент (см. описание функции)
   $rand_row = $mas[$rand_key]; // поэтому чтобы получить элемент массива, нужно подставить полученный ключ
   $shtraf = $rand_row['f1400'] ;
  }
  //echo $shtraf;
  $str = "UPDATE ".DATA_TABLE."42 SET f3750 = '".$shtraf."' WHERE status=0 AND ID='".$val['id']."'";
  sql_query($str);

}
}
В переменной shtraf у меня всегда показывается только 1 пользователь, хотя должно показывать всегда разные. Не подскажите в чем может быть причина?

UPD: передвинул ниже фигурную скобку и теперь выводит разных, но в таблицу 42 все равно записывает только 1-го.

Сообщение отредактировал aleks.goodcolor: 09 Июль 2014 - 11:59


#5 CbCoder

    Активный участник

  • Программист ООО "КБ"
  • PipPipPip
  • 8 759 сообщений
  • Пол:Мужчина
  • Город:Казань

Отправлено 09 Июль 2014 - 12:22

Опять ведь мешанина, теперь уже с использованием прямого запроса без наших функций:

$str = "UPDATE ".DATA_TABLE."42 SET f3750 = '".$shtraf."' WHERE status=0 AND ID='".$val['id']."'";
sql_query($str);

Вы уж определитесь к чему-то одному. Прямые запросы у нас в программе не рекомендуются вообще. Я ведь рекомендовал вам на data_update заменить.

Цитата

В переменной shtraf у меня всегда показывается только 1 пользователь, хотя должно показывать всегда разные. Не подскажите в чем может быть причина?

У вас в 90% одна и та же причина - безумная путаница логики в коде. Причем перепутано настолько, что даже не разобрать что вы хотели и в какую сторону исправлять. Тем более я уже говорил - с логикой вы сами разбираться должны, либо отдайте разработку профессионалам. Разработка вычислений априори никак не предназначена для не программистов. Это ведь даже не Excel.

#6 aleks.goodcolor

    Активный участник

  • Пользователи
  • PipPipPip
  • 198 сообщений
  • Пол:Мужчина
  • Город:Йошкар-ола

Отправлено 11 Июль 2014 - 08:13

Уже 2 дня ищу ошибку в логике и не могу понять в чем проблема - вероятно где-то в коде ошибка.
Попытаюсь объяснить что я делаю:
Вычисление стоит на таблицу "Наши сотрудники".
Делаю условие если поле "незачет" = да, то делаю вычисление.
Получаю массив строк в $kontr из таблицы "Контрагенты" по условию что поле "Менеджер" или поле "Замена" в контрагентах равно полю "Пользователь" в "Наши сотрудники".
Получаю массив строк в $res из таблицы "Наши сотрудники" с условием что поле "незачет" = нет и поле замено пустое.
В цикле я получаю случайного пользователя из "Наши сотрудники" и помещаю его в $shtraf.
После чего в цикле обновляю поле "Штраф" в таблице контрагенты по условию что ID в таблице должно быть равно id полученное в $kontr.
Таким образом я хочу получить в таблице контрагенты в поле штраф случайных пользователей.

Вот код который я использую:

if ($line['незачет'] === 'да')
{
$kontr = data_select(42, "`status`=0 AND `f438`='",$line['Пользователь'],"' OR `status`=0 AND `f3730`='",$line['Пользователь'],"'");
$res = data_select(46, "`status`=0 AND `f3720`='нет' AND `f3710`= 0");
  foreach ($kontr as $key=>$val)
{
  while ($row = sql_fetch_assoc($res))
  {
   $mas[] = $row; 
  }
  $rand_key = array_rand($mas,1); 
  $rand_row = $mas[$rand_key]; 
  $shtraf = $rand_row['f1400'];
  data_update(42, array('f3750'=>$shtraf), "ID='",$val['id'],"'");
}
}
if ($line['незачет'] === 'нет' || $line['замена'] != 0)
{
data_update(42, array('f3750'=>0), "`f438`='",$line['Пользователь'],"' OR `f3730`='",$line['Пользователь'],"'");
}

Пожалуйста помогите разобраться.

#7 CbCoder

    Активный участник

  • Программист ООО "КБ"
  • PipPipPip
  • 8 759 сообщений
  • Пол:Мужчина
  • Город:Казань

Отправлено 11 Июль 2014 - 09:33

1. Что у вас делает цикл foreach в коде? Функция data_select НЕ возвращает массива, вы разве сами это не видите по примеру ниже, где стоит ТА ЖЕ самая функция, результат которой обрабатывается через цикл while с функцией sql_fetch_assoc? Я понимаю, невнимательность (со всеми бывает), но уж за 2 дня то можно было обратить на это внимание.
2. Есть в программировании одна очень полезная рекомендация, которую почему то игнорируют начинающие или непрофессиональные программисты - это отступы. Код с ними гораздо проще читать, разбирать и и искать в нем ошибки. Вот сами сравните (заодно по первому пункту исправил):

if ($line['незачет'] === 'да')
{
    $res1 = data_select(42, "`status`=0 AND `f438`='",$line['Пользователь'],"' OR `status`=0 AND `f3730`='",$line['Пользователь'],"'");
    while ($row1 = sql_fetch_assoc($res1))
    {
        $res2 = data_select(46, "`status`=0 AND `f3720`='нет' AND `f3710`= 0");
        while ($row2 = sql_fetch_assoc($res2))
        {
            $mas[] = $row2;
        }
        $rand_key = array_rand($mas,1);
        $rand_row = $mas[$rand_key];
        $shtraf = $rand_row['f1400'];
        data_update(42, array('f3750'=>$shtraf), "id='",$row1['id'],"'");
    }
}
if ($line['незачет'] === 'нет' || $line['замена'] != 0)
{
    data_update(42, array('f3750'=>0), "`f438`='",$line['Пользователь'],"' OR `f3730`='",$line['Пользователь'],"'");
}


#8 CbCoder

    Активный участник

  • Программист ООО "КБ"
  • PipPipPip
  • 8 759 сообщений
  • Пол:Мужчина
  • Город:Казань

Отправлено 11 Июль 2014 - 09:43

3.
data_update(42, array('f3750'=>$shtraf), "ID='",$row1['id'],"'");

Тут еще ошибка у вас была, имя поля "ID" внутри БД нет, это внешнее имя поля id. А в data_update используются только внутренние имена. Это я тоже поправил в примере выше.

4. Не ошибка, а рекомендация: если вставляете в условие запроса поле цифрового типа (т.е. у которых значения - числа) между запятыми, то одинарные кавычки вокруг значения ставить не нужно! В частности, это относится к полям "пользователь" и "id". Т.е. код выше должен быть в итоге таким:

if ($line['незачет'] === 'да')
{
    $res1 = data_select(42, "`status`=0 AND `f438`=",$line['Пользователь']," OR `status`=0 AND `f3730`=",$line['Пользователь']);
    while ($row1 = sql_fetch_assoc($res1))
    {
        $res2 = data_select(46, "`status`=0 AND `f3720`='нет' AND `f3710`= 0");
        while ($row2 = sql_fetch_assoc($res2))
        {
            $mas[] = $row2; 
        }
        $rand_key = array_rand($mas,1); 
        $rand_row = $mas[$rand_key]; 
        $shtraf = $rand_row['f1400'];
        data_update(42, array('f3750'=>$shtraf), "id=",$row1['id']);
    }
}
if ($line['незачет'] === 'нет' || $line['замена'] != 0)
{
    data_update(42, array('f3750'=>0), "`f438`=",$line['Пользователь']," OR `f3730`=",$line['Пользователь']);
}


#9 aleks.goodcolor

    Активный участник

  • Пользователи
  • PipPipPip
  • 198 сообщений
  • Пол:Мужчина
  • Город:Йошкар-ола

Отправлено 11 Июль 2014 - 09:48

спасибо огромное за вашу помощь.

#10 CbCoder

    Активный участник

  • Программист ООО "КБ"
  • PipPipPip
  • 8 759 сообщений
  • Пол:Мужчина
  • Город:Казань

Отправлено 11 Июль 2014 - 09:55

Смотрю на ваш код и еще нахожу нюансы:

5.
$res1 = data_select(42, "`status`=0 AND `f438`=",$line['Пользователь']," OR `status`=0 AND `f3730`=",$line['Пользователь']);

Зачем дублировать в условии `status`=0 ? Лучше использовать скобки - так результат предсказуемее (иначе нужно проверять приоритет операторов каждый раз):

$res1 = data_select(42, "`status`=0 AND (`f438`=",$line['Пользователь']," OR `f3730`=",$line['Пользователь'],")");

6.
if ($line['незачет'] === 'да')

Тождественное равенство тут излишне, достаточно просто "==". Хотя, в данном месте дело вкуса скорее, на работу кода не должно повлиять.

#11 aleks.goodcolor

    Активный участник

  • Пользователи
  • PipPipPip
  • 198 сообщений
  • Пол:Мужчина
  • Город:Йошкар-ола

Отправлено 11 Июль 2014 - 11:00

понятно. спасибо за разъяснения в дальнейшем буду учитывать это





Количество пользователей, читающих эту тему: 1

0 пользователей, 1 гостей, 0 анонимных