Forum Webscript.Ru
Программирование => PHP => Тема начата: Varvara от 04 Февраля 2004, 12:09:31
-
Как написать update c увеличение на переменную $i для всех полей БД.
for ($i=0;$i<$total;$i++)
-
в бд не нет полей.
в бд лежат строки.
а поля - в строках.
если тебе одно поле во всех строках увеличить на единицу,
то update table set pole=pole+1
если нет, то постарайся писать чуть более связно, чтобы не приходилось большую часть задачи за тебя придумывать
-
Как написать update c увеличение на переменную $i для всех строк БД, если переменная увеличивается по циклу
for ($i=0;$i<$total;$i++)
Пример неработающего кода:
for ($i=0;$i<$total;$i++) {
....
$query = "UPDATE catalogs2 SET cat_left=\'$last_cat_left\'+\'$i\', cat_right=\'$last_cat_right\'-\'$i\' ";
....
}
-
я уже понял.
Варенька, милая, почитай вот это пожалуйста
http://phpclub.ru/talk/showthread.php?s=&threadid=26843
после того, как жгучий стыд пройдет, опиши нам тему, над которой ты работаешь, и мы с тобой вместе выведем формулу.
Договорились?
-
Проблему я описала выше, более узко к примеру кода.
Есть цикл увеличивающийся на $i - единицу как написать запрос на обновление на эту увелич. переменную???
-
пошла вторая итерация....
Варенька, милая, почитай вот это пожалуйста
http://phpclub.ru/talk/showthread.php?s=&threadid=26843
после того, как жгучий стыд пройдет, опиши нам тему, над которой ты работаешь, и мы с тобой вместе выведем формулу.
Договорились?
писать запрос на увеличение переменной - это значит не понимать программирования вообще. это вместо программы использовать счетные палочки.
меня интересует не твой апдейт, а задача, которую ты с его попощью решаешь. Неужели я так непонятно пишу?
-
Таблица:
Были значения -
cat_left - cat_right
1 - 6
2 - 5
3 - 4
Хотелось бы -
cat_left cat_right
2 - 7
3 - 6
4 - 5
Пишу запрос на перемещение потомков по Nested Sets, знаю что есть function moveAll в классе Nested Sets.
-
если не работает запрос, то надо вывести mysql_error() и сам запрос на экран.
-
Что такое mysql_error() , я знаю, ответь на мой вопрос!
Как обновить БД циклической переменной $i ???
-
точно так же, как и не циклической.
вообще, можно бы и сообразить, что источник переменной - цикл или форма или руками присвоил - никакого значения на синтаксис запроса не имеет.
как запрос составила - так он и выполнился.
ты where в апдейте указываешь?
или за тебя это Пушкин АС будет делать?
-
Да нет, девушка одной простой вещи не понимает.
Видите ли, Варя, когда вы пишете
UPDATE таблица SET что-нибудь WHERE условие
то "что-нибудь" будет выполнено для ВСЕХ записей, для которых верно "условие". Иными словами, "цикл" за вас проделает база данных. Сама. То есть вам никакого цикла писать не надо .
-
гоша но тогда надо переменную вводить.
я вообще, в этой технологии нестед сетс не разбирался.
может быть, там действительно надо в цикле у определенных полей значение увеличивать.
-
Varvara
при чем здесь циклическая переменная ? При перемещении узла, cat_left, cat_right у узла и всех его потомков меняются на одинаковое значение:
UPDATE tab SET cat_left = cat_left + 1, cat_right=cat_right+1 WHERE cat_left BETWEEN 1 AND 6.
PS
dbtree c исправленным методом moveAll лежит на
http://max.phpclub.net/sources/dbtree.phps (правда на реальных проэктах не оттестирован)
-
запрос который я привел - лишь для примера, что смещения на одинаковое значение меняются. Для перемещения надо запрос посложнее делать
-
На самом деле цикл берется из проверки потомков, взависимости от количества потомков, зная новое значение родителя после перемещения, имея цикл легко создать потомков увеличивая cat_left и уменьшая cat_right на $i, это очень логическое решешие проблемы.
Я не вникала в код function moveAll, т.к. хочу разабраться сама и почти написала свои функции для работы с этим алгоритном, осталось разобраться с перемещением, бьюсь целую неделю, до конца не могу нащупать универсальный путь.
СПАСИБО!
-
Varvara:
На самом деле цикл берется из проверки потомков, взависимости от количества потомков,
кол-во потомков = (cat_right - cat_left - 1) / 2
и не надо никакого циклаVarvara:
до конца не могу нащупать универсальный путь.
при перемещении надо 3 варианта обрабатывать:
- перемещение ула влево
- перемещение узла вправо
- перемещение вверх
(так сделано в moveAll хотя реально он не оттестирован)
-
Обьясни мне хоть ты как сделать так:
Рабочий пример -
$pot =($cat_right - $cat_left - 1) / 2;
for ($i=1; $i<=$pot;$i++){
$query = "INSERT INTO catalogs2 (cat_left, cat_right) values(\'$cat_left\'+\'$i\', \'$cat_right\'-\'$i\')";
mysql_query( $query, $db )or die ( "Не могу добавить новые данные в базу");
mysql_close( $db);
}
Делает то что мне надо, а то же самое с update не работает -
$pot =($cat_right - $cat_left - 1) / 2;
for ($i=1; $i<=$pot;$i++){
$query = "UPDATE catalogs2 SET cat_left=\'$cat_right\'+\'$i\', cat_right=\'$cat_right\'-\'$i\' where cat_left between \'$cat_left\' and \'$cat_right\'";
mysql_query( $query, $db )or die ( "Не могу обновить данные в базе");
mysql_close( $db);
}
-
Varvara:
$pot =($cat_right - $cat_left - 1) / 2;
for ($i=1; $i<=$pot;$i++){
$query = "INSERT INTO catalogs2 (cat_left, cat_right) values(\'$cat_left\'+\'$i\', \'$cat_right\'-\'$i\')";
mysql_query( $query, $db )or die ( "Не могу добавить новые данные в базу");
mysql_close( $db);
}
что делает этот пример? Я понял что какие-то узлы добавляет, но какие ?
и что ты хочешь сделать Update-ом ?
-
Эти упращеные примеры по работе с родителем и потомками каталога?
У меня вопрос почему insert работает в цикле, а update нет?
А вообще мне нужно изменить значение потомков, было
после нового значения ровдителя
8 - 13
5 - 8
6 - 7
Как одним update изменить, что бы было так
8 -13
9 - 12
10 -11
Родитель и потомки перемещены.
-
Varvara:
А вообще мне нужно изменить значение потомков, было
после нового значения ровдителя
8 - 13
5 - 8
6 - 7
Как одним update изменить, что бы было так
8 -13
9 - 12
10 -11
А для первого узла (8 - 13) - ничего менять не надо ?
UPDATE tab SET cat_left = cat_left + 4, cat_right = cat_right + 4 WHERE cat_left BETWEEN 9 AND 12
-
Макс:
А для первого узла (8 - 13) - ничего менять не надо ?
а, теперь понял. там ничего не надо
-
Varvara:
У меня вопрос почему insert работает в цикле, а update нет?
1. ты так и не объяснила, что делают твои запросы (то что это упрощенные примеры - мне не о чем не говорит)
2. Я хоть ничего и не понял, но по-моему для Update-запроса цикл не нужен. Просто один раз выполни запрос, который я привел выше
-
Мне не понятен алгоритм обновления потомков после перемещения, если родитель имеет несколько потомков, как их изменить все разом, поотдельности понятно.
Я хочу сделать так, зная обновленные значения родителя, можно вычеслить потомков:
1-ый cat_left+1 и cat_right-1
2-ой cat_left+2 и cat_right-2
Я хотела эти значения, увеличения и уменьшения на 1 и 2
взять из найденного количества потомков и циклично изменить, но update не помогает!?
Может создать временную таблицу и insert изменить поля
cat_left и cat_right, а потом обновить основную таблицу.
-
Varvara:
как их изменить все разом, поотдельности понятно.
я уже несколько раз в этой ветке показал пример update-запроса, который изменяет смещения для всех потомков. Если тебе он не помог, то это уже проблемы реализации алгоритма. Ищи ошибку.
Varvara:
Я хочу сделать так, зная обновленные значения родителя, можно вычеслить потомков:
1-ый cat_left+1 и cat_right-1
2-ой cat_left+2 и cat_right-2
Я хотела эти значения, увеличения и уменьшения на 1 и 2
взять из найденного количества потомков и циклично изменить,
вот здесь совершенно ничего не понял
Varvara:
Может создать временную таблицу и insert изменить поля
cat_left и cat_right, а потом обновить основную таблицу
если проблему можно решить без временной таблицы, то не надо ее использовать
-
Ты не понял что это:
1-ый cat_left+1 и cat_right-1
2-ой cat_left+2 и cat_right-2
Это и есть алгоритм перемещения потомков родителя между другими родителями и потомками.
Данное пример:
UPDATE tab SET cat_left = cat_left + 4, cat_right = cat_right + 4 WHERE cat_left BETWEEN 9 AND 12
НЕ УНИВЕРСАЛЬНЫЙ СПОСОБ, он не подходит всех случаев перемещения (пока говорю перемещении только вверху вниз)
Мне нужен ответ как ИЗМЕНИТЬ потомки новыми значениями ни как не связанными со старыми, связь есть только с новым значением родителем по схеме которую ты не понял.
Не ужели UPDATE не работает в цикле !!! ???
ЭТО ГЛАВНЫЙ ВОПРОС?
-
Как работает UPDATE в цикле? И работает ли вообще?!!
Можно пример!
for ($i=1; $i<=$pot;$i++){
$query = "UPDATE catalogs SET cat_left=\'$i\', cat_right=\'$i\' where cat_left between \'$cat_left\' and \'$cat_right\'";
mysql_query( $query, $db )or die ( "Не могу обновить данные в базе");
}
mysql_close( $db);
-
Varvara:
UPDATE tab SET cat_left = cat_left + 4, cat_right = cat_right + 4 WHERE cat_left BETWEEN 9 AND 12
я же писал, что этот запрос лишь пример - для реального перемещения надо делать запрос на порядок сложнее. Пример можешь посмотреть в классе dbtree (там 3 варианта перемещения рассматривается - влево, вправо и верх и для каждого варианта свой запрос)
-
Varvara
update в цикле работает, ты неправильный запрос делаешь. Такого :Varvara:
cat_left=\'$i\', cat_right=\'$i\'
в Nested Sets вообще не может быть (cat_left не может быть равен cat_right).
Далее если ты делаешь в цикле изменение, то не надо писать в условии
Varvara:
cat_left between \'$cat_left\' and \'$cat_right\'
Там должно быть что-то вроде
WHERE cat_id = $cat_id
-
Макс СПАСИБО за помощь, но ты не врубаешься!
В классе dbtree, только перемещение потомков, но не родителя с потомками, если б было так просто.
Который раз я задаю вопрос как увеличить значение в прогрессии 1, 2, 3 и т.д.
-
Я не спрашиваю если в Nested Sets или нет, ВОПРОС совсем другой, не про Nested Sets, если не знаешь не пиши!!!
-
макс, пиркрыть тему?
-
Ага можешь мою тему грахнуть!
Не обижусь.
-
варечка, ты пожалуйста поучись запросы писать.
сначала не в цикле, а просто напиши в столбик.
А сначала - вообще один.
понимая, что ты хочешь сделать. Понимая, что должен делать запрос
-
Varvara:
В классе dbtree, только перемещение потомков, но не родителя с потомками
Да ? И что по твоему выполнит такой код:
$tree->moveAll($cat_id, $new_parent_id);
Отвечаю: переместит узел $cat_id (и всех его потомков) в $new_parent_id
Varvara:
Который раз я задаю вопрос как увеличить значение в прогрессии 1, 2, 3 и т.д.
$rows = array(1, 3, 13, 14, 18, 24, 30); // список, узлов которые меняем
$k = 0;
for($i=1; $i < sizeof($rows); $i++) {
$sql = "UPDATE tab SET field = $i WHERE id = ".$rows[$k++];
mysql_query($sql) or die (mysql_error());
}
-
RomikChef:
макс, пиркрыть тему?
не, я еще помучаюсь :)