Выборка из БД, не могу понять

Статус
В этой теме нельзя размещать новые ответы.

n1k.Sly

Постоялец
Регистрация
7 Сен 2009
Сообщения
97
Реакции
9
Добрый день,
Начал учить PHP и столкнулся с такой проблемой, не могу вывести данные из такой таблицы:

id | contact_id | name | value

123 | 3232 | phone | +7999999
124 | 3232 | email | mail@example.com
125 | 3232 | adress | улица 85
126 | 3232 | inn | 555555555

127 | 3233 | phone | +89654
128 | 3233 | email | w@w.ru
129 | 3233 | adress | сорокина 87
130 | 3233 | inn | 6666666

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

Даже не могу предположить в какую сторону копать, подскажите пожалуйста.
 
PHP:
SELECT
name, /* это имя колонки */
value
FROM имя_таблицы
WHERE id=123
Примерно так.
Вернет массив:
PHP:
Array(
  [0] => 'phone'
  [1] => '+799999'
)
 
PHP:
SELECT
name, /* это имя колонки */
value
FROM имя_таблицы
WHERE id=123
Примерно так.
Вернет массив:
PHP:
Array(
  [0] => 'phone'
  [1] => '+799999'
)

ой, забыл написать, нужно получить данные при условии что нужно выбрать по contact_id т.е. собрать в массив например все поля для контакта 3232
 
PHP:
SELECT
name, /* это имя колонки */
value
/* Можно еще так: name AS contact_type, тогда вместо циферок в массиве будет ['contact_type'] => 'phone' */
FROM имя_таблицы
WHERE contact_id=3232
AND id=123 /* Это можно убрать */
 
PHP:
SELECT
name, /* это имя колонки */
value
/* Можно еще так: name AS contact_type, тогда вместо циферок в массиве будет ['contact_type'] => 'phone' */
FROM имя_таблицы
WHERE contact_id=3232
AND id=123 /* Это можно убрать */
наверное я не правильно вопрос задал :-(

Т.е. основу работы с БД знаю.
Но мне нужно в php вывести в массив я даже ХЗ как объяснить т.к. я первый раз вижу такую структуру таблицы и не поинмаю как вывести все.

Т.е. например при запросе:
PHP:
$q = "SELECT * FROM data WHERE contact_id='3232'";

$result = $db->query($q);
$result = mysqli_fetch_object($result);

var_dump($result);

Я получаю:
object(stdClass)[4]
public 'id' => string '123' (length=3)
public 'contact_id' => string '3232' (length=4)
public 'field' => string 'inn' (length=3)
public 'ext' => string '' (length=0)
public 'value' => string '8888888888' (length=10)
public 'sort' => string '0' (length=1)

Не совсем понима. либо запрос не такой, либо вывод или вобще что не так :-(

До этого делал вывод из таблицы вида (всё норм получилось:(
id | name | surname | phone | adress | mail
 
PHP:
$q = "SELECT * FROM data WHERE contact_id='3232'";

$result = $db->query($q);
$row = $result->fetch_assoc();

var_dump($row);
 
PHP:
$q = "SELECT * FROM data WHERE contact_id='3232'";

$result = $db->query($q);
$row = $result->fetch_assoc();

var_dump($row);

Теперь так:

array (size=6)
'id' => string '123' (length=3)
'contact_id' => string '3232' (length=4)
'field' => string 'inn' (length=3)
'ext' => string '' (length=0)
'value' => string '88888888888' (length=10)
'sort' => string '0' (length=1)

Но я всё равно не понимаю как это использовать :-(
Как мне вывести из таблицы phone, inn, adres
 
PHP:
$q = "SELECT * FROM data WHERE contact_id='3232'";

$result = $db->query($q);
while ($row = $result->fetch_assoc())
    {
        echo $row['field'].' = '.$row['value'].PHP_EOL;
    }
 
PHP:
$q = "SELECT * FROM data WHERE contact_id='3232'";

$result = $db->query($q);
while ($row = $result->fetch_assoc())
    {
        echo $row['field'].' = '.$row['value'].PHP_EOL;
    }
Блин пробовал while но из-за недостатка знаний чутка не так делал :-(
Спасибо большое!
 
Я немного направлю вас в нужное русло. То, что вы сейчас делаете это хорошо, но далеко здесь не уехать, да и не нужно. Сейчас так никто не пишет и не делает. Есть уже готовые решения ввиде orm или active record. Простыми словами: есть уже код, который делает всю выборку за вас со всеми экранированиями и проверками.

Я бы посоветовал:
1. Научитесь писать/строить сложные sql запросы на чистом sql
2. А уже после переводить их на язык этих самых "orm" или прочих интерфейсов работы с базой

Вот пример того, что я имею ввиду из документации laravel

PHP:
$flights = App\Flight::where('active', 1)
               ->orderBy('name', 'desc')
               ->take(10)
               ->get();

- замените ::where('active', 1) на ::where('contact_id', 3232) - и система построит запрос, который вам нужен сама.
- уберите take(10) и он выберет все записи, а не только 10 первых
- уберите orderBy - и не будет сортировки

Согласны, что код выше значительно короче, удобней и понятней кода, который написан выше? (если еще убрать, то, что не нужно, так это вовсе одна строка)

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