需要一些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']."', ...
这适用于任何地方,始终用'
封装内容。这应该可以解决手头的问题,但是您的应用程序仍然非常脆弱。