在数据库中存储文章的最佳方法? (php和sql)

时间:2011-07-23 01:47:23

标签: php sql database insert article

我想将文章存储在数据库中,但我似乎无法找到关于最佳方法的大量信息,从我所看到的内容看来,似乎大多数人都在如何有效地做到这一点。很多人会建议一种方式,其他人会指出sql注入问题,我似乎无法找到相当新的主题。

以下是文章的html:

    <div id="main">

        <article>

            <header>
                <h3> Title </h3>
                <time pubdate="pubdate"> 2011-07-22 </time>
            </header>

            <p> Article Text </p>

        </article>

    </div>

理想情况下,我认为最好将构成每篇文章的html块存储到数据库中,但似乎存在很多问题,就像我说的那样,我找不到很多关于这个特定主题的帖子,作为一个刚接触php和数据库的人,我希望在继续之前获得一些关于最佳方法的输入。

6 个答案:

答案 0 :(得分:2)

当我存储大量用户文本时,我只需要它64位,然后在显示它之前,确保通过htmlspecialchars运行它,这将使html无法正常工作,因此htmlspecialchars(base64_decode($content))可以正常工作显示。
如果您使用bbcode进行格式化,请确保在开始格式化bbcode之前运行htmlspecialchars

这不是唯一的方法,你可以在没有base64'ng的情况下清理输入,但我认为没有理由不这样做,特别是当没有人需要直接看到数据库时。

答案 1 :(得分:1)

将它存储在SQL数据库中很好,但您可以并且必须防止代码中的SQL注入。

即,在将所有用户输入发送到数据库之前清除所有用户输入。

PHP Manual on SQL injection

答案 2 :(得分:1)

我认为最好的方法是只存储纯文本,但通常情况并非如此,当您想要使用额外的格式时。您可以将html标签转换为bbcodes或类似的标签,这可以阻止sql注入,但是如果你转义html内容,它将像任何其他内容一样安全。对你放入数据库的任何数据都做mysql_real_escape_string也没关系。

但是,最佳做法是将html代码与文章文本一起存储为html文件,您可以在用户请求数据时提供该文件,但在数据库中,您只需存储纯文本以进行索引和搜索。这是理想的,因为你不需要html内容进行搜索,如果内容纯粹是要存储在数据库中的文本,它也会阻止sql攻击。但是,当用户请求文件获取该文章的html文件的内容时,该文件包含格式化文本并提供该文件。

答案 3 :(得分:1)

使用lucene或sphinx,来自Zend_Lucene或通过solr。他们会更快地为文章编制索引,你也可以对它们进行全文搜索。在这些情况下使用lucene或solar来索引和搜索几乎是一个标准程序,并且可以让你扩展到数百万篇文章。

sphinx是一个与mysql守护进程“并行”运行的守护进程。使用sphinx,你可以使用pecl sphinx扩展。

如果您想使用lucene,您可以尝试使用zend_lucene或solr,这实际上是一个带有webapp的tomcat发行版,它将lucene作为Web服务公开,因此您可以以标准方式访问它,与语言无关。

选择其中任何一个都可以。您可以按全文(内容),类别或任何需要索引的内容进行索引。

答案 4 :(得分:1)

这里防止sql注入最安全的方法是使用预处理语句。

$stmt = $con->prepare("INSERT INTO Articles (Title, Date, Article) VALUES (?, ?, ?)");
$stmt->bind_param("sss", $title, $currentDate, $articleBody);

问号代表您将传递的值。 “sss”表示3个变量中的每一个都是一个字符串,然后你可以调用这个预准备语句并传递正确的值。

$title = $_POST[title];
$currentDate = date("Y-m-d H:i:s");
$articleBody = $_POST[article];
$stmt->execute();

这将确保不会将恶意sql注入您的数据库。

希望这有帮助!

答案 5 :(得分:0)

将您的文章存储为TEXT :)首先通过此php函数传递它以防止注入攻击:

// Prevent MySQL Injection Attacks
function cleanQuery($string){
    if(get_magic_quotes_gpc())  // prevents duplicate backslashes
        $string = stripslashes($string);
    return mysql_escape_string($string);
}