powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / MySQL [игнор отключен] [закрыт для гостей] / insert_id возвращает 0
12 сообщений из 12, страница 1 из 1
insert_id возвращает 0
    #38980485
lucky89
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Здравствуйте! Есть таблица, где поле isbn это AUTO_INCREMENT. Делаю запрос на обновление:
Код: php
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
    if (!($stmt = $mysqli->prepare('UPDATE users SET activate=1 WHERE isbn=? AND activateHash=?')) ||
        !$stmt->bind_param('is', $isbn, $activateHash) ||
        !$stmt->execute()/* ||
        !$stmt->close()*/)
    {
        die(basename(__FILE__).' строка '.__LINE__.': Не удалось подготовить запрос UPDATE users: (' . $mysqli->errno . ') ' . $mysqli->error);
    }

echo($stmt->insert_id . '<br/>');
echo($stmt->affected_rows . '<br/>');
echo($stmt->field_count . '<br/>');



Как узнать была ли изменена строка или входные параметры были не верны и условие isbn=? AND activateHash=? не нашлось?
Я хотел проверять какое-нибудь значение из echo, но все они всегда выдают 0, хотя update происходит. Только $mysqli->info выдает Rows matched: 1 Changed: 0 Warnings: 0 этим конечно можно пользоваться, но совершенно не удобно...

Главный вопрос, почему insert_id, affected_rows, field_count всегда равны 0? (при INSERT все нормально, строки считаются)
Как мне правильно проверить обновилась строка или нет?
...
Рейтинг: 0 / 0
insert_id возвращает 0
    #38980504
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
insert_id вообще к UPDATE никакого отношения не имеет.
affected_rows не учитывает записи, которые не были фактически изменены. Т.е. даже если под условие WHERE попали какие-то записи, но реального изменения в них не произошло, т.к. новые значения уже содержатся в полях этих записей, то они посчитаны не будут.
...
Рейтинг: 0 / 0
insert_id возвращает 0
    #38980514
lucky89
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Допустим изменение происходит реально.
Как же тогда на php.net для affected_rows - Возвращает количество строк, измененных запросом INSERT, UPDATE или DELETE;
для insert_id - Функция mysqli_insert_id() возвращает ID, генерируемый запросом к таблице, которая содержит колонку с атрибутом AUTO_INCREMENT. Если последний запрос не был INSERT или UPDATE или в модифицируемой таблице отсутствует колонка с атрибутом AUTO_INCREMENT, данная функция вернет ноль.
Запрос был UPDATE и AUTO_INCREMENT есть. Но все равно 0.

Если все это не правильно, то как лучше сделать?
...
Рейтинг: 0 / 0
insert_id возвращает 0
    #38980516
tanglir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
lucky89Как мне правильно проверить обновилась строка или нет?если ошибку не вернуло, значит, обновилась
...
Рейтинг: 0 / 0
insert_id возвращает 0
    #38980517
tanglir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
lucky89Запрос был UPDATE и AUTO_INCREMENT есть. Но все равно 0.
lucky89Функция mysqli_insert_id() возвращает ID, генерируемый запросом к таблицеапдейт-запрос новых идов не генерирует
...
Рейтинг: 0 / 0
insert_id возвращает 0
    #38980521
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
lucky89Как же тогда на php.net для affected_rows - Возвращает количество строк, измененных запросом INSERT, UPDATE или DELETE;Именно "измененных".
http://dev.mysql.com/doc/refman/5.5/en/information-functions.html#function_row-count For UPDATE statements, the affected-rows value by default is the number of rows actually changed. If you specify the CLIENT_FOUND_ROWS flag to mysql_real_connect() when connecting to mysqld, the affected-rows value is the number of rows “found”; that is, matched by the WHERE clause.Возможно, CLIENT_FOUND_ROWS поможет.


lucky89для insert_id - Функция mysqli_insert_id() возвращает ID, генерируемый запросом к таблице, которая содержит колонку с атрибутом AUTO_INCREMENT. Если последний запрос не был INSERT или UPDATE или в модифицируемой таблице отсутствует колонка с атрибутом AUTO_INCREMENT, данная функция вернет ноль.
Запрос был UPDATE и AUTO_INCREMENT есть. Но все равно 0.Не знаю, где вы это взяли, но в оригинальной документации про UPDATE ничего нет:
http://dev.mysql.com/doc/refman/5.5/en/information-functions.html#function_last-insert-id With no argument, LAST_INSERT_ID() returns a 64-bit value representing the first automatically generated value successfully inserted for an AUTO_INCREMENT column as a result of the most recently executed INSERT statement.

lucky89как лучше сделать?Пока еще не очень понятно, что именно и зачем нужно сделать.
...
Рейтинг: 0 / 0
insert_id возвращает 0
    #38980527
lucky89
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
tanglirесли ошибку не вернуло, значит, обновилась
Меняю activateHash на неправильный, isbn=? AND activateHash=? не выполняется, активация не выполнена, строка не изменена, ошибок не выдается. Значит, как вы написали, такой проверке верить нельзя.

С insert_id() понятно, спасибо tanglir.

С affected_rows и field_count пока не ясно.
И про то что affected_rows не считает, если новые значения уже есть в таблице нигде не написано. Разве нельзя выполнить UPDATE users SET activate=1 WHERE activate=1? 1 не перезапишется снова на 1?
...
Рейтинг: 0 / 0
insert_id возвращает 0
    #38980529
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
lucky89И про то что affected_rows не считает, если новые значения уже есть в таблице нигде не написано.В оригинальной документации написано. Одно из мест я процитировал выше.

lucky89Разве нельзя выполнить UPDATE users SET activate=1 WHERE activate=1? 1 не перезапишется снова на 1?Выполнить можно. Но не перезапишется. Насколько я помню, даже триггера не сработают.
...
Рейтинг: 0 / 0
insert_id возвращает 0
    #38980530
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
lucky89Допустим изменение происходит реально.
Как же тогда на php.net для affected_rows - Возвращает количество строк, измененных запросом INSERT, UPDATE или DELETE;
для insert_id - Функция mysqli_insert_id() возвращает ID, генерируемый запросом к таблице, которая содержит колонку с атрибутом AUTO_INCREMENT. Если последний запрос не был INSERT или UPDATE или в модифицируемой таблице отсутствует колонка с атрибутом AUTO_INCREMENT, данная функция вернет ноль.
Запрос был UPDATE и AUTO_INCREMENT есть. Но все равно 0.

Если все это не правильно, то как лучше сделать?

Лучше, даже если все это правильно, прочитать строку(ки) обратно и проверить, что она(они) действительно изменились.
...
Рейтинг: 0 / 0
insert_id возвращает 0
    #38980533
lucky89
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
miksoftПока еще не очень понятно, что именно и зачем нужно сделать.
Обычная активация email.
Пробую все ужать в 1 обращение к БД, без предварительных INSERT и вообще без сравнений в PHP.
Когда пользователь регистрировался ему присваевается уникальный isbn (AUTO_INCREMENT) и записывается случайная md5 в activateHash. Отправляется письмо на email с сылкой с get параметрами isbn и activateHash, он по ней переходит и дальше я придумал что выполняется команда UPDATE users SET activate=1 WHERE isbn=? AND activateHash=?, строка изменится только в том случае если связка isbn и activateHash верна, и пользователь активируется иначе либо ошибка либо строка не находится и значит не меняется.
Вопрос, как точно узнать была ли изменена строка?
...
Рейтинг: 0 / 0
insert_id возвращает 0
    #38980546
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
lucky89,

В данном случае, имхо, лучше совета MasterZiv-а вряд ли что-то придумаешь. Читаете запись и проверяете activate. Или читаете с условием "нужный пользователь" и activate=1 и проверяете, вернулась ли запись. Или COUNT-ом считаете количество записей с условием "нужный пользователь" и activate=1. Первые два варианта мне больше нравятся, т.к. попутно можно прочитать остальные поля и, например, вывести приветствие вида "Здравствуйте, Иванов Иван Иванович. Ваша учетная запись активирована".
...
Рейтинг: 0 / 0
insert_id возвращает 0
    #38980548
lucky89
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Пожалуй сделаю как советуете, прочитаю запись. Но у меня получилось в 1 запрос (affected_rows заработал), только там добавится нюанс, если пользователь второй раз по ссылке кликнет, типа повторную активацию вызовит, когда activate уже = 1.
Код: php
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
if (!($stmt = $mysqli->prepare('UPDATE users SET activate=1 WHERE isbn=? AND activateHash=?')) ||
    !$stmt->bind_param('is', $isbn, $activateHash) ||
    !$stmt->execute())
{
    die(basename(__FILE__).' строка '.__LINE__.': Не удалось выполнить запрос UPDATE users: (' . $mysqli->errno . ') ' . $mysqli->error);
}

if($stmt->affected_rows !== 1){
    die('Активация не удалась. Или вы уже активировались раньше.');//Вот это корявая ситуация, придется переделать как советуете вы
}

echo('Успешная активация!');
...
Рейтинг: 0 / 0
12 сообщений из 12, страница 1 из 1
Форумы / MySQL [игнор отключен] [закрыт для гостей] / insert_id возвращает 0
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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