[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Загнать массив в поле mysql
Sergen
Доброго времени суток!
Голову сломал, не могу решить проблему...
Такой алгоритм. Есть форма, после отправки в обработчик, из одной таблицы вытаскиваются несколько id подразделов. Я хочу эти id хранить в одном поле (или в нескольких ячейках).

Тут затык, их наверное нужно как-то загнать в массив, и как его потом загнать в поле таблицы? С учетом того, что нужно будет по этому полю впоследствии проверять эти id?
if (isset($_POST['id']))
{$id = $_POST['id']; //echo (is_array($id)) ? "Это массив" : "Это НЕ массив";
foreach($id as $item)
if(count($item)>=1)
{
$result = mysql_query(" SELECT `id`,`name` FROM `menu` WHERE `nomer`= '".$item."' ORDER BY `id`");
$rowww = mysql_fetch_assoc($result);
if(!$rowww) die ("Сбой при доступе к базе данных : ". mysql_error());
do
{
echo "$rowww[id]"." "."$rowww[name]"."<br />";
}
while($rowww = mysql_fetch_assoc($resu));

}
else {$id = "(Нет подразделов)";}
}




Спустя 5 минут, 5 секунд (8.01.2012 - 17:04) nugle написал(а):
Смотри:
1. берешь свой массив и преобразуешь его в строку с помощь функции Implode, к примеру так: $string = implode(',', $arr);
2. Загоняешь в базу эту строку
3. Достаешь и раскладываешь функцией explode, к примеру так $arr = explode(',', $string)

Спустя 1 час, 35 минут, 16 секунд (8.01.2012 - 18:39) Sergen написал(а):
Спасибо nugle. Принцип понял, че-то я забыл про них... :huh: но почему-то пишет только последний id. Я еще прикрутил запись в файл, там то же пишет одну циферку...

if(!empty($rowww))
{
$fh = fopen("file.txt", 'w+') ;
do
{
$info = array ($rowww[id]);
$inf = implode(',', $info);
print_r($inf);
// Для записи в файл
$tab= '$tab' ;

$text = <<<_END
case '$rowww[id]' : $tab = "sd";
_END;
}
while($rowww = mysql_fetch_assoc($resu));
fwrite($fh, $text) or die("Невозможно записать в файл");
fclose($fh);
echo "Файл 'file.txt' записанн успешно";

$result = mysql_query ("INSERT INTO `sdat`( `id_mod`,`podrazdely`) VALUES ('". $inf ."',45)");
if (isset($result)) echo "Все отлично";
}

Спустя 18 минут, 17 секунд (8.01.2012 - 18:57) nugle написал(а):
$inf = implode(',', $info);
тут надо explode, разделение, а не соединение

Спустя 23 минуты, 47 секунд (8.01.2012 - 19:21) Sergen написал(а):
Почему explode? По-моему правильнее implode. Из массива в строку.

Спустя 10 минут, 5 секунд (8.01.2012 - 19:31) caballero написал(а):
А чем обычная сериализация одной готовой функцией не устраивает?

Спустя 20 минут, 31 секунда (8.01.2012 - 19:51) Pulse написал(а):
Солидарен с caballero, почему бы не использовать serialize() и unserialize() ohmy.gif

Спустя 12 минут, 38 секунд (8.01.2012 - 20:04) inpost написал(а):
А ещё есть print_r($array,1) smile.gif Только он менее удобный для разбора. Загнал, недавно, после пришлось регулярку писать для того, чтобы сложить обратно smile.gif Коротенькая, но рабочая.

Спустя 9 минут, 25 секунд (8.01.2012 - 20:14) Guest написал(а):
Честно признаться с serialize() не сталкивался...Надо опробовать.

Спустя 2 минуты, 52 секунды (8.01.2012 - 20:16) Sergen написал(а):
Цитата (Guest @ 8.01.2012 - 17:14)
Честно признаться с serialize() не сталкивался...Надо опробовать.

Блин куки с кэшем почистил, зашел как гость. Короче, пошел эксперементировать

Спустя 17 часов, 5 минут, 23 секунды (9.01.2012 - 13:22) Sergen написал(а):


$resu = mysql_query(" SELECT `id` FROM `menu` WHERE `nomer`= '".$item."' ORDER BY `id`");
while($rowww = mysql_fetch_assoc($resu));
{
echo "$rowww[id]";
}


Подскажите пожалуйста, как здесь из потока в массив данные загнать?

Спустя 6 минут, 28 секунд (9.01.2012 - 13:28) nugle написал(а):
Цитата
Почему explode? По-моему правильнее implode. Из массива в строку.

просто запутался в твоем коде, как ты его сам понимаешь?!)
Совет на будущее, не делай так, я про переменные
$resu = mysql_query(" SELECT `id` FROM `menu` WHERE  `nomer`= '".$item."'  ORDER BY `id`"); 
while($rowww = mysql_fetch_assoc($resu));
{
echo "$rowww[id]";
}

Название переменной, ну к примеру запрос присваивай переменной $query, $result, $sql. Не один запрос в коде? делай так: бананы вытаскиваешь $query_banan, потому что раньше также делал, путался и долгое время на одном месте стоял

Цитата
Подскажите пожалуйста, как здесь из потока в массив данные загнать?

$result = mysql_query(" SELECT `id` FROM `menu` WHERE  `nomer`= '".$item."'  ORDER BY `id`"); 
while($row = mysql_fetch_assoc($result));
{
$array = $row['id'].',';
}
trim($array, ',');

Спустя 1 час, 51 минута, 19 секунд (9.01.2012 - 15:20) Sergen написал(а):
Цитата
Название переменной, ну к примеру запрос присваивай переменной $query, $result, $sql. Не один запрос в коде? делай так: бананы вытаскиваешь $query_banan, потому что раньше также делал, путался и долгое время на одном месте стоял


Спасибки за совет.
Твой код правда не заработал, но мысль понял, немного доработал и вроде получилось!!!
$result = mysql_query(" SELECT `id` FROM `menu` WHERE  `nomer`= '".$item."'  ORDER BY `id`"); 
do
{
$array[] = $row['id'].',';
}
while($row = mysql_fetch_array($result));

$string = implode(' ', $array);

Вечерком еще потестирую. Но данные в массив загоняются и строка с пробелами выводится- то что надо!
В любом случае еще раз спасибо!
<_<

Спустя 3 часа, 42 минуты, 9 секунд (9.01.2012 - 19:02) nugle написал(а):
$result = mysql_query(" SELECT `id` FROM `menu` WHERE  `nomer`= '".$item."'  ORDER BY `id`"); 
do
{
$array[] = $row['id'].',';
}
while($row = mysql_fetch_array($result));

$string = implode(' ', $array);

Используй вместо do while просто while, так как ты теряешь первый элемент массива
Спешил, поэтом не работало)
$result = mysql_query(" SELECT `id` FROM `menu` WHERE  `nomer`= '".$item."'  ORDER BY `id`"); 
while($row = mysql_fetch_assoc($result));
{
$array =$array.$row['id'].',';
}
$array = trim($array, ',');
$array = explode(',',$array);

Спустя 12 часов, 58 минут, 13 секунд (10.01.2012 - 08:00) Sergen написал(а):
Цитата (nugle @ 9.01.2012 - 16:02)

Используй вместо do while просто while, так как ты теряешь первый элемент массива

Я то же думал что нужно именно while. Но он почему-то не работает вообще. Поэтому и поставил do while. То что не выводит первый элемент, это да. В моем случае это кстати и не нужно (таблица так устроена) первый элемент он как раз в условии запроса.

Вот что делать, когда нужно будет именно все вывести?

Спустя 1 час, 37 минут, 45 секунд (10.01.2012 - 09:38) Nikitian написал(а):
Цитата (inpost @ 8.01.2012 - 20:04)
А ещё есть print_r($array,1) :) Только он менее удобный для разбора. Загнал, недавно, после пришлось регулярку писать для того, чтобы сложить обратно :) Коротенькая, но рабочая.

Запаковать (применительно к файлу):

file_put_contents('file.php','<?php $var = '.var_export($var,true).';');

Распаковать:

include('file.php');

Самый быстрый способ сериализации-унсериалайза для файлов.

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

Спустя 33 минуты, 44 секунды (10.01.2012 - 10:11) nugle написал(а):
Поставь while и покажи какие ошибки выдает. и сам код естественно выложи

Спустя 4 часа, 41 секунда (10.01.2012 - 14:12) Sergen написал(а):
Цитата
Для тс, неправильно изначально решили и вам насоветовали. Тут же классическая связь 1 ко многим, реализуется через хранение этих id в отдельной таблице. Вот что вы будете делать, если вам понадобиться выбрать все элементы, у которых есть привязка к какому-то одному id? Делать поиск по сериализованной подстроке - глупость.


Я в курсе про связи таблиц. Просто делаю на основе уже существующей (изменить ее, либо даже добавить новые поля - исключено).

Про поиск по строке, почему глупость? Например я загоняю ее в свою созданную (другую) таблицу в ячейку, и потом если понадобится найти какой нибудь id в этой ячейке, я через LIKE думаю смогу отыскать ее, либо определить ее отсутствие. Опять же, это задумка, может пойду другим путем.

Спустя 34 минуты, 30 секунд (10.01.2012 - 14:47) Sergen написал(а):
Цитата (nugle @ 10.01.2012 - 07:11)
Поставь while и покажи какие ошибки выдает. и сам код естественно выложи

Код почти такой же как у тебя


$result = mysql_query(" SELECT `id` FROM `menu` WHERE `nomer`= '".$item."' ORDER BY `id`");
while($row = mysql_fetch_array($result));
{
$array[] =$row['id'].',';
echo "<pre>";
print_r($array);

}


за исключением того, что поменял mysql_fetch_assoc на mysql_fetch_array и добавил [] к $array
Ошибок не выдает, все пусто.
Array
(
[0] =>
)

Меняю на do while , все работает (кроме первого результата)


$result = mysql_query(" SELECT `id` FROM `menu` WHERE `nomer`= '".$item."' ORDER BY `id`");
do
{
$array[] =$row['id'].',';
echo "<pre>";
print_r($array);

}
while($row = mysql_fetch_array($result));




Спустя 3 минуты, 12 секунд (10.01.2012 - 14:50) nugle написал(а):
Ты наверное не понимаешь
$array - это не массив, а строка. Ты собираешь строку, а потом делаешь из нее массив

Спустя 59 минут, 21 секунда (10.01.2012 - 15:49) inpost написал(а):
Sergen
Потому что это нарушение первой нормальной формы БД.

Спустя 6 минут, 20 секунд (10.01.2012 - 15:55) Sergen написал(а):
Цитата (nugle @ 10.01.2012 - 11:50)
Ты наверное не понимаешь
$array - это не массив, а строка. Ты собираешь строку, а потом делаешь из нее массив

Хмм...Сделал новый файл, удалил все лишнее, просто все сделал под while и ...заработало.
Ничего не понимаю. Где я делал ошибку, не пойму, тысячу раз перепроверял.
Спасибо за помощь nugle.

Спустя 27 минут, 50 секунд (10.01.2012 - 16:23) Sergen написал(а):
Цитата (inpost @ 10.01.2012 - 12:49)
Sergen
Потому что это нарушение первой нормальной формы БД.

Я не могу делать дополнительную таблицу куда шли бы id дополнительных пунктов меню. Просто не могу по одной причине, нужно ковырять стандартный код. А я этого не хочу. Он должен оставаться стандартным. А сделать дополнение(расширение) - это можно. Вот и приходится всякими обходными маневрами чего -то придумывать.

Спустя 27 минут, 36 секунд (10.01.2012 - 16:51) inpost написал(а):
Sergen
Всмысле не можешь? Теоретически данный участок будет задействован на парочке страниц, а привести в адекватный вид должен ты, ты же нанялся на это.

Спустя 11 минут, 26 секунд (10.01.2012 - 17:02) Sergen написал(а):
Цитата (inpost @ 10.01.2012 - 13:51)
Sergen
Всмысле не можешь? Теоретически данный участок будет задействован на парочке страниц, а привести в адекватный вид должен ты, ты же нанялся на это.

Есть кучи смс типа вордпресса, джумлы, и прочих битриксов. А к ним идут всякие компоненты, модули, плагины, и прочие расширения и дополнения. Если не ошибаюсь они не меняют основной код движка а используют его. Вот и в моем случае-низзя трогать.

Спустя 11 минут, 1 секунда (10.01.2012 - 17:13) inpost написал(а):
Sergen
И эти модули, компоненты, плагиты - пишут криворукие недокодеры, и их и надо менять, потому что нормального бесплатно ничего не бывает.

Спустя 48 минут, 51 секунда (10.01.2012 - 18:02) Sergen написал(а):
Цитата (inpost @ 10.01.2012 - 14:13)
Sergen
И эти модули, компоненты, плагиты - пишут криворукие недокодеры, и их и надо менять, потому что нормального бесплатно ничего не бывает.

inpost, ситуевина следующая. Делаю собственное дополнение. В принципе, можно залезть в код движка и внести изменения, поскольку делаю для себя, для своего сайта. Но, буквально на днях пришла мысль, что это дополнение может понравится и другим людям. И вот тут то рождается другая мысль. А почему бы не сделать ее с прицелом на то, что в будущем удастся ее как-то двигать, например за символическую денешку.

Кстати, бесплатное нормальное бывает. Смотря что это за бесплатное и почему оно бесплатное.
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2025 Invision Power Services, Inc.