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

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

15.02.2020, 22:30. Показов 1599. Ответов 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,814
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,814
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,814
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,814
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,814
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,814
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
Ответ Создать тему
Новые блоги и статьи
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
Модель микоризы: классовый агентный подход 3
anaschu 06.01.2026
aa0a7f55b50dd51c5ec569d2d10c54f6/ O1rJuneU_ls https:/ / vkvideo. ru/ video-115721503_456239114
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR
ФедосеевПавел 06.01.2026
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR ВВЕДЕНИЕ Введу сокращения: аналоговый ПИД — ПИД регулятор с управляющим выходом в виде числа в диапазоне от 0% до. . .
Модель микоризы: классовый агентный подход 2
anaschu 06.01.2026
репозиторий https:/ / github. com/ shumilovas/ fungi ветка по-частям. коммит Create переделка под биомассу. txt вход sc, но sm считается внутри мицелия. кстати, обьем тоже должен там считаться. . . .
Расчёт токов в цепи постоянного тока
igorrr37 05.01.2026
/ * Дана цепь постоянного тока с сопротивлениями и напряжениями. Надо найти токи в ветвях. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа и решает её. Последовательность действий:. . .
Новый CodeBlocs. Версия 25.03
palva 04.01.2026
Оказывается, недавно вышла новая версия CodeBlocks за номером 25. 03. Когда-то давно я возился с только что вышедшей тогда версией 20. 03. С тех пор я давно снёс всё с компьютера и забыл. Теперь. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru