我正在使用PHP标头重定向将用户从account/?id=$id
重定向到user/$username
只要用户存在,成功就需要account/?id=1
到user/samuel
。现在,此页面user/samuel
非常空(404)。
如何使用user/samuel
手册之类的内容返回isset($_GET[])
中的用户数据?此外,当然还要添加MYSQL查询来检索具有从URL中提取的用户名的用户的数据,并从数据库表中获取他们的数据。我将把所有代码放在user/index.php
只要我能让account/?id=$id
从URL(参数)获取$id
并执行其他数据库操作,我认为也可以从URL获取$ username ..即使{{ 1}}可以做到,但我不想在网址中加入user/?username
..
有什么想法吗?
答案 0 :(得分:3)
这是一个相当广泛的主题,您需要做的是解析网址 - IE将其分成几部分,然后将网址与一组操作相匹配。这通常称为路由。
一个天真的实现将是:
$parts = explode($_SERVER['REQUEST_URI'], '/');
if ( $parts[-2] === 'user' && $parts[-1] ) {
$stmt = $pdo->prepare("SELECT * FROM 'users' WHERE username = ? OR id = ?");
$result = $stmt->execute(array($parts[-1], array($parts[-1]));
// ... do something if the user is found or not.
}
但如果网址包含查询参数(?foo=bar
)或哈希值(#foo
),则会失败。
相反,您可以使用parse_url
来确保只使用路径。
$path = parse_url($_SERVER['REQUEST_URI'], PHP_URL_PATH);
$parts = null;
// Match the url with a regular expression.
preg_match(/^\/user\/(\w*)$/, $path, $parts);
if ( count($parts) == 2 ) {
$stmt = $pdo->prepare("SELECT * FROM 'users' WHERE username = ? OR id = ?");
$result = $stmt->execute(array($parts[-1], array($parts[-1]));
// ... do something if the user is found or not.
}
但最后您可能需要考虑使用Silex,Slim等微框架或使用Routing component from Symfony2,以便您可以专注于构建应用程序而不是重新发明轮子
答案 1 :(得分:1)
如果您使用Url Rewriting(又名友好网址)
,可能会更好你可以看到这个链接回答了同样的问题,尽管你的情况有点不同。 Apache friendly urls
由于您无法将$ id转换为$ username(两者都是不同的值),我建议您将链接更改为' user / ID'而不是' user / USERNAME'。