За последние 24 часа нас посетили 17108 программистов и 1302 робота. Сейчас ищут 1726 программистов ...

Изменение данных.

Тема в разделе "PHP и базы данных", создана пользователем forward, 7 сен 2006.

  1. forward

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

    С нами с:
    7 сен 2006
    Сообщения:
    6
    Симпатии:
    0
    Есть необходимость изменить значения нескольких полей в таблице по сложным алгоритмам, данные для которых берутся из других полей этой же таблицы. Эти алгоритмы, как мне кажется, невозможно реализовать только внутри команды UPDATE.

    В связи с этим решил делать так:

    1. Делается выборка командой SELECT всех записей таблицы
    2. В цикле по результату запроса по каждой строке:
    2.1 на PHP вычисляются значения полей, которые необходимо занести
    2.2 командой UPDATE эти значения вносятся в поля текущей строки таблицы

    С консоли виндов запускаю пробный скрипт , но он не хочет модифицировать значение поля. PHP сообщает об ошибке: Query was empty

    Код привожу ниже:

    <?php
    $db_name="ns02";//база данных
    $table="t01";//таблица
    $host="localhost";//хост
    $user="";//логин
    $pass="";//password

    $link=mysql_connect($host,$user,$pass) or die(mysql_errno($link).mysql_error($link));
    $link2=mysql_connect($host,$user,$pass) or die(mysql_errno($link2).mysql_error($link2));
    //выбираем базу данных
    $db=mysql_select_db($db_name,$link) or die(mysql_errno($link).mysql_error($link));
    $db2=mysql_select_db($db_name,$link2) or die(mysql_errno($link2).mysql_error($link2));
    //выберем данные
    $guery = "SELECT * FROM t01";
    $result=mysql_query($guery, $link) or die(mysql_errno($link).mysql_error($link));

    while($data=mysql_fetch_assoc($result)){
    echo $data["tm"]," : ";
    //если закомментировать следующие две строчки - предыдущая строка нормально выводит значения поля tm,
    //значит запрос на выборку сам по себе работает нормально
    $query2 = "UPDATE t01 SET oi1 = 1 WHERE tm = ".$data["tm"];
    mysql_query($guery2, $link2) or die(mysql_errno($link2).mysql_error($link2));
    }

    mysql_free_result($result);
    mysql_close($link);
    mysql_close($link2);
    ?>
     
  2. Goryn

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

    С нами с:
    4 апр 2006
    Сообщения:
    398
    Симпатии:
    0
    Адрес:
    Ярославль
    Отвечаю
    Код (Text):
    1. Update Table Set Field1=X1, Field2=X2
    2.      Where Field3 in (Select from Table Where .....) And
    3.                Field4 in (Select From Table Where .....) Or .....
    Главное, чтобы подзапросы не использовали в своих условиях, поляк оторые нужно изменить :D[/code]
     
  3. Anonymous

    Anonymous Guest

    версия ПХП и Мускуля какие?
    Если Мускуль 3 - подзапросы, как Goryn предлагает, работать не будут.
    а младший ПХП не умеет открывать одновременно 2 коннекта с мускулю.
     
  4. Mavir

    Mavir Guest

    Код (Text):
    1. resource mysql_connect ( [string server [, string username [, string password [, bool new_link [, int client_flags]]]]] )
    2.  
    3. Если второй вызов функции произошёл с теми же аргументами mysql_connect(), новое соединение не будет установлено. Вместо этого функция вернёт ссылку на уже установленное соединение. Параметр new_link может заставить функцию mysql_connect() открыть ещё одно соединение, даже если соединение с аналогичными параметрами уже открыто.
    Поэтому не имеет смысла открывать два соединения. Тем более одновременно выбирать одну и ту же БД

    forward, перед выполнением запроса выведи print $query2 и проверь его правильность.
     
  5. forward

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

    С нами с:
    7 сен 2006
    Сообщения:
    6
    Симпатии:
    0
    не получится, ибо расчет нового значения поля будет идти по сложным алгоритмам, которые в конструкциях SQL реализовать невозможно, кроме того записей в таблице будет несколько тысяч, на все эти несоколько тысяч случаев if не проставишь, да и моя версия mySQL не поддерживает вложенных запросов
     
  6. forward

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

    С нами с:
    7 сен 2006
    Сообщения:
    6
    Симпатии:
    0
    Версии: mySQL - 3.23, PHP - 5.1.5.
     
  7. forward

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

    С нами с:
    7 сен 2006
    Сообщения:
    6
    Симпатии:
    0
    Переделал скрипт, чтобы запросы пользовались одним соединением. Результаты практически те же.

    Текст скрипта:
    Код (Text):
    1.  
    2. <?php
    3. $db_name="ns02";//база данных
    4. $table="t01";//таблица
    5. $host="localhost";//хост
    6. $user="";//логин
    7. $pass="";//password
    8. $link=mysql_connect($host,$user,$pass) or die(mysql_errno($link).mysql_error($link));
    9. //выбираем базу данных
    10. $db=mysql_select_db($db_name,$link) or die(mysql_errno($link).mysql_error($link));
    11.  
    12. $guery = "SELECT * FROM t01";
    13. $artm = array();
    14. $counter = 0;
    15. $result=mysql_query($guery, $link) or die(mysql_errno($link).mysql_error($link));
    16.  
    17. //сбрасываем значения поля tm в массив
    18. while($data=mysql_fetch_assoc($result)){
    19.     echo $data["tm"]," : ";
    20.     $artm[counter] = $data["tm"];
    21.     $counter+=$counter;
    22. }
    23.  
    24. //освободить выделенную под результат выборки память
    25. mysql_free_result($result);
    26.  
    27. //в цикле по массиву пытаемся изменить данные
    28. foreach ($artm as $item) {
    29.     $query2 = "UPDATE `t01` SET `oi1` = 1 WHERE tm = "."'".$item."'";
    30.     echo $query2;
    31.     mysql_query($guery2, $link) or die(mysql_errno($link).mysql_error($link));
    32. }
    33.  
    34. mysql_close($link);
    35. ?>
    В отладочной информации выводит следующее:


    0430 : 0415 : 0400 : 0345 : 0330 : 0315 : 0300 : 0245 : 0230 : 0215 : 0200 : 0145 : 0130 : 0115 : 0100 : 0045 : 0030 : 0015 : 0000 : UPDATE `t01` SET `oi1` = 1 WHERE `tm` = '0000'1065Query was empty

    Здесь:
    > до слова UPDATE - значения поля tm, выводимые в цикле по запросу,
    > UPDATE `t01` SET `oi1` = 1 WHERE `tm` = '0000' - программно сформированный текст запроса, причем явно видно, что второй цикл был выполнен только один раз, далее цикл явно не срабатывает, иначе текст запроса был бы выведен несколько раз, с разными значениями
    > 1065Query was empty - описание ошибки (в гугле ничего вразумительного по этому поводу не нашел)

    Запрос из отладочной инфы запустил без PHP, на самом mySQL - сработал нормально, без ошибок, значение поля oi1 изменилось.
     
  8. Goryn

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

    С нами с:
    4 апр 2006
    Сообщения:
    398
    Симпатии:
    0
    Адрес:
    Ярославль
    Несколькими тысячами записей в таблице сервера БД меня сложно удивить. Я рабораю с базами в которых количество записей в таблицах сотни тысяч. На счет MySql не знаю, но в Oracle и MsSql есть такое понятие как хранимые процедуры и функции, которые можно использовать в запросах.
     
  9. simpson

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

    С нами с:
    11 фев 2006
    Сообщения:
    1.650
    Симпатии:
    0
    Адрес:
    Санкт-Петербург
    сравните названия переменных $query2 и $guery2. :)
     
  10. Anonymous

    Anonymous Guest

    Оракл вообще вещь! Я кстати недавно слышал, что они начали разработатывать нереляцонную субд. Object-oriented, типа, на XML основанную...
     
  11. Davil

    Davil Guest

    [offtop]
    Какие же размеры будут у этих БАЗИЩ? :shock:
    [/offtop]
     
  12. Anonymous

    Anonymous Guest

    Ну, какие никакие, а штука интересная.. ну, я и не думаю что они прям в XML хранится будут, скорее всего он их выдавать как результат XPath запроса будет... Кто знает? Но надо уже морально готовится с таблицам с произвольным числом столбцов в каждой записи ))