-1

私が間違っていたので、私が見つけられないいくつかの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;
    }
}
4

1 に答える 1

2

まず最初に

  • コードはSQLインジェクションに対して脆弱です。
    悪意のあるユーザーがテーブル全体を簡単に消去する可能性があります。
  • exit;また、ヘッダーリダイレクトの後に常に使用する必要があります。
    を送信してもheader、ページは引き続き実行されます。その上、それはブラウザへの提案にすぎません。悪意のあるユーザーは、ブラウザにヘッダーを無視させ、とにかくページをロードさせる可能性があります。
  • あなたはたくさんの不必要なクエリをしている。
    データベースにタグを追加した後、別のクエリでタグIDを取得します。タグIDはすでににありmysql_insert_id()ます。データベースにクエリを実行する必要はありません。
    データベースに10個の記事を追加する場合は、10個のクエリを実行します。これは完全に不要です。1つのクエリを使用してこれを行う方法については、MySQLのマニュアルを参照してください。
  • あなたも使用するべきではありませんmysql_*
    それは非推奨で悪いスタイルです!またはPDOのチュートリアルを探しに行き、mysqli2008年の記事を中継しないでください!

実際の質問については、自分でデバッグしてみてください。クエリのいずれかが成功したかどうかを確認していません。クエリを実行するとmysql_query()、リソースまたはFALSE失敗時に戻ります。これが発生しているかどうかを確認して、エラーが発生している場所を正確に特定できるようにします。

これを引き起こしている可能性のあるものの1つは、カプセル化の欠如です。たとえば、交換する必要があります

$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 に答える