使用户只能查看自己上传的文档

时间:2019-05-14 22:01:41

标签: php mysql mysqli

下午好,

我正在建立一个网站,以便用户可以注册和登录。之后,他们可以上载.pdf和.docx等文档并搜索这些文档。用户数据存储在我的用户表中,该表包含以下内容:

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

然后我有一个名为“ files”的表,我在其中存储了由用户上传的文件。该表包含以下内容:

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”(用户表中的主键)将传递到我的文件表中的“ 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的ID。

我的搜索.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 :(得分:0)

在执行这样的代码时,我想先运行查询本身,以使其正确无误。 这种类型的过滤应该很容易,因为您已经将每个文件都与一个用户关联了。

基本查询如下:

假设您正在寻找用户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
 }

答案 1 :(得分:-1)

也许您可以尝试在查询末尾添加AND usersId=".$userId