Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/topic.php on line 737
Форумы портала PHP.SU :: PHP Mysql UPDATE + переменная с инкриментом

 PHP.SU

Программирование на PHP, MySQL и другие веб-технологии
PHP.SU Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи


 Страниц (2): [1] 2 »   

> Без описания
temp11
Отправлено: 11 Мая, 2013 - 16:50:59
Post Id


Новичок


Покинул форум
Сообщений всего: 5
Дата рег-ции: Май 2013  


Помог: 0 раз(а)




Как правильно перенести конструкцию на понятный для mysql_query язык и сформировать одним запросом?
CODE (SQL):
скопировать код в буфер обмена
  1. SET @i :=0;
  2. UPDATE  `tables` SET  `pos` = ( @i := @i +1 ) WHERE  `from` =  0 ORDER BY  `pos`;

Благодарю за ответ.

(Отредактировано автором: 11 Мая, 2013 - 16:59:00)

 
 Top
imya
Отправлено: 11 Мая, 2013 - 17:04:01
Post Id



Участник


Покинул форум
Сообщений всего: 1472
Дата рег-ции: Сент. 2012  
Откуда: Запорожье, Украина


Помог: 19 раз(а)




PHP:
скопировать код в буфер обмена
  1. for($i=0;$i<10;$i++)
  2. {
  3. $row = mysql_query(UPDATE  `tables` SET `pos` = `pos`+$i  WHERE `from` = 0 ORDER BY `pos`;
  4. }


?

может не совсем верно, но думаю логика ясна


-----
PHP:
скопировать код в буфер обмена
  1. do {box != cat;} while (cat != box);


Когда нормальный человек, уезжая из дома одевает на жену пояс верности, веб-дизайнер ставит на нее счетчик...
 
My status
 Top
temp11
Отправлено: 11 Мая, 2013 - 17:16:03
Post Id


Новичок


Покинул форум
Сообщений всего: 5
Дата рег-ции: Май 2013  


Помог: 0 раз(а)




imya, Спасибо за ответ. Логика ясна, очевидна и прозрачна.
Задача немного иная))
Очевидно, что запрос
CODE (SQL):
скопировать код в буфер обмена
  1. mysql_query("SET @i :=0");
  2. mysql_query("UPDATE  `tables` SET  `pos` = ( @i := @i +1 ) WHERE {.....}");

более оптимален, чем цикл for средствами php + десятки-сотни-тысячи единичных запросов UPDATE + в Вашем варианте нужно знать сколько эта $i.
Интересует нечто
CODE (SQL):
скопировать код в буфер обмена
  1. mysql_query("UPDATE  `tables` SET  `pos` = IF(@i='', @i :=0, @i := @i+1) WHERE {.....}");

Я неважно разбираюсь в переменных и логике в запросах Mysql, но думается мысль понятна.

(Отредактировано автором: 11 Мая, 2013 - 17:20:35)

 
 Top
imya
Отправлено: 13 Мая, 2013 - 09:48:24
Post Id



Участник


Покинул форум
Сообщений всего: 1472
Дата рег-ции: Сент. 2012  
Откуда: Запорожье, Украина


Помог: 19 раз(а)




А не проще сделать поле автоинкрементом и не выдумывать?)


-----
PHP:
скопировать код в буфер обмена
  1. do {box != cat;} while (cat != box);


Когда нормальный человек, уезжая из дома одевает на жену пояс верности, веб-дизайнер ставит на нее счетчик...
 
My status
 Top
temp11
Отправлено: 17 Мая, 2013 - 14:13:28
Post Id


Новичок


Покинул форум
Сообщений всего: 5
Дата рег-ции: Май 2013  


Помог: 0 раз(а)




imya пишет:
А не проще сделать поле автоинкрементом и не выдумывать?)

Конечно проще, но невозможно)
Мне не нужно `pos` = `pos`+$i и `pos` = `pos`+1
Вы предлагаете:
1) Узнать изначальное количество i.
2) Совершить отдельный запрос к к базе для его обновления
3) Результатом операции станет начальное (значение POS)+(i).
А точнее ничего, т.к. запрос в конечном итоге обновит все строки с условие `FROM`=0 в в последнее значение $i.
Может Вы невнимательно прочли мои сообщения оба раза.. мне нужно определить POS от 1 до X, по выборке FROM. (Это ясно из моего первого сообщения)
CODE (htmlphp):
скопировать код в буфер обмена
  1.  
  2. id      |       from    |       pos
  3. -------------------------------------
  4. 1       |       1       |       1
  5. 2       |       1       |       2
  6. 3       |       2       |       1
  7. 4       |       2       |       2
  8. 5       |       2       |       3
  9. 6       |       2       |       4
  10. 7       |       2       |       5
  11. 8       |       2       |       6

PS Конечно, если Вы не имеете ввиду некое мифическое поле с автоинкрементом, которое принес Санта на рождество.


(Добавление)
Видимо одним запросом тут не обойтись.
Придется значит двумя запросами обходиться...
CODE (SQL):
скопировать код в буфер обмена
  1. SET @i :=0;
  2. UPDATE  `tables` SET  `pos` = ( @i := @i +1 ) WHERE  `from` =  0 ORDER BY  `pos`;

(Отредактировано автором: 17 Мая, 2013 - 14:20:41)

 
 Top
imya
Отправлено: 17 Мая, 2013 - 14:56:43
Post Id



Участник


Покинул форум
Сообщений всего: 1472
Дата рег-ции: Сент. 2012  
Откуда: Запорожье, Украина


Помог: 19 раз(а)




Запутано у вас всё однако)

temp11 пишет:
Видимо одним запросом тут не обойтись.
Придется значит двумя запросами обходиться...
CODE (SQL):
скопировать код в буфер обмена
  1. SET @i :=0;
  2. UPDATE  `tables` SET  `pos` = ( @i := @i +1 ) WHERE  `from` =  0 ORDER BY  `pos`;

Почему двумя? У вас один лишь update и всё


-----
PHP:
скопировать код в буфер обмена
  1. do {box != cat;} while (cat != box);


Когда нормальный человек, уезжая из дома одевает на жену пояс верности, веб-дизайнер ставит на нее счетчик...
 
My status
 Top
temp11
Отправлено: 17 Мая, 2013 - 15:07:18
Post Id


Новичок


Покинул форум
Сообщений всего: 5
Дата рег-ции: Май 2013  


Помог: 0 раз(а)




Что именно Вам кажется запутанным?
imya пишет:
Почему двумя? У вас один лишь update и всё

Нужно предопределить переменную i (даже скорее объявить ее).
CODE (SQL):
скопировать код в буфер обмена
  1. mysql_query("SET @i :=0; UPDATE  `tables` SET  `pos` = ( @i := @i +1 ) WHERE  `from` =  0 ORDER BY  `pos`;")

Выполнить невозможно, а значит переменная должна быть определена (-- объявлено ее значение) либо в самом запросе UPDATE, либо предварительным (еще одним), отдельным запросом.
Вот и суть дилеммы: Как определить объявить и установить значение переменной в запросе UPDATE.

PS:
CODE (SQL):
скопировать код в буфер обмена
  1. mysql_query("SET @i :=0;")
  2. mysql_query("UPDATE  `tables` SET  `pos` = ( @i := @i +1 ) WHERE  `from` =  0 ORDER BY  `pos`;")

Отлично работает и выполняет возложенные на нее обязательства)) Но хочется избавится от объявления переменной дополнительным запросом:
CODE (SQL):
скопировать код в буфер обмена
  1. mysql_query("SET @i :=0;")

(Отредактировано автором: 17 Мая, 2013 - 15:08:12)

 
 Top
DeepVarvar Супермодератор
Отправлено: 17 Мая, 2013 - 20:46:18
Post Id



Активный участник


Покинул форум
Сообщений всего: 10377
Дата рег-ции: Дек. 2008  
Откуда: Альфа Центавра


Помог: 353 раз(а)




temp11 пишет:
mysql
Это deprecated, используйте mysqli* и его http://ru2.php.net/mysqli_multi_query , тут какраз разделитель между "запросами" точка с запятой, а транзакция одна до сервера.
(Добавление)
И чо я раньше в эту тему не зашол..
 
 Top
temp11
Отправлено: 18 Мая, 2013 - 10:49:18
Post Id


Новичок


Покинул форум
Сообщений всего: 5
Дата рег-ции: Май 2013  


Помог: 0 раз(а)




DeepVarvar
Спасибо.
 
 Top
webog
Отправлено: 09 Июля, 2013 - 18:57:52
Post Id


Частый гость


Покинул форум
Сообщений всего: 242
Дата рег-ции: Нояб. 2011  


Помог: 0 раз(а)

[+]


Похожая проблема!

В цикле запрос к базе! Ответ $a = 0 (в базе записан ноль)
В этотм же цикле условие и запрос

PHP:
скопировать код в буфер обмена
  1. $b = '5';
  2.  
  3. if ($b >= $a){ mysql_query("UPDATE `name` SET namep = namep+1") or die(mysql_error());
  4. выполняю ЗАДАЧУ}


Задача! При обновлении скрипта пять раз ($b = '5';) записать в базу число 5 вместо нуля.

У меня получается: В базе ноль, запуск скрипта 0/5 , после пяти запусков 5/5 в базе число шесть. Где туплю? Спасибо!


-----
Hello!
 
 Top
LIME
Отправлено: 09 Июля, 2013 - 19:50:01
Post Id


Активный участник


Покинул форум
Сообщений всего: 10732
Дата рег-ции: Нояб. 2010  


Помог: 322 раз(а)




от 0 до <=5 это шесть запусков
давай считать 0, 1, 2, 3, 4, 5
сколько циферь??
 
 Top
webog
Отправлено: 09 Июля, 2013 - 21:26:48
Post Id


Частый гость


Покинул форум
Сообщений всего: 242
Дата рег-ции: Нояб. 2011  


Помог: 0 раз(а)

[+]


LIME пишет:
от 0 до <=5 это шесть запусков
давай считать 0, 1, 2, 3, 4, 5
сколько циферь??


Пути решения?

Записать в базу 1 или до 4 крутить цикл? Дык если в админке АДМИН напишет 5ть и ему нужно будет пять!?..


-----
Hello!
 
 Top
VenZell
Отправлено: 09 Июля, 2013 - 21:36:31
Post Id


Частый гость


Покинул форум
Сообщений всего: 237
Дата рег-ции: Июнь 2013  


Помог: 12 раз(а)




CODE (SQL):
скопировать код в буфер обмена
  1. mysql_query("SET @i :=1");

А так?
 
 Top
LIME
Отправлено: 09 Июля, 2013 - 21:39:26
Post Id


Активный участник


Покинул форум
Сообщений всего: 10732
Дата рег-ции: Нояб. 2010  


Помог: 322 раз(а)




тоже можно
webog от таких вопросов хочется плакать...это очень грустно
 
 Top
webog
Отправлено: 09 Июля, 2013 - 22:00:19
Post Id


Частый гость


Покинул форум
Сообщений всего: 242
Дата рег-ции: Нояб. 2011  


Помог: 0 раз(а)

[+]


LIME пишет:тоже можно
webog от таких вопросов хочется плакать...это очень грустно


Да, работает, в базе 5.
Но при запуске скрипта 4.
Т.е.
Скрипт/База = 0/1
Скрипт/База = 1/2
Скрипт/База = 2/3
Скрипт/База = 3/4
Скрипт/База = 4/5

Скрипт выводит пользователю 4, а нужно 5ть
(Добавление)
VenZell пишет:
CODE (SQL):
скопировать код в буфер обмена
  1. mysql_query("SET @i :=1");

А так?


Простите, но думаю эффект тот же...


-----
Hello!
 
 Top
Страниц (2): [1] 2 »
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« Работа с СУБД »


Все гости форума могут просматривать этот раздел.
Только зарегистрированные пользователи могут создавать новые темы в этом разделе.
Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
 



Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS  RSS

 
Powered by ExBB FM 1.0 RC1. InvisionExBB