2016-12-06 5 views
5

У меня есть таблица:Echo изображений на UI из таблицы на основе условия

Badgecount Table

Сценарий: Здесь вы увидите 5 значков (badge1 до badge5). Когда работник награждается значком, он становится 1, иначе 0. Например: Бринда выигрывает все значки, тогда как лайка выигрывает только badge1.

Значки хранятся в виде больших двоичных объектов изображений в другой badgePhoto таблице:

badge

UI для отображения знака:

UI

Теперь у меня есть пользовательский интерфейс, где я хочу отобразите последние 3 выигранных значка.

  • Если 1 выигравший, будет показан только 1.
  • Если будет показано 5 значков, будут показаны 3 значка.
  • Если бейджы не выиграны, тогда эхо «Нет значков выиграно».

HTML, связанные с значком в вышеприведенном UI:

<div class="panel"> 
 
    <div class="form" style="width: 350px; height: 220px;"> 
 
    <div class="login">Recent badges</div> 
 
    <span class="fa-stack fa-5x has-badge"> 
 
\t  <div class="badgesize"> 
 
      <img src="images/7.png" alt="" > 
 
\t  </div> 
 
    </span> 
 
    <span class="fa-stack fa-5x has-badge"> 
 
\t  <div class="badgesize"> 
 
\t \t \t <img src="images/1.png" alt="" > 
 
\t \t </div> 
 
    </span> 
 
    <span class="fa-stack fa-5x has-badge"> 
 
\t \t <div class="badgesize"> 
 
\t   <img src="images/2.png" alt="" > 
 
\t   <!-- <img class="cbImage" src="images/7.png" alt="" style="width:50px;height:50px"/> --> 
 
\t \t </div> 
 
    </span> 
 
    </div> 
 
</div> 
 

 
<!-- badges panel ends here -->

В изображения метки говорит о значках.

У меня есть PHP для извлечения данных:

$q2 = "SELECT * FROM pointsBadgeTable WHERE EmployeeID = '" . $_SESSION['id'] . "' "; 
$stmt1 = sqlsrv_query($conn,$q2); 
if ($stmt1 == false) 
{ 
    echo 'error to retrieve info !! <br/>'; 
    die(print_r(sqlsrv_errors(),TRUE)); 
} 
$pbrow = sqlsrv_fetch_array($stmt1); 

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

<?php echo "" . $pbrow['badge1/badge2/...'] . "" ?> 

То, что я пытаюсь сделать здесь, похоже на профиль в Stack Overflow. Здесь, под новейшим, вы можете увидеть значок «критик». Как мы можем принести новый значок или любой значок в соответствии с условием?

stack overflow

+1

«* .. Просьба помочь, если у кого есть какие-либо идеи. *« Но вы не писали то, что ищете? С какими проблемами вы сталкиваетесь? Какой выход? –

+0

Я думаю, что у вас не возник вопрос. Нет проблемы.М sry для этого. Я пытаюсь отобразить последние три значка в вышеуказанном пользовательском интерфейсе из таблицы, где значение значка равно 1. Я упомянул html, где Я хочу эхо. В любом случае, спасибо. Бог благословит. @NanaPartykar – jane

+0

Я думаю, что @NanaPartykar говорит, что вы написали свой сценарий очень красиво и, похоже, полностью закодированы, но вы не указали, где находится код. – SMM

ответ

1

Прежде всего, если вы хотите отобразить что-то в соответствии с измерением времени (здесь самым последним) вы должны будете экономить время, наряду с «вещью». В вашем примере я бы предложил использовать отдельную таблицу, содержащую ссылки на пользователя, значок и удерживая отметку времени при получении значка. Таким образом вы можете изменить свой запрос так, чтобы он извлекал значки в соответствии с порядком, полученным последним.

Для отображения изображения сам я хотел бы предложить ответ, данный here (соответствующая информация в цитата ниже)

Первый, и один я не рекомендую, если у вас есть множество изображений, как это, к используйте встроенную кодировку base64. Это делается с помощью:

<img src="data:image/jpeg;base64,<?php echo base64_encode($image); ?>" />; 

Второй способ заключается в создании «образа» PHP-файл, который принимает идентификатор изображения в базе данных в качестве параметра строки запроса и выводит изображение. Таким образом, ваш HTML будет выглядеть примерно так:

<img src="image.php?id=<?php echo $image_id; ?>" /> 
+0

Я делаю то же, что и вы, я сохраняю время и значок, который был выигран. Значок, который выиграл, я признал его «1», и другие не выиграли как «0». Это то, как я различаю значки от выигранных и не выиграл в основном. Теперь я также храню образы значка в другой таблице. Как я взаимосвязаю, два и дисплей (случайные 3 среди них) только те значки, которые выиграны. Спасибо. – jane

+0

моя точка в том, как я могу отобразить любые 3 случайных значка в пользовательском интерфейсе. – jane

+0

или только 1 значок как самый новый, в пользовательском интерфейсе, как мы видим в стеке. – jane

0

Это может буквально быть сделано во многих отношениях, но я хотел бы предложить вам один из них здесь:

Если возможно, изменить структуру employee таблицы и вместо boolean для выигранных значков используйте datetime (где по умолчанию NULL); всякий раз, когда выигрыш в выигрыше хранит timestamp в этой ячейке. Таким образом, вы знаете, какой из них является последним (просто запрашивая строку, а затем проверяя массив результатов для самого большого числа) - вы также можете добиться этого, сохранив свою текущую структуру и добавив еще один столбец, чтобы ссылаться на последние выиграл идентификатор значка.

Что касается другого вопроса для ограничения видимых значков в пользовательском интерфейсе, вы можете просто добавить это к Вашему запросу:

order by rand() limit 3; 
6

Проблемы вы столкнулись исходит из того, что вы хранящих данных в таким образом, что вы знаете только, какие значки у пользователя есть или нет. Чтобы узнать самый «последний» значок, вам нужно будет хранить еще информацию в базе данных.

Давайте сначала реструктурируем базу данных; В большинстве случаев первый столбец id должен быть PRIMARY KEY с IDENTITY, так что с каждой вставкой создается уникальный идентификатор. Начнем с удаления устаревших столбцов в вашей таблице employees, а в вашем badgePhoto мы добавим id и небольшое изменение имени, чтобы все стало немного более ощутимым.

+------+---------+ +---------------------------+ 
| employees | |   badges   | 
+------+---------+ +----+--------------+-------+ 
| id | name | | id | name   | image | 
+------+---------+ +----+--------------+-------+ 
| 34 | Anil | | 1 | First Badge | blob | 
+------+---------+ +----+--------------+-------+ 
| 1122 | Lyka | | 2 | Second Badge | blob | 
+------+---------+ +----+--------------+-------+ 
| 2233 | brinda | | 3 | Third Badge | blob | 
+------+---------+ +----+--------------+-------+ 

Теперь создайте новую таблицу, чтобы мы могли связать данные, соединяя таблицы с идентификаторами.

+--------------------------------------------------+ CREATE TABLE employee_badges(
|    employee_badges     | id int NOT NULL IDENTITY PRIMARY KEY, 
+----+-------------+----------+--------------------+ employee_id int NOT NULL, 
| id | employee_id | badge_id | earned_on   | badge_id int NOT NULL, 
+----+-------------+----------+--------------------+ earned_on datetime NOT NULL DEFAULT GETDATE() 
| 1 | 1122  | 1  | 2016-12-7 12:10:08 | ) 
+----+-------------+----------+--------------------+ 
| 2 | 34   | 1  | 2016-8-7 12:10:08 | INSERT INTO employee_badges (employee_id, badge_id) VALUES (1122, 1) 
+----+-------------+----------+--------------------+ INSERT INTO employee_badges (employee_id, badge_id) VALUES (34, 1) 
| 3 | 34   | 2  | 2016-9-6 08:10:14 | INSERT INTO employee_badges (employee_id, badge_id) VALUES (34, 2) 
+----+-------------+----------+--------------------+ 
| etc.. each row represents an earned medal  | 
+--------------------------------------------------+ 

Теперь попытайтесь представить себе, как мы собираемся подключить данные, в настоящее время в этой таблице сотрудника Lyka имеет 1 медаль и работник Anil два. Дадим «Третий Знак» к «» Lyka:

$sql = "INSERT INTO employee_badges (employee_id, badge_id) VALUES (1122, 3)"; 

$date = date("Y-m-d H:i:s", strtotime("-1 year")); // give badge at today's date, last year. 
$sql = "INSERT INTO employee_badges (employee_id, badge_id, earned_on) VALUES (1122, 3, '$date')"; 

Просто потому, что столбец имеет default value не означает, что она не может быть переопределен. Вы можете настроить эту таблицу по своему вкусу (например, добавить столбец прогрессии), но это упростит этот пример. На данный момент earned_on имеет значение по умолчаниюGETDATE(), поэтому каждый раз, когда вставлена ​​новая строка, текущее время устанавливается для вас автоматически.

Если вы хотите, чтобы выбрать заработанные жетоны работника Anil вы можете сделать следующий запрос:

SELECT b.name, b.image FROM badges AS b 
INNER JOIN employee_badges AS e 
ON e.badge_id = b.id 
WHERE e.employee_id = 34 

Вы также можете использовать фильтры, как этот, чтобы выбрать последнюю значка.

... 
WHERE e.employee_id = 34 
ORDER BY e.earned_on DESC 
LIMIT 1 

Это сортирует список из последних в ближайшее время, и если вы добавите LIMIT 1 возвращает только самый верхний ряд.

Вы можете позволить вашему SQL-серверу делать почти все, но, возможно, вам стоит сделать это на один шаг в то время. Просто используйте приведенный выше запрос и позвольте PHP разобраться. Граф возвратил строки, если rowcount> 0, то вы знаете, что пользователь заработал значки и просто просмотрел результаты и отобразил их.

if(sqlsrv_has_rows($stmt)){ 
    while($row = sqlsrv_fetch_array($stmt, SQLSRV_FETCH_ASSOC)){ 
    $result[] = $row; 
    } 

    if(count($recentBadge) > 3){ 
    foreach(array_rand($recentBadge, 3) as $key){ 
     $data[] = $recentBadge[$key]; 
    } 
    $recentBadge = $data; 
    } 

    foreach($recentBadge as $row){ 
    echo 
     $row['name'], 
     # Keep in mind to fix vvvv the mime-type. If you stored it as png, then png, or gif or w/e. 
     '<img src="data:image/jpeg;base64,'.base64_encode($row['image']).'"/>', 
     '<br>' 
    ; 
    } 
} else { 
    echo 'no results'; 
} 
+0

@Xorfifelse ... вы гений. Вы дали мне идеальное решение. Могу только беспокоиться, как мне создать эту таблицу employee_badge. Как я записываю временную метку? В любом случае, Thnaks.God благослови. – jane

+0

Я считаю, что мне нужно использовать обновление Trigger здесь. Но я борюсь с запросом здесь. – jane

+0

@jane Я немного обновил вопрос о таблице. Мой опыт больше связан с синтаксисом MySQL, но я добавил запрос для [tag: sql-server-2012] – Xorifelse

0

Существует простое решение этой проблемы в том, что вы столкнулись, если вы не хотите, чтобы изменить структуру базы данных путем добавления дополнительных таблиц.

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

Alter таблицы значков и вместо того, чтобы использовать 0 или 1 в качестве значения в значках колонна делает его DATETIME поля. Когда пользователю присваивается значок, напишите дату и время в базу данных как значение значка, а не 1.

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

Как мы можем принести новый значок или любой значок в соответствии с условием?

Пример SQL Fiddle, где условие должно содержать в нашем запросе последние 7 дней значки для каждого пользователя. Ниже приведены тестовые данные для скрипки.

CREATE TABLE `TEST` (
`id` int(10) NOT NULL PRIMARY KEY, 
`name` varchar(255), 
`badge1` datetime, 
`badge2` datetime, 
`badge3` datetime, 
`badge4` datetime, 
`badge5` datetime 
); 

INSERT INTO `TEST` (`id`,`name`,`badge1`,`badge2`,`badge3`,`badge4`,`badge5`) VALUES 
(1,'Nick','2016-12-10 13:58:13','0000-00-00 00:00:00','2016-12-07 17:28:19','0000-00-00 00:00:00','0000-00-00 00:00:00'), 
(2,'Sharah','2016-11-10 13:58:13','2016-11-17 13:01:13','2016-12-06 17:28:19','0000-00-00 00:00:00','0000-00-00 00:00:00'), 
(3,'John','2016-11-12 11:58:13','2016-11-19 13:05:13','2016-12-08 17:28:19','0000-00-00 00:00:00','0000-00-00 00:00:00') ; 

Запроса получить последние 7 дней значков с использованием MySQL, IF() и DATEDIFF()

SELECT `id`,`name`, 
IF(DATEDIFF(NOW(),`badge1`)>7,'0000-00-00 00:00:00', `badge1`) as `Badge1`, 
IF(DATEDIFF(NOW(),`badge2`)>7,'0000-00-00 00:00:00', `badge2`) as `Badge2`, 
IF(DATEDIFF(NOW(),`badge3`)>7,'0000-00-00 00:00:00', `badge3`) as `Badge3`, 
IF(DATEDIFF(NOW(),`badge4`)>7,'0000-00-00 00:00:00', `badge4`) as `Badge4`, 
IF(DATEDIFF(NOW(),`badge5`)>7,'0000-00-00 00:00:00', `badge5`) as `Badge5` FROM `TEST`; 

EDIT

Вы можете дополнительно попробовать этот запрос, чтобы получить последний бейдж (дату и имя), вы можете увидеть результаты в обновленных SQL Fiddle

SELECT `id`,`name`,GREATEST(COALESCE(IF(DATEDIFF(NOW(),`badge1`)>0,CONCAT(`badge1`,'_badge1'),'0000-00-00 00:00:00')), 
COALESCE(IF(DATEDIFF(NOW(),`badge2`)>0,CONCAT(`badge2`,'_badge2'),'0000-00-00 00:00:00')), 
COALESCE(IF(DATEDIFF(NOW(),`badge3`)>0,CONCAT(`badge3`,'_badge3'),'0000-00-00 00:00:00')), 
COALESCE(IF(DATEDIFF(NOW(),`badge4`)>0,CONCAT(`badge4`,'_badge4'),'0000-00-00 00:00:00')), 
COALESCE(IF(DATEDIFF(NOW(),`badge5`)>0,CONCAT(`badge5`,'_badge5'),'0000-00-00 00:00:00'))) as `latest_badge` FROM `TEST`; 

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

id name latest_badge 
1 Nick 2016-12-10 13:58:13_badge1 
2 Sharah 2016-12-06 17:28:19_badge3 
3 John 2016-12-08 17:28:19_badge3 
Смежные вопросы