PHP SQL 添加新文章


PHP Sql Adding New Articles

需要一些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;
    }
}

首先要做的事

  • 您的代码容易受到 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']."', ...

这适用于任何地方,始终用'封装内容。这应该可以解决手头的问题,但是您的应用程序仍然非常脆弱。