Сделать так, чтобы пользователь мог видеть только загруженные документы - PullRequest
0 голосов
/ 15 мая 2019

Добрый день всем,

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

idUsers int(11) PRIMARY KEY NOT NULL,  
uidUsers TINYTEXT NOT NULL,  
emailUsers TINYTEXT NOT NULL,  
pwdUsers LONGTEXT NOT NULL,

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

id int(11) PRIMARY KEY NOT NULL, 
usersId int(11) NOT NULL, - (Foreign key for idUsers in  users table)
name varchar(255) NOT NULL,
title varchar(255) NOT NULL,
forfatter varchar(255) NOT NULL, (forfatter = author) 
size int(11), 
download int(11) (for later use)

Таким образом, когда конкретный пользователь входит в систему и загружает документ, «id» пользователя (первичный ключ в таблице users) передается в «usersId» в моей таблице файлов.

Пока все это работает отлично.

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

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

Я попробовал предложение, которое я видел, где я пытался заставить мой mysqli_query выглядеть следующим образом:

"
SELECT * 
  FROM files 
 WHERE id 
   AND usersId name LIKE '%$searchingq%' 
    OR title LIKE '%$searchingq%' 
    OR forfatter LIKE '%$searchingq%' 
   AND usersId='.$usersId.'"

Это не сработало. Такое ощущение, что сеансы не находят идентификатор текущего $ _SESSION.

Мой поиск .php выглядит так:

    $usersId = $_SESSION['userId'];

    $output = '';

    if (isset($_GET['search']) && $_GET['search'] !== ' ') {
        $searchingq = $_GET['search'];

        $q = mysqli_query($conn, "SELECT * FROM files WHERE `usersId` = {$usersId} AND (`name` LIKE '%{$searchingq}%' OR `title` LIKE '%{$searchingq}%' OR `forfatter` LIKE '%{$searchingq}% )"); 

        $c = mysqli_num_rows($q);

        if($c == 0) {
            $output = '<p>No search results for: "' .$searchingq. '"</p>';
        } else {


            while($row = mysqli_fetch_array($q)) {
                $name = $row['name'];
                $title = $row['title'];
                $forfatter = $row['forfatter'];
                $download = $row['downloads'];

                $output .= 

Помощь очень ценится!

Ответы [ 2 ]

0 голосов
/ 15 мая 2019

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

Базовый запрос будет выглядеть так:

Предполагается, что вы ищете файлы для пользователя 99.

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

SELECT * FROM files
WHERE `usersId` = 99

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

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

SELECT * FROM files
WHERE `usersId` = 99
AND (`name` LIKE '%foo%'
    OR `title` LIKE '%foo%'
    OR `forfatter` LIKE '%foo%' )

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

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

(для краткости был удален некоторый код)

$usersId = $_SESSION['userId']; // the user id of the logged in user.
// code removed
$searchingq = $_GET['search']; // the search string
$q = mysqli_query($conn, "
SELECT * FROM files
WHERE `usersId` = {$usersId}
AND (`name` LIKE '%{$searchingq}%'
    OR `title` LIKE '%{$searchingq}%'
    OR `forfatter` LIKE '%{$searchingq}% )";

while($row = mysqli_fetch_array($q)) {

    // Do output here

}

Ниже описано, как это сделать с помощью подготовленных операторов.,Вы можете узнать больше о подготовленных заявлениях здесь: https://www.php.net/manual/en/mysqli.quickstart.prepared-statements.php

$stmt = $mysqli_prepare($conn, "
    SELECT * FROM files
      WHERE `usersId` = ?
      AND (`name` LIKE '%?%'
        OR `title` LIKE '%?%'
        OR `forfatter` LIKE '%?% )");
 // Replace the ?'s with the actual values.
 mysqli_stmt_bind_param($stmt, "isss", $usersId, $searchingq, $searchingq, $searchingq);

 mysqli_stmt_execute($stmt);
 $result = mysqli_stmt_get_result($stmt);
 while ($row = mysqli_fetch_assoc($result)) {
     // output goes here
 }
0 голосов
/ 15 мая 2019

Возможно, вы можете попробовать добавить AND usersId=".$userId в конец вашего запроса.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...