ФорумПрограммированиеPHP для идиотов → Разбор строки из БД на запчасти :)

Разбор строки из БД на запчасти :)

  • Jane

    Сообщения: 363 Репутация: N Группа: Адекваты

    Spritz 21 июля 2010 г. 10:05

    Попробую по порядку изложить:
    В БД в 1й таблице есть строки с данными вида: =2=6=
    Длина таких строк в будущем может быть различной (=2=, =2=6=, =2=3=6= …), при этом символ "=" является разделителем id-шников для разделов.
    В другой таблице соответственно хранятся сами разделы с нормальными id: 1,2,3…
    До сих пор были переходы от категории к её составляющим, потому всё было довольно просто. Сейчас возникла обратная задача. Определить для записи принадлежность к конкретной категории или нескольким категориям и получить их номера.
    Если для записей типа "=2=" всё оказалось довольно просто, т.е. в итоге я получаю эту самую "2". То этот же алгоритм при применении к более длинной строке возвращает "2 6", либо как вариант с любым разделителем, например "2.6"
    В общем, надо теперь каким-то образом получить из данной строки несколько переменных с номерами соответственно "2" и "6" и т.д., если номеров больше станет..

    Для разделителей нашла функцию SUBSTRING_INDEX(str,delim,count), ещё SUBSTRING(str,pos,len).. Но апач выдаёт ошибки на них, типа Fatal error: Call to undefined function SUBSTRING() in , и даже если брать функцию TRIM([[BOTH | LEADING | TRAILING] [remstr] FROM] str), не ругается в случае, если она выглядит просто как $t->tt=TRIM($t->tt); Во всех остальных случаях, при использовании параметров - тоже ругается…

    Может посоветуете ещё какие функции глянуть? Чтобы суметь разобрать строку на составляющие и чтобы апач не выпендривался при этом?. (по идее надо просто считывать данные до каждого следующего разделителя, но мне пока не хватает знаний и фантазии, как это сделать)
  • phpdude

    Сообщения: 26624 Репутация: N Группа: в ухо

    Spritz 21 июля 2010 г. 10:22, спустя 16 минут 45 секунд

    Fatal error: Call to undefined function SUBSTRING() in , и даже если брать функцию TRIM([[BOTH | LEADING | TRAILING] [remstr] FROM] str), не ругается в случае, если она выглядит просто как $t->tt=TRIM($t->tt); Во всех остальных случаях, при использовании параметров - тоже ругается…

    прости но ты чето пиздец все в кучу собрала.

    ошибки пишешь пхпшные, функции имена скльные, если бы меня так ебали я бы на тебя тоже ругался. гавнокод в студию!
    Сапожник без сапог
  • Faster

    Сообщения: 1159 Репутация: N Группа: Кто попало

    Spritz 21 июля 2010 г. 10:24, спустя 2 минуты 36 секунд

    привести таблицы нужно к нормализованному виду, а не сношать мозг строчными операциями в запросах.
  • Jane

    Сообщения: 363 Репутация: N Группа: Адекваты

    Spritz 21 июля 2010 г. 10:27, спустя 2 минуты 52 секунды

    $t->ttt=$t->ttt.$еtid_k;
       $t->ttt=STR_REPLACE("=", " ", $t->ttt);
           $t->ttt=TRIM($t->ttt);
      //     $t->tt=STR_REPLACE(" ", ".", $t->ttt);
       $t->sql_query="select * from kat_w where id_k=".$t->tt." ";
       $t->sql_execute();
       $sql_res=$t->sql_res;
       if($t->sql_err) return(11);

       echo "".$t->tt."<br />";

    пока функция выглядит так (объявление переменных не стала копировать - все объявлены выше как положено)
    сейчас получаю либо "2 6" либо "2.6" (если раскомментировать)
    а дальше как разобрать на 2 и более переменных?
  • phpdude

    Сообщения: 26624 Репутация: N Группа: в ухо

    Spritz 21 июля 2010 г. 10:30, спустя 2 минуты 56 секунд

    Jane, епта, а чо ты большими буквами функции пишешь????????
    Сапожник без сапог
  • Jane

    Сообщения: 363 Репутация: N Группа: Адекваты

    Spritz 21 июля 2010 г. 10:31, спустя 1 минуту 4 секунды


    привести таблицы нужно к нормализованному виду, а не сношать мозг строчными операциями в запросах.
    Таблицы в нормальном виде, изначально, пока каждая запись 2й соответствовала всего 1й категори - были цифры везде нормальные
    такой геморой с разделителями потребовался, когда одна и та же запись стала должна отображаться в разных категориях

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

    Jane, епта, а чо ты большими буквами функции пишешь????????
    Я их не писала, а тупо с php.ru копировала, чтобы не накосячить в синтаксисе где
  • Faster

    Сообщения: 1159 Репутация: N Группа: Кто попало

    Spritz 21 июля 2010 г. 10:56, спустя 25 минут 1 секунду

    Таблицы в нормальном виде, изначально, пока каждая запись 2й соответствовала всего 1й категори - были цифры везде нормальные
    такой геморой с разделителями потребовался, когда одна и та же запись стала должна отображаться в разных категориях

    для таких целей делают промежуточную таблицу со связями. хотя бы для сортировок, неговоря уже о том геморе что мы наблюдаем
  • Jane

    Сообщения: 363 Репутация: N Группа: Адекваты

    Spritz 21 июля 2010 г. 11:04, спустя 8 минут 1 секунду

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

    Когда это делалось (год или 2 назад) - был выбран вариант, который посоветовали умные люди
    про таблицы со связями мне никто идей не подкинул, а я не профи (иначе бы не задавала сейчас тут вопросы)))
    В общем, всю систему переделывать не хотелось бы…

    Тогда вопрос по-другому задам: реально ли вообще распознавать информацию в строке между разделителями? чтобы присвоить её энному количеству переменных?
    Если задача таким путём не решаема - буду думать, как это всё обходить по-другому, но пока хочется всё же так решить.. Я только не знаю, в каком направлении двигаться и какие функции искать для этого (или не функции может?))
  • VaseninM

    Сообщения: 2416 Репутация: N Группа: Адекваты

    Spritz 21 июля 2010 г. 11:13, спустя 9 минут 2 секунды



    function getArray($str) {
       return explode('=', trim($str, '=')); //я честно сказать не помню как себя експлоде ведет. поверять и по мануалам лазить лень. Может трим и не нужен
    }

    $str = '=1=3=8=';
    $array = getArray($str);
  • Jane

    Сообщения: 363 Репутация: N Группа: Адекваты

    Spritz 21 июля 2010 г. 12:25, спустя 1 час 11 минут 53 секунды

    спасибо :) помогло :) дальше справлюсь ))))
  • AlexB

    Сообщения: 4290 Репутация: N Группа: в ухо

    Spritz 21 июля 2010 г. 12:42, спустя 16 минут 58 секунд

    Стоит прислушатся к тому, что сказал Faster , иначе геморой обеспечен.
  • Jane

    Сообщения: 363 Репутация: N Группа: Адекваты

    Spritz 21 июля 2010 г. 13:01, спустя 18 минут 44 секунды


    Стоит прислушатся к тому, что сказал Faster , иначе геморой обеспечен.
    Уже задача решена ))) Геморой оказался всего из 3х строк ))) Зато освоила новые функции :)
    Да и слишком много пришлось бы переделывать и перезаполнять БД.. а там записей уже……….. В общем проще было покопаться и решить задачу, чем всё сидеть исправлять.

    на будущее учту, если придётся ещё когда-нибудь подобные сложные связи строить, но вообще я последнее время редко касаюсь программирования =))
  • VaseninM

    Сообщения: 2416 Репутация: N Группа: Адекваты

    Spritz 21 июля 2010 г. 13:11, спустя 10 минут 33 секунды

    Я так думаю, что в будующем тебе нужно будет почитать про nested sets.
  • Givi

    Сообщения: 2284 Репутация: N Группа: Адекваты

    Spritz 22 июля 2010 г. 1:54, спустя 12 часов 42 минуты 56 секунд

    SpartakuS, по сути пофиг каким образом строить деревья связей в БД, главное знать что тебе в результате нужно. Нестеды тяжеловаты для изменения структуры, зато легки на выборке, а вот обычная связка "айди - парент_айди" вполне справиться в любом случае, где кол-во записей не особо большое. И да, у неё не дерево по сути-то, а просто есть некие категории, а к ним привязаны страницы. Так вот страницы - совсем другая сущность в отличии от дерева категорий. Ну по крайней мере я так понял.
  • AlexB

    Сообщения: 4290 Репутация: N Группа: в ухо

    Spritz 22 июля 2010 г. 2:12, спустя 18 минут


    Уже задача решена ))) Геморой оказался всего из 3х строк )))
    Геморой подкрадется незаметно, когда понадобится сделать чего-то еще или когда данных станет много. )))))

Пожалуйста, авторизуйтесь, чтобы написать комментарий!