PHP Sql添加新文章

时间:2012-06-22 23:46:39

标签: php sql

需要一些PHP和MySQL的帮助我找不到我错了..

尝试使用函数调用添加新的博客文章。我知道所有其他代码都是正确的,因为如果我手动将条目添加到数据库sql中,它会显示在博客上。在向数据库sql添加新条目时,它永远不会添加到数据库中..任何人都注意到有什么问题吗?

我有发布时间和日期的功能,它们都有效。如果我能弄清楚这部分,我也可以修复标签。如果有人想在txt文件中看到,请告诉我很难将直接代码发布到此处...

function eb_admin_newarticle()
{
    global $lang;
    $output="\t\t".ucwords($lang['new_article'])."\r\n";;
    //To add new article post
    if(!empty($_POST['text']))
    {
        foreach($_POST as $key=>$value)
            $_POST[$key]=str_replace("Acirc;","",$value);
        $sql="INSERT INTO eb_articles SET article_flag=".$_POST['sticky'].",article_date=\"".time()."\",author_id=\"".$_SESSION['user_id-'.$_SERVER['SERVER_NAME']]."\", article_title=\"".str_replace("\"",""",$_POST['title'])."\",article_body=\"".$_POST['text']."\",article_comments=".$_POST['comments'];
        mysql_query($sql);

        $article_id=mysql_insert_id();
        //input tags on article
        if(strlen($_POST['tags'])>1) {
            $tags=explode(",",$_POST['tags']);
            foreach($tags as $tag) {
                $sql="INSERT INTO eb_tags SET tag_name=\"".$tag."\"";
                mysql_query($sql);
                if(mysql_affected_rows()==1)
                    $tag_ids[]=mysql_insert_id();
                else
                    $tag_ids[]=mysql_result(mysql_query("SELECT tag_id FROM eb_tags WHERE tag_name=\"".$tag."\""),0);
            }
            foreach($tag_ids as $tag_id)
                mysql_query("INSERT INTO eb_tags_links SET tag_id=".$tag_id.",article_id=".$article_id);
        }

        header('Location: news.php?id='.$article_id);
    }
    else {
        $output.="\t\t<form action=\"admin.php?id=newarticle\" method=\"post\">\r\n";
        $output.="\t\t\t<p><b>".ucwords($lang['title'])."</b><br /><input class=\"inputtext\" type=\"text\" name=\"title\" /></p>\r\n";
        $output.="\t\t\t<textarea id=\"text\" name=\"text\"></textarea>\r\n";
        $output.="\t\t\t<p><b>".ucwords($lang['tags'])."</b><br />".$lang['tag_seperate']."<br /><input type=\"text\" class=\"inputtext\" name=\"tags\" /></p>\r\n";
        $output.="\t\t\t<p><b>".ucwords($lang['sticky'])."</b><br /><input type=\"radio\" name=\"sticky\" value=\"1\" checked=\"checked\" /> ".ucwords($lang['no'])."<br /><input type=\"radio\" name=\"sticky\" value=\"2\" /> ".ucwords($lang['yes'])."</p>\r\n";
        $output.="\t\t\t<p><b>".ucwords($lang['comments'])."</b><br /><input type=\"radio\" name=\"comments\" value=\"0\" /> ".ucwords($lang['no'])."<br /><input type=\"radio\" name=\"comments\" value=\"1\" checked=\"checked\" /> ".ucwords($lang['yes'])."</p>\r\n";
        $output.="\t\t\t<p><input type=\"submit\" name=\"submit\" value=\"".ucwords($lang['save'])."\" /></p>\r\n";
        $output.="\t\t</form>\r\n";
        return $output;
    }
}

1 个答案:

答案 0 :(得分:2)

首先要做的事情

  • 您的代码容易受到SQL注入攻击。
    恶意用户可以轻易地清除整个表格。
  • 您还应始终在标题重定向后使用exit;
    当您发送header时,该页面仍将继续执行。此外,它只是对浏览器的建议。恶意用户无论如何都可以让他的浏览器忽略标题并加载页面。
  • 您正在进行大量不必要的查询。
    将标记添加到数据库后,您将获得另一个查询的标记ID。标签ID已在mysql_insert_id()中。无需查询数据库 如果要向数据库添加10篇文章,则需要进行10次查询。这完全没必要。请参阅MySQL手册,了解如何使用一个查询执行此操作。
  • 您甚至不应该使用mysql_*
    它已被弃用且风格不好!去找mysqli或PDO的教程,不要转发2008年的文章!

关于实际问题,请亲自尝试一些调试。您没有检查您的查询是否成功。执行查询时,mysql_query()会在失败时返回资源或FALSE。检查是否发生这种情况,以便找出错误发生的确切位置。

可能导致这种情况的一件事是你缺乏封装。例如,您需要替换

$sql="INSERT INTO eb_articles SET article_flag=".$_POST['sticky'].", ...

$sql="INSERT INTO eb_articles SET article_flag='".$_POST['sticky']."', ...

这适用于所有地方,始终使用'封装内容。这应该解决手头的问题,但你的应用仍然非常脆弱。