下午好,
我正在建立一个网站,以便用户可以注册和登录。之后,他们可以上载.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 .=
非常感谢您的帮助!
答案 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
。