Все технические форумы на одном сайте Удобный поиск информации с популярных форумов в одном месте
Вопрос: [ASP.NET Core] Выборка данных текущего пользователя

Добрый день. У меня есть небольшой проект на ASP.NET MVC Core. В нём есть две таблицы - Users с их данными, и Result с конкретными данными. У обеих таблиц есть связующее поле login.

На данный момент проект реализует возможность авторизации и регистрации по ролям, а так же вывод каких то результатов.

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

Вот модели данных

C#
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
public class User
    {
        public Guid UserId { get; set; }
 
        public string Name { get; set; }
 
        public string Surname { get; set; }
 
        public string MiddleName { get; set; }
 
        public string Login { get; set; }
 
        public string Password { get; set; }
 
        public string Email { get; set; }
 
        public string Phone { get; set; }
 
        public virtual ICollection<Result> Results { get; set; } = new List<Result>();
 
        public int? RoleId { get; set; }
 
        public Role Role { get; set; }
    }
 
public class Result
    {
        [Key]
        public Guid ResultId { get; set; }
 
        public string UserId { get; set; }
 
        public int Score { get; set; }
 
        public string Time { get; set; }
 
        public virtual User User { get; set; }
    }
Вот контроллер Home

C#
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
43
44
45
46
47
48
49
50
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Authorization;
using GameWebService.Models;
 
namespace GameWebService.Controllers
{
    public class HomeController : Controller
    {
        GameWebContext db;
 
        public HomeController(GameWebContext context)
        {
            db = context;
        }
 
        [Authorize(Roles = "admin, user")]
        public IActionResult Index()
        {
            return View(db.Results.ToList());
        }
 
        public IActionResult About()
        {
            ViewData["Message"] = "Your application description page.";
 
            return View();
        }
 
        public IActionResult Contact()
        {
            ViewData["Message"] = "Your contact page.";
 
            return View();
        }
 
        public IActionResult Error()
        {
            return View();
        }
 
        public IActionResult Results()
        {
            return View(db.Results.ToList());
        }
    }
}
А вот контроллер авторизации

C#
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
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
using System.Collections.Generic;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Mvc;
using GameWebService.Models;
using Microsoft.EntityFrameworkCore;
using System.Security.Claims;
 
namespace GameWebService.Controllers
{
    public class AccountController : Controller
    {
        private GameWebContext _context;
        public AccountController(GameWebContext context)
        {
            _context = context;
        }
 
        [HttpGet]
        public IActionResult Register()
        {
            return View();
        }
 
        [HttpPost]
        [ValidateAntiForgeryToken]
        public async Task<IActionResult> Register(RegisterModel model)
        {
            if (ModelState.IsValid)
            {
                User user = await _context.Users.FirstOrDefaultAsync(u => u.Email == model.Email);
                if (user == null)
                {
                    // добавляем пользователя в бд
                    user = new User {Surname = model.Surname, Name = model.Name, MiddleName = model.MiddleName, Login = model.Login, Phone = model.Phone, Email = model.Email, Password = model.Password };
                    Role userRole = await _context.Roles.FirstOrDefaultAsync(r => r.Name == "user");
                    if (userRole != null)
                        user.Role = userRole;
 
                    _context.Users.Add(user);
                    await _context.SaveChangesAsync();
 
                    await Authenticate(user); // аутентификация
 
                    return RedirectToAction("Index", "Home");
                }
                else
                    ModelState.AddModelError("", "Некорректные логин и(или) пароль");
            }
            return View(model);
        }
 
        [HttpGet]
        public IActionResult Login()
        {
            return View();
        }
 
        [HttpPost]
        [ValidateAntiForgeryToken]
        public async Task<IActionResult> Login(LoginModel model)
        {
            if (ModelState.IsValid)
            {
                User user = await _context.Users
                    .Include(u => u.Role)
                    .FirstOrDefaultAsync(u => u.Email == model.Email && u.Password == model.Password);
                if (user != null)
                {
                    await Authenticate(user); // аутентификация
 
                    return RedirectToAction("Results", "Home");
                }
                ModelState.AddModelError("", "Некорректные логин и(или) пароль");
            }
            return View(model);
        }
        private async Task Authenticate(User user)
        {
            // создаем один claim
            var claims = new List<Claim>
            {
                new Claim(ClaimsIdentity.DefaultNameClaimType, user.Email),
                new Claim(ClaimsIdentity.DefaultRoleClaimType, user.Role?.Name)
            };
            // создаем объект ClaimsIdentity
            ClaimsIdentity id = new ClaimsIdentity(claims, "ApplicationCookie", ClaimsIdentity.DefaultNameClaimType,
                ClaimsIdentity.DefaultRoleClaimType);
            // установка аутентификационных куки
            await HttpContext.Authentication.SignInAsync("Cookies", new ClaimsPrincipal(id));
        }
 
        [HttpPost]
        [ValidateAntiForgeryToken]
        public async Task<IActionResult> Logout()
        {
            await HttpContext.Authentication.SignOutAsync("Cookies");
            return RedirectToAction("Login", "Account");
        }
    }
}
Ну и View результата

C#
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
@model IEnumerable<GameWebService.Models.Result>
@{
    ViewData["Title"] = "Список результатов";
}
<!DOCTYPE html>
<html>
<head>
    <title>Результаты</title>
</head>
<body>
    <h3>Результаты</h3>
    <table>
        <tr>
            <td>Логин юзера</td>
            <td>Очки</td>
            <td>Время прохождения</td>
            <td></td>
        </tr>
        @foreach (var result in Model)
            {
            <tr>
                <td>@result.UserId</td>
                <td>@result.Score</td>
                <td>@result.Time</td>
            </tr>
        }
    </table>
</body>
</html>
Помогите понять, как реализовать такую операцию?
Ответ: Ага, понял, спасибо.

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

Доброго всем дня!
При выборке данных из Бд :
Код vb.net
1
2
3
4
5
6
7
8
9
10
11
12
    Dim Connect1 As New OleDb.OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & Path)
        Dim SQL1 As New OleDb.OleDbCommand("SELECT count (*) from Test ", Connect1)
        Dim SQL2 As New OleDb.OleDbCommand("SELECT id_num from Test ", Connect1)
        Dim SQL3 As New OleDb.OleDbCommand("SELECT e_num from Test ", Connect1)
        Connect1.Open()
        kol = SQL1.ExecuteScalar()
        id_num = SQL2.ExecuteScalar()
        e_num = SQL3.ExecuteScalar()
        Connect1.Close()
        Label1.Text = kol
        TextBox2.Text = id_num
        TextBox3.Text = e_num
конструкция работает только в том случае если в нужных полях имеются данные, еже ли поле пустое то возникает
ошибка:" Conversion from type 'DBNull' to type 'String' is not valid".
Как правильно организовать проверку ( ошибка возникает при прохождении строки 8).
Ответ:
Сообщение от Памирыч
А зачем мне функционал получения первой ячейки, если данные там то есть, то их нет.
Вариантов множество:
1)у Вас база комп. техники - Вы по номеру открываете формуляр и там поле-дата списания компа- но комп еще не списан,а поле присутствует и оно пустое и будет заполнено в будущем
2)Вам надо срочно внести много информации и там есть информация которая, если Вы ее не внесете сегодня, не повлияет на конечный результат (Вам сегодня нужно допустим только к-во в отчете), а в будущем можно спокойно заполнить остальную информацию.
Вопрос: JQuery, Ajax. Выборка данных из базы

Доброго времени суток! В другой теме столкнулась с проблемой которую не могу решить..()
Ситуация следующая.. нужно реализовать выборку данных из базы путем jQurt и Ajax так как выборка данных должна происходить без перезагрузки страницу браузера.
Есть вертикальный список, по элементам которого пользователь кликает, и по полученному ид элемента данные записываются в базу в таблицу rows_table, далее происходит выборка данных в виде таблицы. Данные таблицы должны меняться сразу же после клика пользователя, без перезагрузки страницы.
vertical.php - содержит список по которому кликает пользователь
PHPHTML
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
<html><head>
    <script src="//ajax.googleapis.com/ajax/libs/jquery/3.1.0/jquery.min.js"></script>
</head><body>
<div>    
    <ul class='navbar'>
        <li id='1' class='cont'><a href="#">1link</a></li>
        <li id='2' class='cont'><a href="#">2link</a></li>
        <li id='3' class='cont'><a href="#">3link</a></li>
        <li id='4' class='cont'><a href="#">4link</a></li>
    </ul>
</div>
</body>
</html>
<script type="text/javascript">
    $('ul.navbar li').on("click", function(e){
        e.preventDefault();
        var list_id = $(this).attr('id');
        $.ajax({
            type: 'post',
            url: 'vert_processing.php',
            data:{ list_id: list_id }
        }).done(function(data){
            $(".container").html('');
            $(".container").html(data);
        });  });
</script>
vert_processing.php - по полученному ид элем-та данные добавляются в базу, и я так понимаю что здесь же нужно делать ajax для выборки данных из базы
PHPHTML
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
if(isset($_POST['list_id'])){
$addrow =$_POST['list_id'];
        $query = ("INSERT INTO rows_table(type__id)VALUES('" . $addrow . "')");
        $result = mysqli_query($link, $query) or die("Error " . mysqli_error($link));
 
        if($result) { return 'added';} //если данные записаны положительно, для чего он нужен не поняла и куда его ставить
}
<script type="text/javascript">
        function show()
        {       $.ajax({
                type: 'post',
                url: 'list.php',
                cache: false
            }).done(function (response) {   console.log(response);  });
        }
</script>
list.php - запрос на выборку данных из базы в виде таблицы
PHPHTML
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<table>  <?php
      $query = ("SELECT * FROM rows_table ");
      $result = mysqli_query($link, $query) or die("Error " . mysqli_error($link));
 
      while ($row = mysqli_fetch_array($result)) {
            $query = ("SELECT * FROM type_table WHERE type_id=" . $row['type_id']);
            $result2 = mysqli_query($link, $query) or die("Error " . mysqli_error($link));
            $rows = mysqli_fetch_array($result2);
            echo "<tbody><tr>
            <td>" . $rows['code'] . "</td> 
            <td>" . $rows['kw'] . "</td>
            <td>" . $rows['a'] . "</td>
            <td>" . $rows['price'] . "</td> 
            </tr></tbody>";
       }  ?>
 </table>
Данные в базу добавляются и выводятся из базы так как нужно, единственное , что данные в таблице обновляются только после перезагрузки страницы, следовательно мой ajax (в vert_processing.php) на выборку не работает.
Помогите разобраться в чем проблема?? Заранее большое спасибо.
Ответ: Vas-e-na,
Сообщение от Vas-e-na
покажите тело запрос/ответа XHR
Это?
Вопрос: Вопрос по выборке данных из БД

Добрый день!

Столкнулся с проблемой выборки данных из БД при использовании запроса с русскими буквами.

есть БД test в кодировке utf8_general_ci
в ней таблица так же в кодировке utf8_general_ci

в таблице 2 столбца eng и rus в которых данные
eng rus
GGGG ГГГГГ
GGGG ГГГГ

и есть php код

PHP:

  1.  
  2. <?PHP
  3. $dbname = 'test';
  4. $link = ('localhost', 'root', 'password');
  5. ($dbname,$link);
  6.  
  7. if (!$link) {
  8.     echo 'Ошибка подключения к mysql';
  9. ;
  10.         }
  11.                
  12. $sql = "SELECT count(*) from `test` WHERE `eng` like 'ГГ%'";
  13. $res = ($sql) or (());
  14. $row = ($res);
  15. $k_el = $row[0];
  16. echo $k_el;
  17.  
  18. ?>
  19.  


При использовании sql запроса
SELECT count(*) from `test` WHERE `eng` like 'ГГ%'

Выдает: 0
При использовании запроса
SELECT count(*) from `test` WHERE `eng` like 'GG%'
Выдает 2, как и положено.

Т.е. не идет выборка по русским буквам из БД.

Если делать базу и таблицы в cp_1251_general_ci
то выдает ошибку
Illegal mix of collations (cp1251_general_ci,IMPLICIT) and (latin1_swedish_ci,COERCIBLE) for operation 'like'

Проблема в кодировке, но как это исправить ?

(Отредактировано автором: 29 Апреля, 2016 - 13:32:02)

Ответ:
Не понял про сортировку ?
Нужно в sql запросе производить конвертацию в cp1251 ??
Вопрос: Выборка данных из бд

Как сделать выборку данных например по имени? Допустим в БД есть несколько имён Ivan. Как сделать выборку значений по этому имени?
Ответ:
Код SQL
1
SELECT * FROM `table` WHERE name = "Ivan"
Вопрос: Как пишутся функции на выборку данных, если неизвестно будет параметр или нет?

Здравствуйте.
Подскажите как правильно писать функцию в которой будет происходить запрос в базу данных на выборку данных, где пользователь может указать один параметр, а может 2.
К примеру человек хочет получить данные за определенный месяц и год.
Но он может запросить данные только за определенный год.
Или за определенные месяца всех доступных годов.

К примеру функция

PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
function SqlAllViem($data){
        global $dbh;
        global $all_salary;
        $stmt = $dbh->prepare("SELECT * FROM salary WHERE salary_month =:salary_month, salary_year=:salary_year");
        $sqldata = [
                        ':salary_month' => $data['salary_month'],
                        ':salary_year' => $data['salary_year'],
                   ];
        $stmt->execute($sqldata);
        $all_salary = $stmt->fetchAll(PDO::FETCH_ASSOC);
 
        return $all_salary;
    }
Как вы понимаете любой из этих 2 параметров может быть указан или нет.
$data['salary_month']
$data['salary_year']


Вот как правильно обыгрывать такие ситуации ?
Ответ:
Сообщение от Jodah
PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
$sqldata = [];
$where = [];
if(!empty($data['salary_month']))
{
    $sqldata[':salary_month'] = $data['salary_month'];
    $where[] = 'salary_month =:salary_month';
}
if(!empty($data['salary_year']))
{
    $sqldata[':salary_year'] = $data['salary_year'];
    $where[] = 'salary_year=:salary_year';
}
$sql = '"SELECT * FROM salary WHERE ' . implode(' AND ', $where);
Остановился на этом варианте, но не могу добиться работы.
В PDO передаю параметр строку sql в которой содержится \
SELECT * FROM salary WHERE salary_status = 1 AND salary_date_year=:salary_date_year AND salary_date_month=:salary_date_month
Но запрос не отрабатывает.

Та же сама строка в phpmyadmin отрабатывает.
Код ни на что не ругается, кроме просмотрf массива который должен был прийти после SELECT

Как передается строка в пдо,
что тока не пробовал, даже формировать запрос внутри $stmt = $dbh->prepare("Здесь");

Добавлено через 5 минут
Все вопрос снят. Решил. Просто я невнимательный человек.
И решил что спросить проще чем все перепроверить в 117 раз.
Вопрос: ВЫборка данных их бд при нажатии на кнопку

Здравствуйте ребята. Видел на форуме статью, в которой описывалось следующее:

При нажатии на кнопку, происходила выборка данных с определенной сортировкой данных.

К примеру есть столбец type в нем содержатся следующее данные:
Кепка
Костюм,
Толстовки,
Куртки.

И при нажатии на кнопку нам будет выводиться из столбца type к примеру только Толстовки.

Не подскажите, где можно найти эту статью?
Ответ: Что значит правильно? По обеим ссылкам выше можно посмотреть примеры запроса. Используйте условие после слова WHERE.

Добавлено через 3 минуты
SQL
1
... WHERE `type`='Куртки'
Но повторяю, в таблице товаров такого столбца с подобными значениями быть не должно.
Вопрос: Создать форму выборки данных по определенным параметрам

Не знаю как создать форму выборки данных по определенным параметрам , а не всех данные в таблице.
Подскажите как с этим быть.
Ответ:
Сообщение от Baha97
Подскажите как с этим быть.
создать форму
HTML5
1
2
3
4
5
6
7
8
<form method="post" action="search.php" >
<select name='search'>
<option value="">Выбрать...</option>
<option value="Женский">Женский</option>
<option value="Мужской">Мужской</option> 
</select>
<input type='submit' name='searc_bottom' value='Поиск'>
</form>
файл поиска search.php

PHP
1
2
3
4
5
if (isset($_POST['search_bottom'])) {
            $sex = $_POST['search'];
            $sql = mysqli_query($db, "SELECT * FROM `table_name`WHERE sex='".$sex."'");
            // ну и тут дальше вывод
        }
Вопрос: Динамическая выборка данных

Всем привет, делаю динамическую выборку данных из бд, чтобы не создавать дубли и выводить данные в форму, но это не хочет работать.
делаю в файле подгрузки следующий кейс
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
case "get_cons_param":
        $dr = $_POST['dr'];
        $ndoc = $_POST['ndoc'];
        $ndoc = preg_replace("/\s{2,}/"," ",$ndoc);
        $ndocreg = "#^[\а-яА-ЯёЁйЙ ()]+$#";
        if(!preg_match($ndocreg, $ndoc))
            {throw new DataNotValidException('ФИО должно быть заполнено только русскими буквами.');}
        $split = explode(" (", $ndoc);
        $split = explode(" ", $split[0], 3);
        $fam = nvl($split[0]);
        $im = nvl($split[1]);
        $ot = nvl($split[2]);     
        $fam = pcase(trim($fam));
        $im = pcase(trim($im));
        $ot = pcase(trim($ot));
        $uid = intval(FirebirdBase::sql_value("SELECT uid FROM pat WHERE fam = $fam and im = $im and ot = $ot and dr = $dr"));
        
        $pat = new Pat($uid);
        $pat_dop = new DPLK($uid);
        
        $result[0]['fam'] = iconv('cp1251','utf-8',$pat->FAM);
        $result[0]['im'] = iconv('cp1251','utf-8',$pat->IM);
        $result[0]['ot'] = iconv('cp1251','utf-8',$pat->OT);
        $result[0]['sex'] = iconv('cp1251','utf-8',$pat->SEX);
        $result[0]['tawn'] = iconv('cp1251','utf-8',$pat->TAWN);
        $result[0]['street'] = $pat->STREET;
        $result[0]['house'] = $pat->HOUSE;
        $result[0]['flat'] = iconv('cp1251','utf-8',$pat->FLAT);
        $result[0]['dr'] = sql2d($pat->DR);
        $result[0]['msr'] = iconv('cp1251','utf-8',$pat_dop->MSR);
        $result[0]['d_prop'] = sql2d($pat_dop->CCD_DVP_PR);
        $result[0]['s_doc'] = iconv('cp1251','utf-8',$pat->S_DOC);
        $result[0]['n_doc'] = iconv('cp1251','utf-8',$pat->N_DOC);
        $result[0]['datv'] = sql2d($patient->CCD_DVP);
        $result[0]['kemv'] = iconv('cp1251','utf-8',$pat->CCD_KVP);
        $result[0]['pension'] = iconv('cp1251','utf-8',$pat->SNILS);
        $result[0]['mr'] = iconv('cp1251','utf-8',$pat->MR);
        $result[0]['mtel'] = iconv('cp1251','utf-8',$pat->TEL);
        $result[0]['rtel'] = iconv('cp1251','utf-8',$pat->CCD_PHONEPR);
    break;
а вот сам скрипт вывода
Javascript
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
$('#dr').on('change', function(){
    var ndoc = $('#ndoc').val();
    var dr = $('#dr').val();
    $.ajax({
        type: "POST",
        url: "cons_params.php",
        dataType: "json",
        data: "query=get_cons_param&ndoc="+ndoc+"&dr="+dr,
        error: function(){
            alert("При выполнении запроса произошла ошибка3");
        },
        success: function (data){
                $('#sex').val(data[0].sex);
                $('#s_doc').val(data[0].s_doc);
                $('#n_doc').val(data[0].n_doc);
                $('#kvpasp').val(data[0].kvpasp);
                $('#dvpasp').val(data[0].dvpasp);
                $('#tawn').val(data[0].tawn);
                $('#street').val(data[0].street);
                $('#house').val(data[0].house);
                $('#flat').val(data[0].flat);
                $('#snils').val(data[0].snils);
                $('#mr').val(data[0].mr);
                $('#mtel').val(data[0].mtel);
                $('#rtel').val(data[0].rtel);
                $('#msr').val(data[0].msr);
                $('#dprop').val(data[0].dprop);
            }   
    });
   
})
Не доходит до вывода, пишет ошибку, что я указал
Ответ: Не знаю, как запросить в гугле, но
Javascript
1
2
var ndoc = $('#ndoc').val();
    var dr = $('#dr').val();
Таким способом можно с элементов брать стринговые значения и даты?

Добавлено через 1 час 46 минут
немного помудрил и выполнил
Вопрос: Выборка данных из связанных таблиц

Всем привет! Столкнулся с проблемой выборки данных из связанных таблиц.Есть БД Access, читаю с помощью OLEDB.
Есть 2 таблицы:
1 таблица:
Предмет+поток
Number
Predmet (внешний ключ для таблицы Предметы)

2 таблица:
Предметы
Number
ShortPredmet

Мне необходимо считать поле ShortPredmet в 1 таблицу по полю Predmet
Вот собственно SQL запрос
Код SQL
1
SELECT [Предметы].ShortPredmet FROM [Предметы], [Предмет+поток] WHERE [Предмет+поток].Predmet = [Предметы].NUMBER
Однако он считывает ShortPredmet не в порядке следования значений Predmet.
Т.е. в первой записи в Предмет+поток Predmet=7. Мне нужно считать значение ShortPredmet, где Number=7, а считывается ShortPredmet, где Number=0
Что может быть не так? Уже битый час ломаю голову, объясните пожалуйста.
Если не понятно, то могу скинуть проект
Ответ:
Сообщение от мфт
в первой записи в Предмет+поток Predmet=7. Мне нужно считать значение ShortPredmet, где Number=7, а считывается ShortPredmet, где Number=0
То есть записи выдаются не в том порядке, в котором они находятся в первой таблице?
Это нормально, результат запроса — неупорядоченное множество. Если вам нужен определенный порядок, то используйте ORDER BY по необходимой колонке.