Коротко о проблеме:
есть следующий код:
$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['Абонемент'] ."'"));
первый выдал системную ошибку
второй(более вероятный) ошибок не выдаёт, но и не совершает перезаписи вообще.
Заранее спасибо за помощь =)


Перезапись данных столбца в определенной строчке
Автор Midori, 11 авг. 2014 20:52
Сообщений в теме: 9
#1
Отправлено 11 Август 2014 - 20:52
#2
Отправлено 12 Август 2014 - 09:08
Во-первых, не перегружайте свой код переменными. Это и на производительность влияет и на читабельность. Весь ваш код выше можно сжать до:
Или вообще к такому варианту (тут еще оптимизация запроса):
Во-вторых, оба ваши варианта запроса на обновление содержат ошибку. В первом пропущено имя таблицы (указан только ее 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_* в условиях рекомендуется использовать запятые вместо точек для вставки переменных в поле.
Таким образом, окончательный варинт выглядит так:
Если же поле Абоенемент числовое, можно еще и кавычки убрать:
P.S. Посмотрел еще раз, и понял, что и запрос data_select_array тут тоже лишний, т.к. data_update итак будет работать только если запись найдена. Т.е. весь код приводится к одному запросу:
или
в зависимости от типа поля Абонемент (см. выше)
$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
Отправлено 13 Август 2014 - 08:34
спасибо,
data_update(451, EVENTS_ENABLE, array("f7691" => $line['Количество часов'] + $line['f7961']), "`f7671`='",$line['Абонемент'],"'");
сработал отлично.
data_update(451, EVENTS_ENABLE, array("f7691" => $line['Количество часов'] + $line['f7961']), "`f7671`='",$line['Абонемент'],"'");
сработал отлично.
#4
Отправлено 13 Август 2014 - 17:35
поправка - сработало, но не отлично
перезапись идёт, но только поля первой строки
вне зависимости от того, какое число вносим в поле абонемент
+ не срабатывает ("f7691" => $line['Количество часов'] + $line['f7961'])
каким образом: нет роста сумы, тоесть при вводе в поле Количество часов числа оно не сумируется с уже имеющимся в поле 7961, а заменяет его
перезапись идёт, но только поля первой строки
вне зависимости от того, какое число вносим в поле абонемент
+ не срабатывает ("f7691" => $line['Количество часов'] + $line['f7961'])
каким образом: нет роста сумы, тоесть при вводе в поле Количество часов числа оно не сумируется с уже имеющимся в поле 7961, а заменяет его
Сообщение отредактировал Midori: 13 Август 2014 - 17:38
#5
Отправлено 13 Август 2014 - 17:47
Записывать должно в строку, соответствующую заданному вами условию "`f7671`='".$line['Абонемент']."'". Если пишет не туда куда надо - значит само условие некорректное. Для начала, к примеру, скажите какой тип у полей "Абонемент" и `f7671`.
#6
Отправлено 13 Август 2014 - 21:04
цифровой, 10/0 у обоих
#7
Отправлено 14 Август 2014 - 08:59
А в чем вообще суть вашего кода? Что вы хотите сделать своим вычислением?
#8
Отправлено 14 Август 2014 - 20:41
если убрать общую мишуру то сводится примерно к такому заданию:
при покупке абонемента в таблицу Абонемент вносится запись следующего содержания:
Номер абонемента - ФИО покупателя - количество часов на абонементе - часов потрачено - часов осталось
Когда клиент использует карточку, в таблице Заявки заполняем поля Номер абонемента и Количество часов
Запрос ищет абонемент с нужным номером и суммирует Часов потрачено и Количество часов
при покупке абонемента в таблицу Абонемент вносится запись следующего содержания:
Номер абонемента - ФИО покупателя - количество часов на абонементе - часов потрачено - часов осталось
Когда клиент использует карточку, в таблице Заявки заполняем поля Номер абонемента и Количество часов
Запрос ищет абонемент с нужным номером и суммирует Часов потрачено и Количество часов
#9
Отправлено 15 Август 2014 - 12:31
data_update(451, EVENTS_ENABLE, array("f7691" => $line['Количество часов'] + $line['f7961']), "`f7671`=",$line['Абонемент']);
Судя по вашим словам, текущая таблица вычисления - это Заявки, а f7691 - это поле "Часов потрачено" в таблице Абонемент (451), но тогда почему оно оказалосьв $line? В $line лежат только поля текущей записи. Не мудрено, что у вас происходит не суммирование, а замена, т.к. в $line['f7961'] - пустота. Должно быть так:
Тут уже поле f7961 берется непосредственно из полученной по условию Заявки.
Судя по вашим словам, текущая таблица вычисления - это Заявки, а 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
Отправлено 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ую строку таблицы, не смотря на условие) код не решил.
вот что получилось:
$ans = data_select_array(451, "`f7671`=",$line['Абонемент']);
if ($ans) {
data_update(451, EVENTS_ENABLE, array("f7691" => $line['Количество часов'] + $ans['f7961']), "`f7671`=", $line['Абонемент']);
}
но ни одной из проблем ( перезапись, а не сума и перезапись в 1ую строку таблицы, не смотря на условие) код не решил.
Количество пользователей, читающих эту тему: 1
0 пользователей, 1 гостей, 0 анонимных