Гость
Форумы / PHP, Perl, Python [игнор отключен] [закрыт для гостей] / Узнать были ли сохранены изменения в базу? / 10 сообщений из 10, страница 1 из 1
12.01.2018, 20:24
    #39583528
tarabukin
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Узнать были ли сохранены изменения в базу?
Есть простая таблица в sql. И по нажатию на кнопку сохранить выполняется сохранение изменений. Запрос такой:
$query = "UPDATE `comp` SET `comp_login`= '$comp_login', `comp_name` = '$comp_name', `see` = '$see', `p_status` = '$p_status', `comp_text` = '$comp_text' WHERE `id_comp` = '$id_comp' AND `id_clients` = '$id_clients'";
Значения переменных берутся с пост запроса. Примерно такие: $comp_login = mysql_real_escape_string($request['comp_login']);

Вопрос: Мне нужно знать была ли обновлена строка. Даже если ничего не было изменено, то тоже нужно вернуть истину.
Если проверить так: if(mysql_affected_rows() >0) , то возвращается ложь, если ничего не было изменено. Т.е. получается: открыли редактирование таблицы, ничего не поменяли, нажали сохранить, то выскакивает ошибка.

А if(mysql_affected_rows() == -1) выполняется только, если есть конкретные ошибки. Т.е. в таблице есть стpока enum со значениями '0','1'. Если я в это поле отправляю текст, то ставит 0 и пишет нет ошибки.

INSERT .... ON DUPLICATE KEY дает такой же результат, как и от update. Т.е. если не были изменены значения, то ничего не возвращается. Если сделаю условие: если mysqli_insert_id() ничего не возвратило - ошибка. То получается: открыли редактирование таблицы, ничего не поменяли, нажали сохранить, то выскачет ошибка.

Конечно можно сделать if(mysql_affected_rows() >0) с добавлением столбца например time(), но не хочется добавить лишний столбец.

Как обычно проверяют такие условия?
...
Рейтинг: 0 / 0
12.01.2018, 20:43
    #39583538
miksoft
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Узнать были ли сохранены изменения в базу?
Почему бы просто не проверить результат выполнения запроса на предмет ошибки?
Если ошибки не было, то изменения в базу сохранены.
...
Рейтинг: 0 / 0
12.01.2018, 21:43
    #39583559
vkle
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Узнать были ли сохранены изменения в базу?
tarabukinВопрос: Мне нужно знать была ли обновлена строка. Даже если ничего не было изменено, то тоже нужно вернуть истину.Встречный вопрос: как отличается ситуация "обновлена строка" от "не обновлена строка"? Собственно, только после четкого и ясного, хотя бы, для самого себя, ответа на этот вопрос, можно проверять отличительные признаки и делать выводы.

tarabukinЕсли проверить так: if(mysql_affected_rows() >0) , то возвращается ложь, если ничего не было изменено. Т.е. получается: открыли редактирование таблицы, ничего не поменяли, нажали сохранить, то выскакивает ошибка.Успешно отработавший запрос UPDATE вполне может обновить 0 строк, что и покажет mysql_affected_rows() с абсолютной точностью.

tarabukinКонечно можно сделать if(mysql_affected_rows() >0) с добавлением столбца например time(), но не хочется добавить лишний столбец.Ну... если обновления записей достаточно редки (реже, чем раз в секунду), а в дополнительное поле записывать текущий TIMESTAMP, тогда будут обновлены все записи, подходящие под условие и mysql_affected_rows() вернет число таких записей.
...
Рейтинг: 0 / 0
13.01.2018, 05:28
    #39583611
tarabukin
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Узнать были ли сохранены изменения в базу?
Допустим есть у посетителя личный кабинет. Он заходит в редактирование кабинета. Допустим он ничего не поменял. И нажимает кнопку сохранить. А у него выскакивает ошибка, что не удалось сохранить. По идее было бы хорошо, если бы вышло "Успешно сохранено".


miksoftПочему бы просто не проверить результат выполнения запроса на предмет ошибки?
Если ошибки не было, то изменения в базу сохранены.

Дело в том, что если тип поля не соответствует значению, то она не показывает ошибку. Например, есть поле со значением enum: 0, 1. Если впихать туда строку типа 'dfklm', она не покажет ошибку, просто молча пихает 0 - значение по умолчанию и не показывает ошибку
...
Рейтинг: 0 / 0
13.01.2018, 06:36
    #39583614
vkle
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Узнать были ли сохранены изменения в базу?
tarabukinесть поле со значением enum: 0, 1. Если впихать туда строку типа 'dfklm',Стоп. С какого перепугу в это поле впихивается левое значение? Проверяйте данные, прежде чем пихать чего попало. Не "0" и не "1" - формируйте сообщение об ошибке и/или устанавливайте значение по дефолту.
...
Рейтинг: 0 / 0
13.01.2018, 07:05
    #39583615
tarabukin
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Узнать были ли сохранены изменения в базу?
vkletarabukinесть поле со значением enum: 0, 1. Если впихать туда строку типа 'dfklm',Стоп. С какого перепугу в это поле впихивается левое значение? Проверяйте данные, прежде чем пихать чего попало. Не "0" и не "1" - формируйте сообщение об ошибке и/или устанавливайте значение по дефолту.

Нельзя ли сделать так, чтобы sql сказал, что данные не те. Почему, если тип другой (например: если в int пихают строку), то не выводиться ошибка, а просто ставиться значение по умолчанию?
...
Рейтинг: 0 / 0
13.01.2018, 07:10
    #39583616
tarabukin
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Узнать были ли сохранены изменения в базу?
tarabukin,

Даже не ставиться оказывается значение по умолчанию, а ставиться пустота, хотя стоит not Null. И ошибок не выдает. Или как еще можно вызвать ошибку, если на поле ставиться пустое значение.
...
Рейтинг: 0 / 0
13.01.2018, 07:27
    #39583617
tarabukin
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Узнать были ли сохранены изменения в базу?
Попробую написать понятнее))):
Если в поле ENUM со значением '0', '1' ставлю значение 'stroka', то в поле ставиться пустота, хотя стоит not null, и нет никакой ошибки. Как можно получить ошибку, если в поле ставится недопустимое значение?
...
Рейтинг: 0 / 0
13.01.2018, 12:18
    #39583649
vkle
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Узнать были ли сохранены изменения в базу?
tarabukinДаже не ставиться оказывается значение по умолчанию, а ставиться пустотаВообще, не припоминаю в мускуле понятия "пустота". Есть "пустая строка", оно же "empty string". Ещё есть NULL - тоже, пустота своего рода. Ну, да, судя по дукументации, пустая строка и является признаком ошибочного значения, и это стандартное поведение СУБД: https://dev.mysql.com/doc/refman/5.7/en/enum.html#enum-nulls

tarabukinИли как еще можно вызвать ошибку, если на поле ставиться пустое значение.В той же доке прям в соседней строчке упоминается sql mode. Эта штука в некоторых пределах управляет поведением мускуля. Возможно, какой-то из sql mode обеспечивает желаемое поведение. Попробуйте в эту сторону посмотреть.
...
Рейтинг: 0 / 0
14.01.2018, 07:46
    #39583846
tarabukin
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Узнать были ли сохранены изменения в базу?
vkletarabukinДаже не ставиться оказывается значение по умолчанию, а ставиться пустотаВообще, не припоминаю в мускуле понятия "пустота". Есть "пустая строка", оно же "empty string". Ещё есть NULL - тоже, пустота своего рода. Ну, да, судя по дукументации, пустая строка и является признаком ошибочного значения, и это стандартное поведение СУБД: https://dev.mysql.com/doc/refman/5.7/en/enum.html#enum-nulls

tarabukinИли как еще можно вызвать ошибку, если на поле ставиться пустое значение.В той же доке прям в соседней строчке упоминается sql mode. Эта штука в некоторых пределах управляет поведением мускуля. Возможно, какой-то из sql mode обеспечивает желаемое поведение. Попробуйте в эту сторону посмотреть.
Спасибо vkle посмотрю
...
Рейтинг: 0 / 0
Форумы / PHP, Perl, Python [игнор отключен] [закрыт для гостей] / Узнать были ли сохранены изменения в базу? / 10 сообщений из 10, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]