我怎么能用多个对象模仿Facebook网址?

时间:2012-02-05 00:50:13

标签: php database-design

我一直试图在我的网站上找到模仿Facebook网址的方法。 Facebook网址结构对于所有对象类型都是相同的,这里有一些网址及其来自Facebook的类型:

  1. 人 - https://facebook.com/personUsername/
  2. Page - https://facebook.com/page-identifier/
  3. App - https://facebook.com/app-identifier/
  4. 在搜索他们的api后,我发现每个对象都有type,例如一个人有type个“人”。

    我试图实现这个,而不只有一个包含所有对象和type列的表:

    我的网站上有5个对象有5个表。 tracksartistsusersalbumsclips

    这是我如何实现它。

    用户转到https://mysite.com/track-slug/ 我拿着slug并查询所有mysql表上的slug,直到我找到一个匹配。然后我渲染正确的视图。

    问题:是否有可能模仿Facebook网址而不只有一个mysql表或对mysql的每个请求进行多次查询?

2 个答案:

答案 0 :(得分:0)

这里有一个提示

htaccess的:

RewriteRule ^(.*)$ index.php/$1 [L]

PHP:

$uri = rawurldecode(trim(parse_url(getenv('REQUEST_URI'), PHP_URL_PATH), '/'));
$params = explode('/', $uri);
$params = explode('_', $params);
$controller = array_shift($params);
$method = array_shift($params);

现在转到

domain.com/track_slug

然后在你的index.php做

php > echo $controller

你应该得到track

php > echo $method

另外,您将获得slug

例如,

您对该信息的处理取决于您的控制器。让Track::slug()进行数据库提取和查询。

或者你可以为poing做更多的事情

domain.com/query/track/slug

$uri = rawurldecode(trim(parse_url(getenv('REQUEST_URI'), PHP_URL_PATH), '/'));
$params = explode('/', $uri);
$request = array_shift($params);
$controller = array_shift($params);
$method = array_shift($params);

然后您的请求将被查询,您的控制器将跟踪,您的方法将是slug。

现在您知道要查询数据库中slug的track对象。

答案 1 :(得分:0)

如果您的MySQL表具有相同的列,则可以执行以下UNION

SELECT * FROM
  (SELECT name, col1, col2 FROM table1
     UNION
   SELECT name, col1, col2 FROM table2
     UNION
   SELECT name, col1, col2 FROM table3
  ) AS t
WHERE t.name = 'abc'

示例结果:

+------+------+------+
| name | col1 | col2 |
+------+------+------+
| abc  |    1 |    2 |
+------+------+------+

如果您还需要知道每个项目的表名,可以在每个SELECT语句中添加另一列:

SELECT * FROM
  (SELECT name, col1, col2, 'table1' AS 'table' FROM table1
     UNION
   SELECT name, col1, col2, 'table2' AS 'table' FROM table2
     UNION
   SELECT name, col1, col2, 'table3' AS 'table' FROM table3
  ) AS t
WHERE t.name = 'abc'

示例结果:

+------+------+------+--------+
| name | col1 | col2 | table  |
+------+------+------+--------+
| abc  |    1 |    2 | table2 |
+------+------+------+--------+

即使表中有不同的列,也可以将这种技术用于相同的表(例如name,再加上例2中的表列),然后再进行第二次查询。其余的列,而不是每个表最多一个查询。