我正在尝试发布一个我知道有很多答案的问题。 但是,由于某种原因,我似乎无法点击其中的信息。我将在问题末尾发布我的消息来源。
问题是,我如何从URL中提取user_id
并mod_rewrite它显示用户名。
取而代之的是:
domain/user/index.php?user_id=1
我明白这个:
domain/username
我已经在我的 .htaccess 文件上根据我的需求自定义了其他 SO 答案:
<IfModule mod_rewrite.c>
Options +FollowSymlinks
RewriteEngine On
RewriteOptions MaxRedirects=1
RewriteCond %{REQUEST_FILENAME} -f [NC,OR]
RewriteCond %{REQUEST_FILENAME} -d [NC]
RewriteRule .* - [L]
RewriteRule ^user/([^/]+)$ index.php?user_id=$1
</IfModule>
我的用户页面顶部的if
语句如下所示:
if (isset($_GET['user_id']) || isset($_GET['username']) && queryUserId($user_id)) {
// Render Page Content
} else {
header('Location: sign_up.php');
}
我的queryUsername
函数如下所示:
function queryUsername($username) {
$conn = dbConnect('read');
$sql = "SELECT * FROM users WHERE user_id = '".$username."'";
$result = $conn->query($sql) or die(mysqli_error($conn));
$row = $result->fetch_assoc();
return $row['username'];
$username = $row['username'];
}
我已经成功地为用户实现了唯一的 URL,并且在将不同的user_id附加到我的 URL 时可以访问帐户配置文件,那么我缺少什么来将用户名写入 URL 而不是变量字符串和文件夹结构?
干杯!
其他 SO 问题:
直接将用户名添加到网址 PHP
从 PHP 中的 URL 获取用户名
使用 mod 重写使用用户名变量更改 URL
添加字节文章
初学者的 URL 重写
根据您的信息,此行是错误的:
RewriteRule ^user/([^/]+)$ index.php?user_id=$1
它至少应该是:
RewriteRule ^user/([^/]+)$ /user/index.php?user_id=$1 // for a url like domain/user/username
或使用您的描述:
RewriteRule ^([^/]+)$ /user/index.php?user_id=$1 // for a url like domain/username
此外,您没有在显示的代码中设置任何具有 username
名称的变量,因此无需检查$_GET['username']
。
你在 php 中的签入应如下所示:
if ( isset($_GET['user_id']) && queryUserId($_GET['user_id']) ) {
除此之外,您不应该使用已弃用的mysql_*
函数并使用预准备语句,因为您现在有一个 sql 注入问题。
另请注意,在彼此之后使用两个 return
语句仅返回第一个值。
编辑:用户ID和用户名之间似乎有一些混淆。如果 url 中的值是用户名,则最好在 .htaccess 文件和 php 中username
调用它,以避免与用户 ID 混淆:
RewriteRule ^([^/]+)$ /user/index.php?username=$1 // for a url like domain/username}
和
if ( isset($_GET['username']) && queryUserName($_GET['username']) ) {
在函数中(使用已弃用的函数只是为了说明...):
function queryUserName($username) {
$conn = dbConnect('read');
$sql = "SELECT * FROM users WHERE username = '".$username."'";
...
}