[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Тонкости mysql_affected_rows
Michael
Хелло.
Вот скрипт:
    mysql_query("UPDATE thirdproba SET str2 = 'mmm' WHERE num1 < 300");
echo 'AFFECTED_ROWS2 = ' . mysql_affected_rows() . "\n";

первый раз запускаю - физические изменения произошли - выведет: 3.
потом его же запускаю, физич. изменений нет - выведет: 0. Т.е. как обычно.

В одной cms запускаю тот же код - всегда выводит: 3.

Из-за чего может быть?





Спустя 34 минуты, 25 секунд (25.06.2010 - 11:46) Kuzya написал(а):
В первый раз в строках, где num1 < 300, поле str2 не равно mmm. Первый запрос всё меняет, и второй уже не делает ничего т.д. менять по сути нечего (в нужных str2 уже mmm)

Спустя 15 минут, 46 секунд (25.06.2010 - 12:02) waldicom написал(а):
Цитата (Kuzya @ 25.06.2010 - 10:46)
В первый раз в строках, где num1 < 300, поле str2 не равно mmm. Первый запрос всё меняет, и второй уже не делает ничего т.д. менять по сути нечего (в нужных str2 уже mmm)

Написал то же самое, потом почитал еще раз вопрос и стер.
Советую еще раз прочитать вопрос.

Спустя 13 минут, 19 секунд (25.06.2010 - 12:15) Kuzya написал(а):
Если Вы про
Цитата
В одной cms запускаю тот же код - всегда выводит: 3.

То та же CMS далее, в ходе работы, может менять эти записи на свои. Скорее всего так и есть, если запуская код "вчистую" - один результат, а в составе CMS - другой

Спустя 1 минута, 6 секунд (25.06.2010 - 12:17) SlavaFr написал(а):
Цитата (Michael @ 25.06.2010 - 08:12)

В одной cms запускаю тот же код - всегда выводит: 3.

Из-за чего может быть?

Cache?

Спустя 29 минут, 2 секунды (25.06.2010 - 12:46) Kuzya написал(а):
Да нет. Просто видимо дальше по коду в CMS выполняются какие-то запросы которые меняют те 3 строчки

Спустя 5 минут, 56 секунд (25.06.2010 - 12:51) glock18 написал(а):
Все просто. mysql_affected_rows() возвращает количество фактически измененных строк. то есть если строка под условие подошла, но она уже содержит нужные значения, она не считается smile.gif

Спустя 6 минут, 14 секунд (25.06.2010 - 12:58) waldicom написал(а):
Цитата (glock18 @ 25.06.2010 - 11:51)
Все просто. mysql_affected_rows() возвращает количество фактически измененных строк. то есть если строка под условие подошла, но она уже содержит нужные значения, она не считается smile.gif

Цитата
первый раз запускаю - физические изменения произошли - выведет: 3.
потом его же запускаю, физич. изменений нет - выведет: 0. Т.е. как обычно.

Т.е. Michael понимает этот факт. Его интересует, почему в другой CMS такое не работает.

Спустя 16 минут, 55 секунд (25.06.2010 - 13:15) Michael написал(а):
Цитата (Kuzya @ 25.06.2010 - 11:46)
Да нет. Просто видимо дальше по коду в CMS выполняются какие-то запросы которые меняют те 3 строчки

Я же пишу, что выполняю в cms тот же код:
mysql_query("UPDATE thirdproba SET str2 = 'mmm' WHERE num1 < 300");
echo 'AFFECTED_ROWS2 = ' . mysql_affected_rows() . "\n";

т.е. между запросом и подсчетом нет никакого "левого" кода. Да и функции использую низкоуровневые, а не оболочки от cms.

Спустя 12 минут, 15 секунд (25.06.2010 - 13:27) SlavaFr написал(а):
@Michael попробуй так

mysql_query("UPDATE thirdproba SET str2 = 'mmm' WHERE num1 < 300");
echo '1)AFFECTED_ROWS2 = ' . mysql_affected_rows() . "\n";
mysql_query("UPDATE thirdproba SET str2 = 'mmm' WHERE num1 < 300");
echo '2)AFFECTED_ROWS2 = ' . mysql_affected_rows() . "\n";


чисто из интереса

Спустя 8 минут, 55 секунд (25.06.2010 - 13:36) Michael написал(а):
SlavaFr, выводит:
1)AFFECTED_ROWS2 = 3
2)AFFECTED_ROWS2 = 3

p.s.cms - Drupal.

Спустя 55 минут, 43 секунды (25.06.2010 - 14:32) glock18 написал(а):
посмотри, может он функцию эту переопределяет. поведение ненормальное, пробегись поиском по проекту smile.gif

ЗЫ: сорри, че-то сначала не вьехал в суть проблемы, выходит.

Спустя 10 минут, 41 секунда (25.06.2010 - 14:42) Michael написал(а):
Цитата (glock18 @ 25.06.2010 - 13:32)
посмотри, может он функцию эту переопределяет. поведение ненормальное, пробегись поиском по проекту smile.gif

не, не заметно ничего.

Кстати, а как переопределить функцию php smile.gif ?

Спустя 28 минут, 28 секунд (25.06.2010 - 15:11) SlavaFr написал(а):
кроме как update ...where ... and str2 <> 'mmm'
не могу ни чего предложить.
Цитата
Кстати, а как переопределить функцию php smile.gif ?

это конечно вообще авантюрно smile.gif
http://de.php.net/manual/en/ref.runkit.php

Спустя 1 час, 11 минут, 9 секунд (25.06.2010 - 16:22) SlavaFr написал(а):
посмотри есть ли в mysql_connect 5-й параметр.
если я в коннекзии флаг 2 включаю, что соответствует CLIENT_FOUND_ROWS
mysql_connect('localhost','root','',false,2);

то у меня тоже начинает как у тебя показывать.



Спустя 13 минут, 33 секунды (25.06.2010 - 16:35) Michael написал(а):
Да, стоит двоечка.

Цитата
CLIENT_FOUND_ROWS

что то и в хелпе особо не описано. Где подробнее почитать ?

Спустя 7 минут, 28 секунд (25.06.2010 - 16:43) SlavaFr написал(а):
ето в общем в пхп не дефинированно, а в оригинальном коде mysql-clienta
http://de.php.net/manual/en/mysql.constants.php#96193

если от двоички избавится, то должно заработать

Спустя 8 минут, 46 секунд (25.06.2010 - 16:52) SlavaFr написал(а):
Цитата (SlavaFr @ 25.06.2010 - 13:43)
если от двоички избавится, то должно заработать

что перестанет после этого работать, еще не знаю smile.gif smile.gif smile.gif

Спустя 13 часов, 51 минута, 17 секунд (26.06.2010 - 06:43) Michael написал(а):
А никто от двоечки избавляться и не будет. Это же очень удобно.

Спустя 5 часов, 24 минуты, 13 секунд (26.06.2010 - 12:07) SlavaFr написал(а):
Цитата (Michael @ 26.06.2010 - 03:43)
А никто от двоечки избавляться и не будет. Это же очень удобно.

если ты упдате как "select count(*)" использовать хочеш, то да smile.gif

или есть еще какие то приемущества?

Спустя 2 часа, 26 минут, 7 секунд (26.06.2010 - 14:33) glock18 написал(а):
Фактически и тот, и тот вариант - заменяет один каунт. просто условия у такого каунта в обоих случаях немного отличаются smile.gif

Спустя 1 день, 21 час, 4 минуты, 22 секунды (28.06.2010 - 11:38) SlavaFr написал(а):
да, есть изобретения без которых мир мог бы обойтись.
А в общем это не нормально, что в функции используется значение константы которая в пхп не дефинированна. Не кому не нужно терять свое время на поиск причин неправильного действия функции по причине того, что в другой функции чтото необычное установлено. Я бы не чего не имел против, если бы mysql_affected_rows имела специальный параметер который бы CLIENT_FOUND_ROWS устанавливал, но в таком виде ...

Спустя 1 час, 41 минута, 25 секунд (28.06.2010 - 13:19) Michael написал(а):
Цитата (SlavaFr @ 26.06.2010 - 11:07)
или есть еще какие то приемущества?

вот мне никогда не нравилось что при запросе update функция mysql_affected_rows() стандартно(без этой малоизвестной настройки) возвращает кол-во реально физически измененных строк.
Это уже как бы тонкости базы - как оптимизировать запросы, а мне лично, как клиенту БД, логично ожидать, что выполняя update - все строки будут им затронуты. Почему? Да потому что я запрос шлю на изменение записей по условию и под это условие записи существуют. И результат запроса должен быть положительный.

Спустя 20 минут (28.06.2010 - 13:39) tomash написал(а):
Michael
Часто бывает нужно когда необходимо знать именно количество изменений фактических. Например для изменения записей по внешним ключам, что бы не делать лишних телодвижений)

Спустя 1 час, 51 минута, 51 секунда (28.06.2010 - 15:31) SlavaFr написал(а):
Цитата (Michael @ 28.06.2010 - 10:19)

а мне лично, как клиенту БД, логично ожидать, что выполняя update - все строки будут им затронуты. Почему? Да потому что я запрос шлю на изменение записей по условию и под это условие записи существуют. И результат запроса должен быть положительный.

да дело в том, что действительно они не будут затронуты, и если ты поля типа
xxx timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
имееш, то увидеш, что время не поменялось. Зачем тогда самообманом заниматся? лучше действительно дополнительный селект запустить.


_____________
There never was a struggle in the soul of a good man that was not hard
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.