代码之家  ›  专栏  ›  技术社区  ›  Daniel Dimitrov

关于如何用PHP和Mysql构建wiki的好教程?[关闭]

  •  1
  • Daniel Dimitrov  · 技术社区  · 14 年前

    http://www.ibm.com/developerworks/opensource/tutorials/os-php-wiki1/ 但是它是基于cakePHP的,我需要花一个月的时间学习cakePHP来理解他们做了什么。

    提前感谢您的任何提示!

    1 回复  |  直到 11 年前
        1
  •  8
  •   stevendesu    14 年前

    假设你是为了教程而这么做的(因为已经有很多很棒的wiki软件在那里),让我们看看我是否能对这个主题有一个非常全面的概述。当然,我没有时间和空间来编写这个答案中的整个wiki,如果我这么做,你也不会学到任何东西。但是,我将尝试展示一般的框图,并给出一个数据库模式的示例。

    • 一页用于解析请求(找到他们请求的文章并将信息发送给他们)
    • 登录一页

    根据你想得到的简单或复杂程度,这是你只需要的三页。你的“主页”和任何其他重要页面(“联系我们”、“关于我们”、“如何使用这个wiki”等等)都可以是文章,因此它们的处理方式与解析请求的方式相同。有了功能性wiki之后,您可以考虑添加以下内容:

    • 修订跟踪(每个文章的更改日志)
    • header() )
    • 媒体查看器(就像在维基百科上,当你点击一个图片时,它会把你带到一个页面,里面有关于这个图片的信息,上传者,它有多大等等)

    因为我们还没有一个正常运行的wiki,所以这些需要额外的时间和精力来实现,所以让我们从基本的三个页面开始。每一个页面都应该有自己的框图,或者它们必须执行的功能的简单列表(具体的实现我将留给您来解决)

    对于项目分析脚本:

    • 首先要找到他们要找的文章。这可能涉及到在执行搜索之前解析他们的搜索字符串(将“尼罗河”转换为“尼罗河”),或者可能需要进行一些比较才能找到最相关的帖子(查看“尼罗河”并重定向到“尼罗河”)。维基的这一部分你可以无限改进,因为还没有人开发出“完美”的搜索算法。
    • 如果找不到文章,则需要有一些错误状态。或者列出一个建议文章的列表,继续在每篇文章的正文中而不是标题中查找它们的术语,或者只是道歉并要求它们再次搜索。一个好的wiki总是能让他们 创建文章
    • 如果能找到文章,它需要能够将文章的内容翻译成HTML。对于非常简单的文章,这可能只是使用的问题 htmlentities() & & 模板解析 preg_replace() 声明。
    • 最后,您需要考虑显示哪些页眉/侧边栏/页脚信息。如果他们登录,这些信息可能会有所不同,它可能包含到相关文章的链接,也可能有编辑这篇文章的链接。

    至于编辑文章,这个页面可能是最简单的。我会做如下事情:

    • 检查他们是否登录
    • <textarea> 它预先填充了原始文章sans解析

    至于登录页面,如果您曾经用多个用户编写过代码,那么您将了解这应该如何工作。

    • 检查是否 $_POST["username"] 已设置。如果是的话,他们已经发送了登录信息。如果没有,把登录表发给他们。(用户名、密码、提交)

    至于数据库的外观,您有一个几乎是必需的一个表(每个人都会将它放在数据库中,出于安全原因,没有人会将它信任于平面文件)。

    users
    -----
    id (int)
    username (string)
    hashed_password (string)
    extra info (email, website, last seen, preferences, etc.)
    

    包含任何登录用户的信息的表。至于文章本身,您可以选择将它们存储在数据库或文件中。MediaWiki将所有内容存储在MySQL中,但是DokuWiki使用TXT文件。这是一个偏爱的问题,但是还有一些其他的事情要考虑。

    • MySQL行有一个固定的大小。但这篇文章的最大字数仍然可以达到最大值,即167个字符。TXT文件可以任意增大( http://dev.mysql.com/doc/refman/4.1/en/storage-requirements.html )
    • 通过将其保存在数据库中,可以更容易地存储有关文章的元数据(在文章的内容旁边,有一个单独的列,分别用于“last edited”、“edited By”、“last searched”等。这种数据可以存储在TXT文件中,但这要困难得多,因为您需要为元数据考虑一个分隔符,并且必须在不损害文件其他内容的情况下编辑它。

    如果要将文章存储在数据库中,我建议使用类似于以下内容的设置:

    articles
    --------
    id (int)
    title (tinyblob)
    content (mediumblob)
    meta info
    

    当您添加特性时,您可能也开始需要这些特性的数据库表。例如,如果您要为每个图像创建一个媒体查看器页面(而不是让文章显示图像),则需要考虑以下几点:

    • 带有图像链接和有关图像的信息的数据库
    • 从模板中引用图像的方法

    为了让您思考可能包含的一些功能以及这些功能对数据库的影响,以下是MediaWiki的数据库:

    http://upload.wikimedia.org/wikipedia/commons/4/41/Mediawiki-database-schema.png