Форум программистов, компьютерный форум, киберфорум
PHP для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.57/7: Рейтинг темы: голосов - 7, средняя оценка - 4.57
0 / 0 / 0
Регистрация: 22.01.2020
Сообщений: 14

Выборка из таблицы со вставками фото при изменении данных ячейки

15.02.2020, 22:30. Показов 1604. Ответов 12

Студворк — интернет-сервис помощи студентам
Добрый вечер.

Такая затея:
1. Есть таблица в MySQL.

ID MALE AGE
0 --- START--- 0 лет
1 --- BOY --- 10 лет
2 --- BOY --- 15 лет
3 --- GIRL --- 10 лет
4 --- GIRL --- 5 лет
5 --- Animal --- 100 лет
6 --- Animal --- 50 лет

2. Есть фотографии:
BOY.png
GIRL.png
Animal.png

Хочется:
Одной выборкой, сделать так, чтобы выводились данные таблицы, но:
при каждой смене значения ячейки "MALE" - выводилось одно фото этой группы и далее продолжадась выборка.
вот так:

ФОТО МАЛЬЧИКА (src=/'.$male.'>) (по факту: BOY.png)
1 BOY 10 лет
2 BOY 15 лет

ФОТО ДЕВОЧКИ (src=/'.$male.'>) (по факту: GIRL.png)
3 --- GIRL --- 10 лет
4 --- GIRL --- 5 лет

ФОТО ЖИВОТНОЕ (src=/'.$male.'>) (по факту: Animal.png)
5 --- Animal --- 100 лет
6 --- Animal --- 50 лет

Поятно, что можно просто прописывать вручную все выборки и вручную вставлять картинки.
Но, есть подозрение что можно сделать все автоматически и более элегантно.

Вот выборка обычная.
PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
<?php 
$result=mysql_query("SELECT * FROM `Base`ORDER BY `MALE`");
  while($row = mysql_fetch_array($result)){
    $id=$row['ID'];
    $male=$row['MALE'];
    $age=$row['AGE'];
 
    echo " 
<tr>
<td>$id</td>
<td>$male</td>
<td>$age</td>
</tr>";
   } ?>
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
15.02.2020, 22:30
Ответы с готовыми решениями:

Google Таблицы. Как при изменении ячейки в определенном диапазоне выполнить действие?
Добрый день. Прошу помочь, так как не смог найти ответ в инете. Необходимо написать постоянно работающий скрипт. Суть скрипта...

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

Исключение при изменении (редактировании данных) таблицы в БД
в бд 3 таблицы, таблицы новостей сущности у них идентичные один из них: namespace WebApplication6.Models { public class...

12
 Аватар для sad67man
2603 / 1507 / 689
Регистрация: 23.08.2015
Сообщений: 3,823
15.02.2020, 22:57
Povaliha,
PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
class Entity
{
    const MALE_BOY = 'BOY';
    const MALE_GIRL = 'GIRL';
    const MALE_ANIMAL = 'Animal';
 
    public $id;
    public $male;
    public $age;
 
    public function getPhotoSrc()
    {
        if ($this->isBoy()) {
            return '/boy.png';
        }
 
        if ($this->isGirl()) {
            return '/girl.png';
        }
 
        if ($this->isAnimal()) {
            return '/animal.png';
        }
 
        return null;
    }
 
    public function isBoy()
    {
        return $this->male === self::MALE_BOY;
    }
 
    public function isGirl()
    {
        return $this->male === self::MALE_GIRL;
    }
 
    public function isAnimal()
    {
        return $this->male === self::MALE_ANIMAL;
    }
}
PHP/HTML
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
<?php
 
/** @var Entity[] $entities */
$entities = [];
 
$result=mysql_query("SELECT * FROM `Base`ORDER BY `MALE`");
while($entity = mysql_fetch_object($result, Entity::class)) {
    $entities[] = $entity;
}
 
?>
 
<table>
    <?php foreach ($entities as $entity): ?>
        <tr>
            <td><?= $entity->id ?></td>
            <td><?= $entity->male ?></td>
            <td><?= $entity->age ?></td>
            <td><?= $entity->getPhotoSrc() ?></td>
        </tr>
    <?php endforeach ?>
</table>
1
0 / 0 / 0
Регистрация: 22.01.2020
Сообщений: 14
15.02.2020, 23:11  [ТС]
Спасибо.

class Entity
{
const MALE_BOY = 'BOY';
const MALE_GIRL = 'GIRL';
const MALE_ANIMAL = 'Animal';

public $id;
public $male;
public $age;

public function getPhotoSrc()
Но объясните, для чего нужен первый код - для того чтобы просто получить в переменную SRC фотографии, я так понял?
Но, я могу эти src прописать в самой таблице.
Добавить новый столбец, например "SRC" и в нем прописать в каждой строчке, пусть к картинке.

ID MALE AGE SRC
0 --- START--- 0 лет --- 0.png
1 --- BOY --- 10 лет --- BOY.png
2 --- BOY --- 15 лет --- BOY.png
3 --- GIRL --- 10 лет --- GIRL.png
4 --- GIRL --- 5 лет --- GIRL.png
5 --- Animal --- 100 лет --- Animal.png
6 --- Animal --- 50 лет --- Animal.png

Это не упростит код?
Или это ничего не дает нам в плане простоты выборки и все равно нужно будет применять public function getPhotoSrc()???
0
 Аватар для sad67man
2603 / 1507 / 689
Регистрация: 23.08.2015
Сообщений: 3,823
15.02.2020, 23:23
Povaliha, Я так понимаю что BOY GIRL Alimal - это некие устойчивые значения. Поэтому я на автомате сделал константы, потому что теоретически их можно хранить в базе данных типе integer, а в коде использовать константы. + при помощи констант вы видите все возможные варианты этих значений.

Что касается картинки, по факту у вас есть жесткая зависимость картинки от типа, набор картинок уже есть и он известен. Если в какой-то момент нужно будет поменять картинку, или логику выбора картинки. То это проще будет сделать изменив метод, не делая изменений в БД.
1
0 / 0 / 0
Регистрация: 22.01.2020
Сообщений: 14
15.02.2020, 23:46  [ТС]
sad67man, спасибо.

1. Картинки лежат на сервере, не хотелось бы их записывать в базу.
Есть простая железная связь:
ИМЯ КАРТНИКИ.png - это ЗНАЧЕНИЕ в столбце MALE.
Ну т.е.
BOY = boy.png
Girl = girl.png
KvaziDiffuzor = kvaziDiffuzor.png

Или можно добавить столбец в базу SRC, в котором прописать эти имена.
(как я писал выше).

2. Понятно что универсальность лучше, чем привязка.
Но, я бы вас попросил, все таки подсказать код выборки применительно к моей таблице, без использования функций.

Я так понимаю, что все можно сделать при помощи $result=mysql_query, foreach и оператора if.
но никак не могу это все увязать.

Проблемка в чем: если делать обычную выборку, то картинки будут отображаться напротив каждой строчки в таблице.
А мне надо: чтобы при каждой новой группировке по столбцу MALE, картинка прописывалась разово перед выборкой.
0
 Аватар для sad67man
2603 / 1507 / 689
Регистрация: 23.08.2015
Сообщений: 3,823
16.02.2020, 00:01
Povaliha, На самом деле я не совсем внимательно прочитал ваше задание. Можно вынести метод из сущности в некий хэлпер
PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
class Entity
{
    const MALE_BOY = 'BOY';
    const MALE_GIRL = 'GIRL';
    const MALE_ANIMAL = 'Animal';
 
    public $id;
    public $male;
    public $age;
 
    public function isBoy()
    {
        return $this->male === self::MALE_BOY;
    }
 
    public function isGirl()
    {
        return $this->male === self::MALE_GIRL;
    }
 
    public function isAnimal()
    {
        return $this->male === self::MALE_ANIMAL;
    }
}
PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
class EntityHelper
{
    private static $groupImages = [
        Entity::MALE_BOY => '/boy.png',
        Entity::MALE_GIRL => '/girl.png',
        Entity::MALE_ANIMAL => '/animal.png',
    ];
 
    public static function getGroupImageSrc($male)
    {
        return self::$groupImages[$male] ?? null;
    }
}
PHP/HTML
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
<?php
 
$entityGroups = [];
 
$result=mysql_query("SELECT * FROM `Base`ORDER BY `MALE`");
while($entity = mysql_fetch_object($result, Entity::class)) {
    $entityGroups[$entity->male][] = $entity;
}
 
?>
 
 
<?php foreach ($entityGroups as $male => $entities): ?>
    <img src="<?= EntityHelper::getGroupImageSrc($male) ?>" alt="">
    <table>
        <?php foreach ($entities as $entity): ?>
            <tr>
                <td><?= $entity->id ?></td>
                <td><?= $entity->male ?></td>
                <td><?= $entity->age ?></td>
            </tr>
        <?php endforeach ?>
    </table>
<?php endforeach ?>
Добавлено через 3 минуты
Тут самое главное не захламлять излишней логикой ваш шаблон. А логика в любом случае есть. Так что без функции не обойтись. Как вы реализуете метод getGroupImageSrc() уже ваше дело. И представление ничего об этом не должно знать.
0
0 / 0 / 0
Регистрация: 22.01.2020
Сообщений: 14
16.02.2020, 00:14  [ТС]
Спасибо.

Я воспользуюсь данным кодом - но для другой моей задумки.

А для конкретно данной ситуации - есть недостаток в вашем методе.
И он существенен:
Различных параметров в столбце MALE - может быть много.
BOY, GIRL, Animal, Books, Snacks, Pens и т.д.

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

Я сильно подозреваю, что это делается как-то просто.
И без логики.
Простой выборкой и сортировкой по группам, с выводом сообщения на экран при каждой новой группе.
Foreach, While и может еще что-то.

П.С. Мы можем упростить задачу, черт с этими картинками.
Пусть код просто выводит название группы перед кажой сортировкой.
Т.е. результат на экране такой нужен:

Группа: BOY
1 BOY 10 лет
2 BOY 15 лет

Группа: GIRL
3 GIRL 10 лет
4 GIRL 5 лет

Группа Animal
5 Animal 100 лет
6 Animal 50 лет
0
 Аватар для sad67man
2603 / 1507 / 689
Регистрация: 23.08.2015
Сообщений: 3,823
16.02.2020, 01:23
Лучший ответ Сообщение было отмечено Povaliha как решение

Решение

Povaliha, Я уже выше написал, вы можете реализовать метод getGroupImageSrc() как вы хотите, это и есть плюс абстракции. Когда мы находимся в шаблоне нам не важно каким образом мы получаем картинку.
PHP
1
2
3
4
5
6
7
class EntityHelper
{
    public static function getGroupImageSrc($male)
    {
        return '/images/' . $male . '.png';
    }
}
Добавлено через 7 минут
Так же этот метод можно повторно использовать на других страницах. Если бы вы жестко прописали без метода, то была бы проблема с изменением в разных местах.

Добавлено через 10 минут
Даже обычное склеивание для формирование пути к картинке - это ведь тоже логика.

Добавлено через 47 минут
Povaliha, Если у вас значений много, то можно создать отдельную таблицу male
id, titile, image
1
0 / 0 / 0
Регистрация: 22.01.2020
Сообщений: 14
19.02.2020, 11:46  [ТС]
sad67man, я все не уймусь, подскажите, а как может выглядеть код для реализации такой логики:

1. Организуем вывод построчно всех элементы базы.
Циклом. (это сделано).

2. Присваиваем значение ячейки MALE в переменную $male.
$male=$row['MALE'];

3. Проверяем условие: если $male изменился (наверное нужно делать проверку $male который был и который стал, не знаю как это сделать).
Если $male изменился (все равно на что, главное НЕ равен предыдущему) - то выводим картинку src= '.$male.'.png

Вроде бы простая как топор логика и достаточно элегантная.
При каждом изменении $male - мы будем выводить картинку $male.png
0
 Аватар для sad67man
2603 / 1507 / 689
Регистрация: 23.08.2015
Сообщений: 3,823
19.02.2020, 18:47
Povaliha,
Я вам выше уже писал.
Цитата Сообщение от sad67man Посмотреть сообщение
PHP/HTML
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
<?php
$entityGroups = [];
$result=mysql_query("SELECT * FROM `Base`ORDER BY `MALE`");
while($entity = mysql_fetch_object($result, Entity::class)) {
    $entityGroups[$entity->male][] = $entity;
}
?>
<?php foreach ($entityGroups as $male => $entities): ?>
    <img src="<?= EntityHelper::getGroupImageSrc($male) ?>" alt="">
    <table>
        <?php foreach ($entities as $entity): ?>
            <tr>
                <td><?= $entity->id ?></td>
                <td><?= $entity->male ?></td>
                <td><?= $entity->age ?></td>
            </tr>
        <?php endforeach ?>
    </table>
<?php endforeach ?>
Добавлено через 33 минуты
Povaliha, Так как у вас возможных значений male много, то лучше добавить отдельную таблицу для mail. Почитайте что-нибудь про нормализацию баз данных.

base
id male_id age
1 --- 1 --- 10
2 --- 1 --- 15
3 --- 2 --- 10 лет
4 --- 2 --- 5 лет
5 --- 3 --- 100 лет
6 --- 3 --- 50 лет

males
id title image
1 --- BOY --- boy.png
2 --- GIRL --- girl.png
3 --- Animal --- animal.png

Тогда запрос будет выглядеть так
SQL
1
2
3
4
SELECT base.*, males.title AS male
FROM base 
LEFT JOIN males ON base.male_id = males.id
ORDER BY base.male_id
Ваш вариант тоже используют - это сознательная денормализация в пользу производительности, как правило когда вариантов значений очень мало и они практически никогда не меняются.
0
0 / 0 / 0
Регистрация: 22.01.2020
Сообщений: 14
19.02.2020, 21:15  [ТС]
sad67man, Я хочу добится простоты кода.
У вас достаточно сложный для понимания обывателя.
А древовидная структура вывода (или же вывод значений с оглавлениями ) - это крайне востребованная информация.
Но, нигде не нашел ничего простого.

Вот что у меня получилось:

PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
<?php 
$result=mysql_query("SELECT * FROM `Base` ORDER BY `Id`");
  while($row = mysql_fetch_array($result)){
    $id=$row['ID'];
    $male=$row['MALE'];
    $age=$row['AGE'];
 
 
if ($male_xxx <> $male) // вводим новую переменную и проверяем условие $male_ххх не равно $male????
{
echo '<img src = "./'.$male.'.png" width = "200"></img>'; // если не равно, выводим картинку
$male_xxx = $male; // записываем текущее значение $male в переменную $male_xxx
} else {} 
 
    echo  // выводим на экран внутренности базы.
"
<tr>
<td>$name</td>
<td>$age</td>
 
</tr>";
 
   } ?>
НО, простая проблемка, заключается в том, что на экране это выглядит так:
сначала (ПОЧЕМУ-то!?!?!) выводятся все картинки, а потом уже все внутренности таблицы!!
Как так?

Т.е. сейчас это выглядит так:



А надо так:
0
 Аватар для sad67man
2603 / 1507 / 689
Регистрация: 23.08.2015
Сообщений: 3,823
19.02.2020, 23:04
Povaliha, По вашему коду, трудно проследить верстку (html код), не вижу, чтоб вы картинку помещали бы внутрь какой-либо ячейки таблицы. Если верстка будет усложняться и будет подвергаться частым изменениям, есть риск повредить логику получения данных.
Вообще получение данных из бд и сложную логику нужно четко отделять от вывода - формирования html представления.
Это как 2 разных контекста, где php играет 2 совершенно разные роли. В одном случае как серверный язык программирования, в другом как простой шаблонизатор.

Добавлено через 1 минуту
Не пойму чем вас мой вариант не устраивает. Не нравятся объекты - напишите на массивах.
PHP/HTML
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
<?php
 
$entityGroups = [];
$result=mysql_query("SELECT * FROM `Base`ORDER BY `MALE`");
while($row = mysql_fetch_array($result)) {
    $entityGroups[$row['MALE'][] = $row;
}
                  
?>
 
<?php foreach ($entityGroups as $male => $entities): ?>
    <img src="/<?= $male ?>.png" alt="">
    <table>
        <?php foreach ($entities as $entity): ?>
            <tr>
                <td><?= $entity['ID'] ?></td>
                <td><?= $entity['MALE'] ?></td>
                <td><?= $entity['AGE'] ?></td>
            </tr>
        <?php endforeach ?>
    </table>
<?php endforeach ?>
Добавлено через 4 минуты
У вас может быть проблема не с логикой, а с самой версткой. Для начала сверстайте чистый html код. А потом уже подставляйте туда реальные значения из бд.
0
0 / 0 / 0
Регистрация: 22.01.2020
Сообщений: 14
19.02.2020, 23:28  [ТС]
sad67man, ваш код устраивает.
Просто он сложен для восприятия.
И скорее всего будет крайне полезен для больших объемов данных.


Вывод данных структурировано - нужен повсеместно.

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

НО. Я не нашел ничего и похожего в интернете.
А если и были примеры - то крайне сложные для понимания.

Поэтому, я озадачился написанием простого кода, для вывода данных с оглавлением из mySql.

И, все получилось, последний мой код - работает.
Вы были правы - нужно было немного изменить верстку.
Тег <table> добавил в тело ECHO!

Рабочий код:
PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
<?php 
$result=mysql_query("SELECT * FROM `Base` ORDER BY `Id`");
  while($row = mysql_fetch_array($result)){
    $id=$row['ID'];
    $male=$row['MALE'];
    $age=$row['AGE'];
 
 
if ($male_xxx <> $male) // вводим новую переменную и проверяем условие $male_ххх не равно $male????
{
echo '<img src = "./'.$male.'.png" width = "200"></img>'; // если не равно, выводим картинку
$male_xxx = $male; // записываем текущее значение $male в переменную $male_xxx
} else {} 
 
    echo  // выводим на экран внутренности базы.
"
<table> 
<tr>
<td>$name</td>
<td>$age</td>
 
</tr>
</table>
";
 
   } ?>
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
19.02.2020, 23:28
Помогаю со студенческими работами здесь

Макрос, который увеличивает значение ячейки А на 1 при изменении ячейки В
Добрый день. Я написал макрос, который увеличивает значение ячейки А на 1 при изменении ячейки В, но почему то значение изменяется...

Функция. Выборка данных из таблицы при вводе месяца
Есть пользовательская функция SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO CREATE FUNCTION ( @mesyacavans date )

Выборка данных из таблицы при задании определяющих значений в фильтре
Добрый день уважаемые специалисты. Прошу оказать помощь по решению следующей проблемы. См. вложенный фал book.xlsx. Таблица 2...

Выборка, ячейки из таблицы SQL, в переменную
Здравствуйте, напиши как правильно выдернуть текст из таблицы которая сделана в SQL. Есть вот такая таблица Во временную...

Как подсветить ячейки заголовка при вводе данных в ячейку таблицы?
При вводе данных в поля таблицы как обеспечить подсветку соответствующих ячеек верхней строки и левого столбца таблицы, те полей заголовка...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
13
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Основы отладки веб-приложений на SDL3 по USB и Wi-Fi, запущенных в браузере мобильных устройств
8Observer8 07.02.2026
Содержание блога Браузер Chrome имеет средства для отладки мобильных веб-приложений по USB. В этой пошаговой инструкции ограничимся работой с консолью. Вывод в консоль - это часть процесса. . .
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
SDL3 для Web (WebAssembly): Установка Emscripten SDK (emsdk) и CMake для сборки C и C++ приложений в Wasm
8Observer8 30.01.2026
Содержание блога Для того чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. . . .
SDL3 для Android: Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru