-1

Need help with some PHP and MySQL I cant find were I went wrong..

Trying to add new blog article using a function call. I know all other code is correct because if I manually add entry into database sql it shows on blog. When adding a new entry to database sql it never adds into the database.. Any one notice anything wrong?

I have functions for time and date of post and they all work. If I can figure out this part I can fix the tags too. If any one would like to see in a txt file just let me know its hard to post straight code to here...

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;
    }
}
4

1 回答 1

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']."', ...

这适用于任何地方,总是用'. 那应该可以解决手头的问题,但是您的应用程序仍然很容易受到攻击。

于 2012-06-23T00:01:30.190 回答