Mysql Php+Mysql, избежание запроса в цикле mysql_fetch_assoc

Lebannen

Новичок
День добрый, подскажите, пожалуйста, как разрешить такую ситуацию:
Имеется запрос
PHP:
$select_table = mysql_query ("SELECT `person_number`, `departament` FROM `db_departament`");
Нужно вытащить `персональный номер` и `отдел`, но из полного названия отдела я делаю его аббревиатуру, выглядит это так:
PHP:
    $abbr = array();
    $pern = array();
   
    while($row = mysql_fetch_assoc($select_table)) {
        $cut = explode("(",$row['departament']);
        $abbr[] = $cut[0];
        $pern[] = $row['person_number'];
    }
                                    
  $array_dep = implode(",",$abbr);
  $array_person_number = implode(",",$pern);
Массивы выводятся, все нормально, теперь мне нужно подставить эти значения из массива в запрос UPDATE. Делаю так:
PHP:
$insert_departament_abbreviated = mysql_query("UPDATE db_departament SET departament_abbreviated = '$array_dep' WHERE person_number IN({$array_person_number})") or die (mysql_error());
Загвоздка в следующем: если заменить строку
PHP:
SET departament_abbreviated = '$array_dep'
на
PHP:
SET departament_abbreviated = '123'
, например, то запрос исполняется. А с моим массивом не работает...ошибка "Data too long for column 'departament_abbreviated' at row 1", что говорит о том, что в поле просто не вмещается эта запись и массив не разбился на индексы... Как мне тогда правильно подставить значения в запросе?
Если в цикле сделать запрос и вывести с помощью echo, то все получится, но нельзя ведь так нагружать apache, вот и пытаюсь обойти запрос в цикле...
 
Последнее редактирование:

Фанат

oncle terrible
Команда форума
Тебе сначала нужно понять, что ты делаешь.
И в первую очередь - научиться отличать SQL от PHP.
массив не разбился на индексы.
Какой массив? На какие индексы?
А с моим массивом не работает.
Ну, если запрос не работает, то, наверное, надо вывести его на экран?
нельзя ведь так нагружать apache
Во-первых, apache тут абсолютно не при чем.
Во-вторых, операция, судя по всему, одноразовая. Тебе не кажется, что уже давно бы нагрузил один раз, и уже другими делами занимался?
 

Lebannen

Новичок
Я понимаю, что должен делать. Операция не разовая, она должна автоматически делать аббревиатуру цехов, а цеха в свою очередь могут добавиться новые, могут убраться старые, поменять название, например не "Персонал при руководстве, а "Аппарат директора" и т.д.
Второй момент, я отличаю PHP от SQL, т.к. работаю с БД в PMA, но данный участок кода должен выполняться в php.
Мне нужно всего-лишь понять, как вытащить из запроса SELECT мои значения в массив и подставить их в запрос UPDATE, не выполняя этот запрос UPDATE в цикле while, как я делал это раньше.

Когда я сказал, что массив не разбился на индексы, я имел ввиду, что в $array_dep формируется строка типа "ЦРРО, ОМТС, АТО" и т.д., а должно быть [0] = ЦРРО, [1] = ОМТС, [2] = АТО.
 

Фанат

oncle terrible
Команда форума
1. Аббревиатуру надо делать сразу при вводе названия, а не по крону.
2.Не надо спорить. PHP от Mysql ты не отличаешь. От того, что "данный участок кода должен выполняться в php", mysql не начинает понимать синтаксис PHP. Из РНР ты точно так же работаешь с SQL. И, разумеется, из PHP нельзя выполнить никакой запрос, какой нельзя было бы выполнить в "PMA". Пойди попробуй выполнить свой запрос с "[0] = ЦРРО, [1] = ОМТС, [2] = АТО" в PMA, а потом возмущайся.
3. "в $array_dep формируется строка типа "ЦРРО, ОМТС, АТО" - и это тебя удивляет? А $array_dep = implode(",",$abbr); - это чей код? Бендеровские диверсанты коварно под покровом ночи вписали?
Мне нужно всего-лишь понять, как вытащить из запроса SELECT мои значения в массив и подставить их в запрос UPDATE,
На самом деле тебе нужно понять, какой запрос UPDATE ты хочешь выполнить. Потом попробовать его выполнить. Потом поинтересоваться, а выполняется ли такой запрос вообще. Потом снова разобраться с запросами UPDATE, уже окончательно. И только после этого, имея стопроцентную уверенность в том, что запрос выполняется "в PMA", пытаться выполнить его в РНР
 

Lebannen

Новичок
Диспуты устраивать не буду, код мой, отношения к бендеровцам не имею, сарказм не понят.
1. Я не могу сразу сделать аббревиатуру. Все запросы к БД формируются из админки моей, которая на php, мне не нужно работать непосредственно из PMA.
2. Я не возмущаюсь, с чего вы взяли? Запрос UPDATE в PMA выполняется, допустим,
PHP:
UPDATE db_departament SET departament_abbreviated = 'ЦРРО' WHERE person_number = '7340')"
и точка.
3. Меня не удивляет, что implode формирует строку со значениями через запятую.

Хорошо, может так понятней будет...
PHP:
$select_table = mysql_query ("SELECT `person_number`, `departament` FROM `db_departament`");
                    while($row = mysql_fetch_array($select_table)) { 
                        $cut = explode("(",$row[1]); //берем только аббревиатуру, что идет до "(" скобок
                        $abbr = $cut[0];

                        $insert_departament_abbreviated = mysql_query("UPDATE db_departament SET departament_abbreviated = '$abbr' WHERE person_number = '$row[0]'") or die (mysql_error());
                        mysqli_free_result($insert_departament_abbreviated);
                    }
Как запрос UPDATE выполнить вне цикла, но суть запроса не должна измениться?
 

Фанат

oncle terrible
Команда форума
Теперь ты сам себе кругом противоречишь :)
1. Если все запросы к БД формируются из админки твоей, которая на php, то какая проблема при изменении названия отдела, сразу же изменить и аббревиатуру, в том же запросе? Ведь в админке есть код, который позволяет добавить или изменить название отдела? Почему нельзя вместе с названием сразу менять и аббревиатуру?
2. Ты возмущаешься тем, что база не понимает твой запрос. Но ты спросил её сначала - а она вообще такие запросы поддерживает? По какой-то неведомой причине ты в PMA исполняешь один запрос, а в PHP - другой. Кто мешает тебе исполнить в PMA тот запрос, который ты хочешь выполнить из PHP?
3. Три цитаты:
1. А с моим массивом не работает...ошибка "Data too long for column 'departament_abbreviated' at row 1", что говорит о том, что в поле просто не вмещается эта запись и массив не разбился на индексы..
2. Когда я сказал, что массив не разбился на индексы, я имел ввиду, что в $array_dep формируется строка типа "ЦРРО, ОМТС, АТО" и т.д., а должно быть [0] = ЦРРО, [1] = ОМТС, [2] = АТО.
3.
PHP:
$array_dep = implode(",",$abbr);
Из них однозначно следует следует, что ты ожидал, будто implode тебе сделает строку 0] = ЦРРО, [1] = ОМТС, [2] = АТО. А теперь говоришь, что полученное в результате "ЦРРО, ОМТС, АТО" тебя не удивляет. Всё-таки, тебе надо определиться сначала :)

В общем, это всё лирика. Самого главного ты пока так и не понял. Объясняю ещё раз:
Тебе нужно разобраться, какой запрос ты хочешь выполнить.

- Всякий раз,
когда ты собираешься выполнить какой-либо запрос из РНР, ты должен сначала изучить язык SQL, выяснить синтаксис запроса, и потренироваться на готовых примерах.
- Затем составляешь нужный тебе запрос, тот который нужен для твоего приложения. И пробуешь исполнить его в PMA.
- И только после этого, если запрос отработал нормально, ты можешь начинать пытаться написать программу на РНР, которая сгенерирует этот запрос динамически.
Ты же всё делаешь наоборот. Мало того, что ты хочешь сгенерировать заведомо нерабочий запрос - так ты еще и с трудом представляешь себе, как он должен выглядеть. Так никогда не делают.

Программист должен всегда четко представлять себе, что должна делать его программа.


Запомни это золотое правило, и всегда следуй ему.
 

Lebannen

Новичок
Нужно четко представлять себе, что SQL — язык, оперирующий множествами. Порой программистам, привыкшим думать терминами процедурных языков, трудно перестроить мышление на язык множеств. Это можно сделать довольно просто, взяв на вооружение простое правило — «никогда не выполнять запросы в цикле»

PHP:
$sql = array();
    for ($i = 1; $i <= $data -> sheets[0]["numRows"]; $i++){
        $cell1 = addslashes(trim($data -> sheets[0]["cells"][$i][1]));
        $cell2 = addslashes(trim($data -> sheets[0]["cells"][$i][2]));
        $cell3 = addslashes(trim($data -> sheets[0]["cells"][$i][3]));
        $cell4 = addslashes(trim($data -> sheets[0]["cells"][$i][4]));
        $cell5 = addslashes(trim($data -> sheets[0]["cells"][$i][5]));
    }
        $sql[] = "('".$cell5."','".$cell1."')";
        $insert_table = mysql_query("INSERT INTO test (person_number, test1) VALUES ".implode(',', $sql)."") or die (mysql_error());
Я ставил перед собой задачу: вывести запросы вне цикла, чтобы одним запросом работать с множествами, мне не нужно было читать Ваши заумные фразы, я знаю ровно столько, сколько знаю сейчас и выше головы прыгать не собираюсь.
Тема закрыта, вопрос решен. Все оказалось проще, чем я думал.
 
Последнее редактирование:

Lebannen

Новичок
Я же привел выше мое решение, массив $sql[], его значения подставляются в запрос INSERT.
 

Фанат

oncle terrible
Команда форума
Это запрос INSERT.
А если ты потрудишься обратить внимание на свой вопрос, там фигурирует запрос UPDATE
 

Lebannen

Новичок
Запрос может быть любой, мне важно было понять, как эти запросы исполнять вне цикла.

Я раньше делал таким образом:
PHP:
$abbreviated = mysql_query("SELECT departament, initials FROM db_full_base") or die(mysql_error());
                        while ($row = mysql_fetch_array($abbreviated))
                            { 
                               
                                $cut=explode("(",$row[0]);
                                $abbr = $cut[0];
                                //echo $abbr."<br/>";
                                //echo $row[1]."<br/>";
                                $ins_abbreviated = mysql_query("UPDATE db_full_base SET departament_abbreviated = '$abbr' WHERE initials = '$row[1]'");
                            }
Но так болезненно для мускула выполнять запрос в цикле, если в таблице записей не одна тысяча.
 

Фанат

oncle terrible
Команда форума
ЗАПРОС НЕ МОЖЕТ БЫТЬ ЛЮБОЙ
Помимо твоих фантазий существует ещё строгий синтаксис и формальная логика.

И мы возвращаемся к тому, с чего начали - задача твоя так и не решена, потому что ты не знаешь, какой запрос хочешь выполнить.

Код, "которым ты делал раньше", по крайней мере работает.
Другого работающего кода у тебя нет.

Как избежать повторяющихся запросов в цикле, я тебе уже написал - надо вообще отказаться от бессмысленных массовых апдейтов. Ты же упрямо держишься за свои идеи, которые не работали, не работают, и никогда работать не будут. Может быть, уже откроешь наконец глаза и войдешь в соприкосновение с реальностью?
 
Последнее редактирование:

Lebannen

Новичок
Отказаться от массовых апдейтов, допустим...
Есть исходная таблица с полями (person_number, departament), поле departament (полное наименование цеха/подразделения) нужно сократить до аббревиатуры. Как сделали бы Вы?
 

Фанат

oncle terrible
Команда форума
Я же уже писал. подробно. 2 раза:
Если все запросы к БД формируются из админки твоей, которая на php, то какая проблема при изменении названия отдела, сразу же изменить и аббревиатуру, в том же запросе? Ведь в админке есть код, который позволяет добавить или изменить название отдела? Почему нельзя вместе с названием сразу менять и аббревиатуру?
Одним запросом отредактировать одну аббревиатуру, вместо того чтобы ходить по тысячам отделов, у которых и так уже стоит нужная.
 
Сверху