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


Перезапись данных столбца в определенной строчке


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

#1 Midori

    Новичок

  • Пользователи
  • Pip
  • 8 сообщений

Отправлено 11 Август 2014 - 20:52

Коротко о проблеме:

есть следующий код:

$cond = "`f7671`='" . $line['Абонемент'] . "'";

$result8 = data_select_field(451, 'COUNT(*) as count', $cond);
$row8 = sql_fetch_assoc($result8);
$a8=$row8['count'];


if ($a8>0){
$warning = 1;
}

if (!$warning) {

$kch = $line['Количество часов'];
$chp = $line['f7961'];
$chost = $kch + $chp;

$new_ware_id = data_update(451, EVENTS_ENABLE, array("f7691" => $chost));
}

сейчас идёт перезапись столбца на всех строчках.
в сиквелский запрос нужно добавить условие f7671 = ['Абонемент'].

были такие варианты:
1) $result = mysql_query ("UPDATE 451 SET `f5861`='" . $chost . "' WHERE `f7671`='" . $line['Абонемент'] .);
2) $new_ware_id = data_update(451, EVENTS_ENABLE, array("f7691" => $chost), ("`f7671`='" . $line['Абонемент'] ."'"));

первый выдал системную ошибку
второй(более вероятный) ошибок не выдаёт, но и не совершает перезаписи вообще.

Заранее спасибо за помощь =)

#2 CbCoder

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

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

Отправлено 12 Август 2014 - 09:08

Во-первых, не перегружайте свой код переменными. Это и на производительность влияет и на читабельность. Весь ваш код выше можно сжать до:

$result = data_select_field(451, "COUNT(*) as count", "`f7671`='".$line['Абонемент']."'");
$row = sql_fetch_assoc($result);
if ($row['count']==0) {
  data_update(451, EVENTS_ENABLE, array("f7691" => $line['Количество часов'] + $line['f7961']));
}

Или вообще к такому варианту (тут еще оптимизация запроса):

$row = data_select_array(451, "`f7671`='".$line['Абонемент']."'");
if ($row) {
  data_update(451, EVENTS_ENABLE, array("f7691" => $line['Количество часов'] + $line['f7961']));
}


Во-вторых, оба ваши варианта запроса на обновление содержат ошибку. В первом пропущено имя таблицы (указан только ее id):

$result = mysql_query ("UPDATE ".DATA_TABLE."451 SET `f5861`='" . $chost . "' WHERE `f7671`='" . $line['Абонемент'] .);

Хотя в любом случае прямые запросы не рекомендуются, а если и их запускать (в тех случаях, когда нельзя использовать data_* например), то через функцию sql_query, а не mysql_query.

Во втором же варианте (как раз рекомендуемом) все верно, но зачем-то условие помещено в скобки (зачем?). Условие должно быть точно такое же, как и в data_select. Да и непонятно, зачем вы возвращаете функцию в переменную $new_ware_id? Во-первых, это бессмысленно само по себе (это же не data_insert, тут id уже известен), во-вторых если переменная дальше нигде не используеся - не нужно ее заполнять. Снова только лишний мусор в коде. И наконец последнее замечание - в функциях data_* в условиях рекомендуется использовать запятые вместо точек для вставки переменных в поле.

Таким образом, окончательный варинт выглядит так:

$row = data_select_array(451, "`f7671`='",$line['Абонемент'],"'");
if ($row) {
  data_update(451, EVENTS_ENABLE, array("f7691" => $line['Количество часов'] + $line['f7961']), "`f7671`='",$line['Абонемент'],"'");
}

Если же поле Абоенемент числовое, можно еще и кавычки убрать:

$row = data_select_array(451, "`f7671`=",$line['Абонемент']);
if ($row) {
  data_update(451, EVENTS_ENABLE, array("f7691" => $line['Количество часов'] + $line['f7961']), "`f7671`=",$line['Абонемент']);
}


P.S. Посмотрел еще раз, и понял, что и запрос data_select_array тут тоже лишний, т.к. data_update итак будет работать только если запись найдена. Т.е. весь код приводится к одному запросу:

data_update(451, EVENTS_ENABLE, array("f7691" => $line['Количество часов'] + $line['f7961']), "`f7671`='",$line['Абонемент'],"'");

или

data_update(451, EVENTS_ENABLE, array("f7691" => $line['Количество часов'] + $line['f7961']), "`f7671`=",$line['Абонемент']);

в зависимости от типа поля Абонемент (см. выше)

#3 Midori

    Новичок

  • Пользователи
  • Pip
  • 8 сообщений

Отправлено 13 Август 2014 - 08:34

спасибо,

data_update(451, EVENTS_ENABLE, array("f7691" => $line['Количество часов'] + $line['f7961']), "`f7671`='",$line['Абонемент'],"'");


сработал отлично.

#4 Midori

    Новичок

  • Пользователи
  • Pip
  • 8 сообщений

Отправлено 13 Август 2014 - 17:35

поправка - сработало, но не отлично
перезапись идёт, но только поля первой строки
вне зависимости от того, какое число вносим в поле абонемент

+ не срабатывает ("f7691" => $line['Количество часов'] + $line['f7961'])
каким образом: нет роста сумы, тоесть при вводе в поле Количество часов числа оно не сумируется с уже имеющимся в поле 7961, а заменяет его

Сообщение отредактировал Midori: 13 Август 2014 - 17:38


#5 CbCoder

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

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

Отправлено 13 Август 2014 - 17:47

Записывать должно в строку, соответствующую заданному вами условию "`f7671`='".$line['Абонемент']."'". Если пишет не туда куда надо - значит само условие некорректное. Для начала, к примеру, скажите какой тип у полей "Абонемент" и `f7671`.

#6 Midori

    Новичок

  • Пользователи
  • Pip
  • 8 сообщений

Отправлено 13 Август 2014 - 21:04

цифровой, 10/0 у обоих

#7 CbCoder

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

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

Отправлено 14 Август 2014 - 08:59

А в чем вообще суть вашего кода? Что вы хотите сделать своим вычислением?

#8 Midori

    Новичок

  • Пользователи
  • Pip
  • 8 сообщений

Отправлено 14 Август 2014 - 20:41

если убрать общую мишуру то сводится примерно к такому заданию:

при покупке абонемента в таблицу Абонемент вносится запись следующего содержания:
Номер абонемента - ФИО покупателя - количество часов на абонементе - часов потрачено - часов осталось
Когда клиент использует карточку, в таблице Заявки заполняем поля Номер абонемента и Количество часов
Запрос ищет абонемент с нужным номером и суммирует Часов потрачено и Количество часов

#9 CbCoder

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

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

Отправлено 15 Август 2014 - 12:31

data_update(451, EVENTS_ENABLE, array("f7691" => $line['Количество часов'] + $line['f7961']), "`f7671`=",$line['Абонемент']);

Судя по вашим словам, текущая таблица вычисления - это Заявки, а f7691 - это поле "Часов потрачено" в таблице Абонемент (451), но тогда почему оно оказалосьв $line? В $line лежат только поля текущей записи. Не мудрено, что у вас происходит не суммирование, а замена, т.к. в $line['f7961'] - пустота. Должно быть так:

$row = data_select_array(451, "`f7671`=",$line['Абонемент']);
if ($row) {
  data_update(451, EVENTS_ENABLE, array("f7691" => $line['Количество часов'] + $row['f7961']), "`f7671`=",$line['Абонемент']);
}

Тут уже поле f7961 берется непосредственно из полученной по условию Заявки.

#10 Midori

    Новичок

  • Пользователи
  • Pip
  • 8 сообщений

Отправлено 16 Август 2014 - 14:01

вчера вчиталась в код внимательнее и пришла к тем же выводам.
вот что получилось:

$ans = data_select_array(451, "`f7671`=",$line['Абонемент']);

if ($ans) {

data_update(451, EVENTS_ENABLE, array("f7691" => $line['Количество часов'] + $ans['f7961']), "`f7671`=", $line['Абонемент']);

}

но ни одной из проблем ( перезапись, а не сума и перезапись в 1ую строку таблицы, не смотря на условие) код не решил.





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

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