За последние 24 часа нас посетили 59114 программистов и 1811 роботов. Сейчас ищут 994 программиста ...

Подскажите по обновлению таблицы

Тема в разделе "PHP для новичков", создана пользователем tarabukinivan, 9 янв 2018.

  1. tarabukinivan

    tarabukinivan Активный пользователь

    С нами с:
    7 ноя 2016
    Сообщения:
    21
    Симпатии:
    0
    Есть простая таблица в 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 и пишет нет ошибки.

    Как обычно проверяют такие условия?
     
  2. karmay

    karmay Активный пользователь

    С нами с:
    9 ноя 2017
    Сообщения:
    180
    Симпатии:
    18
    Адрес:
    Н.Новгород
    Если id_clients или id_comp предполагают AUTO INCREMENT, попробуйте INSERT .... ON DUPLICATE KEY, после успешного запроса на обновление mysqli_insert_id возвратит id измененного значения.
    Мануал тут
     
  3. tarabukinivan

    tarabukinivan Активный пользователь

    С нами с:
    7 ноя 2016
    Сообщения:
    21
    Симпатии:
    0
    Спасибо большое! Т.е. делаю INSERT .... ON DUPLICATE KEY и указываю id уже существующей обновляемой строки.
     
  4. tarabukinivan

    tarabukinivan Активный пользователь

    С нами с:
    7 ноя 2016
    Сообщения:
    21
    Симпатии:
    0
    К сожалению от INSERT .... ON DUPLICATE KEY такой же результат, как и от update. Т.е. если не были изменены значения, то ничего не возвращается. Например, если сделаю условие: если mysqli_insert_id() ничего не возвратило - ошибка. То получается: открыли редактирование таблицы, ничего не поменяли, нажали сохранить, то выскачет ошибка.
    Можно сделать столбец с time(), но не хочется добавить лишний столбец.
     
  5. karmay

    karmay Активный пользователь

    С нами с:
    9 ноя 2017
    Сообщения:
    180
    Симпатии:
    18
    Адрес:
    Н.Новгород
    Добавьте тогда условие. если запрос вернул false найдите id записи, типа
    PHP:
    1. if($query == false){
    2. SELECT comp_login IN comp WHERE `comp_login`= '$comp_login'
    3. }
     
  6. tarabukinivan

    tarabukinivan Активный пользователь

    С нами с:
    7 ноя 2016
    Сообщения:
    21
    Симпатии:
    0
    Найду $comp_login, потом проверять все значения совпадают с новыми или нет?
     
  7. karmay

    karmay Активный пользователь

    С нами с:
    9 ноя 2017
    Сообщения:
    180
    Симпатии:
    18
    Адрес:
    Н.Новгород
    Чет мысль потерял, вчерашний старый новый не прошел бесследно. Суть в том, что MySQL в некоторых случаях не дает обновлять строки, это связанно с уникальными строками и ключами. К сожалению, я не помню точно как я решал эту проблему (поэтому пост мой всего лишь флуд бестлоковый), при добавлении новостей, я проверял таблицу с источниками, на совпадение, и если такое было ..../* начинаю вспоминать*/.... если совпадение было, а у этого поля был уникальный ключ, то изменить его не получалось, запрос возвращал результат сопоставляемый с false, и следом шла проверка, если запрос добавления переменной $источник возвращает false, то делаю запрос который возвращает id той записи, где поле содержит $источник
    <!-- Пойду за пивом, чет совсем тяжко, всех с новым годом!! -->
     
    tarabukinivan нравится это.
  8. tarabukinivan

    tarabukinivan Активный пользователь

    С нами с:
    7 ноя 2016
    Сообщения:
    21
    Симпатии:
    0
    Спасибо.