Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/68.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在数据库中存储文章的最佳方法?(php和sql)_Php_Sql_Database_Insert_Article - Fatal编程技术网

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

在数据库中存储文章的最佳方法?(php和sql),php,sql,database,insert,article,Php,Sql,Database,Insert,Article,我想将文章存储在数据库中,但我似乎找不到多少关于最佳方法的信息,从我所读到的内容来看,大多数人似乎对如何有效地做到这一点存在分歧。很多人会提出一种方法,其他人会指出sql注入问题,而我似乎找不到多少关于这个主题的新内容 以下是一篇文章的html: <div id="main"> <article> <header> <h3> Title </h3>

我想将文章存储在数据库中,但我似乎找不到多少关于最佳方法的信息,从我所读到的内容来看,大多数人似乎对如何有效地做到这一点存在分歧。很多人会提出一种方法,其他人会指出sql注入问题,而我似乎找不到多少关于这个主题的新内容

以下是一篇文章的html:

    <div id="main">

        <article>

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

            <p> Article Text </p>

        </article>

    </div>

标题
2011-07-22 
文章文本


理想情况下,我想最好将构成每篇文章的html块存储到数据库中,但这似乎有很多问题,就像我说的,我找不到很多关于这个特定主题的帖子,作为php和数据库的新手,我想在继续之前获得一些关于这方面的最佳方法的信息。

将您的文章存储为文本:)只需首先通过此php函数来防止注入攻击:

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

将其存储在SQL数据库中是可以的,但是您可以而且必须防止代码中的SQL注入

也就是说,在将用户输入发送到数据库之前清除所有用户输入


我认为最好的方法是只存储纯文本,但通常情况下,当您想要使用额外的格式时,情况并非如此。您可以将html标记转换为BBCODE或类似的标记,这些标记可以防止sql注入,但是如果您转义html内容,它将与任何其他内容一样安全。因此,在数据库中输入的任何数据上使用mysql\u real\u escape\u字符串,都会很好


但是,最佳实践是将html代码与文章文本一起存储为html文件,用户请求数据时可以使用该文件,但在数据库中,您可以仅存储纯文本以用于索引和搜索目的。这非常理想,因为搜索时不需要html内容,而且如果内容是要存储在数据库中的纯文本,它还可以防止sql攻击。但是,当用户请求文件时,获取包含格式化文本的文章的html文件的内容并提供这些内容。

当我存储大量用户文本时,我只是将其作为基础64,然后在显示之前,确保通过htmlspecialchars运行它,这将阻止html工作,因此
htmlspecialchars(base64_decode($content))
可以很好地显示。
如果使用bbcode进行格式化,请确保在开始格式化bbcode之前运行
htmlspecialchars


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

使用lucene或sphinx,无论是从Zend_lucene还是通过solr。它们将加快文章的索引速度,你也可以对它们进行全文搜索。使用lucene或solar在这些情况下进行索引和搜索几乎是一个标准过程,可以让您扩展到数百万篇文章

sphinx是一个与mysql守护程序“并行”运行的守护程序

如果你想使用lucene,你可以试试zend_lucene或solr,这实际上是一个tomcat发行版,它有一个webapp,将lucene公开为web服务,因此你可以用标准方式访问它,而不依赖于语言


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

防止sql注入的最安全方法是使用prepared语句

$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


希望这能有所帮助!

我不明白为什么人们会说SQL注入问题。我认为使用param binding,这些类型的问题基本上已经过去了。我错了吗?我的建议是使用PDO=>。如果您想对数据库进行测试,这会更安全、更快,而且非常好。要进行测试,只需在内存模式下使用SQLite=>新PDO('sqlite::memory:')