Как прочесть массив значений из строки MySQL

192
10 декабря 2016, 10:14

Добрый день. Есть строка в БД которая содержит числовые значения (массив). Как прочесть этот массив и как его лучше писать в БД.

Подробнее: Есть список специалистов в БД которые оказывают несколько услуг. В БД у специалистов они(услуги) записаны в виде своих ID в одной строке как

a:3:{i:0;i:1;i:1;i:2;i:2;i:30;} 

Далее нужно вывести список специалистов и список оказываемых ими услуг в числовом виде. Использовал для чтения функцию

unserialize( $value['uslygi'] );

Мне кажется, что я запутался в синтаксисе кода, а возможно это можно сделать как то проще.

$query = " SELECT * FROM t_specialist " ; 
$result = mysql_query($query) or die('Query failed: ' . mysql_error()); 
$myarray = array();
$n = mysql_num_rows($result);
for($i = 0; $i < $n; $i++)
{
    $myarray[] = mysql_fetch_array($result);
}
    foreach($myarray as $value){
    $array = unserialize( $value['uslygi'] );

    echo "<br>Специалист: ".$value['name']." Оказывает услуги: ". ТУТ НУЖНО ВЫВЕСТИ ID ОКАЗЫВАЕМЫХ УСЛУГ;

    }

?>
Answer 1

Ответ на вопрос как перевести массив в строку - функция implode

echo implode(',', $array);
Answer 2

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

Удалите из таблицы t_specialist поле uslugi, и создайте новую таблицу t_specialist_services, которая будет содержать следующую структуру:

  • specialist_id INT
  • service_id TINYINT unsigned (я не думаю, что услуг будет больше 256)

Заполните ее. После чего делайте запрос с применением JOIN

SELECT ts.id, GROUP_CONCAT(service_id) services_id FROM t_specialist ts JOIN t_specialist_services tss ON ts.id = tss.specialist_id GROUP BY tss.id

Или

SELECT ts.id, service_id FROM t_specialist ts JOIN t_specialist_services tss ON ts.id = tss.specialist_id

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

$services = [];
//$data данные из mysql
foreach ($data as $item) {
   $services[$item->id][] = $item->service_id;
}

P.S Прекратите использовать мамонта в виде расширения MYSQL, пора переходить на новое! В лучшем случае PDO или Mysqli

READ ALSO
Помогите добиться правды RBAC Super Simple with Admin and User

Помогите добиться правды RBAC Super Simple with Admin and User

Наткнулся на простой пост с реализацией простой админкиyii2 установлен advanced

224
Как вывести категории с бд - PHP

Как вывести категории с бд - PHP

Есть HTML код и таблица (category) из 15 brand и idКак грамотно вывести данные в теги li где li=сектор 1? Каждые 5 наименований относятся разным разделом

157
Самый простой ЧПУ [закрыто]

Самый простой ЧПУ [закрыто]

Есть лендинг с 2 страницами indexhtml и en

279
Как определить корневой веб каталог php при настройках Flash Builder?

Как определить корневой веб каталог php при настройках Flash Builder?

ЗдравствуйтеДелаю Flex проект на Flash Builder с php типом сервера

176