我一直在寻找解决 PHP 表单导致 MySQL 数据库中出现空白行的问题(我的搜索查询是“表单提交空白行到 mysql 数据库”,这里是 SO)。我发现我遇到了问题,尽管我构建了一个合适的“post/redirect/get”模式;
PHP Form Page (input.php) --->
PHP Form Processing Page (backend.php) --->
Database Entry Results Display page (thanks.php - return link to index.php set also)
空白行提交的问题让我很困惑,因为我试图向表单添加验证以便没有空提交,无论页面是否重新加载(通过后退按钮或其他方式)并执行标准 isset()
检查。
PHP 表单 (input.php)
<form name="input" action="backend.php" method="post">
<font color="#0000CC" face="arial black">Article/News Title:</font><br>
<input type="text" name="Title" size="35" />
<br><br>
<font color="#0000CC" face="arial black">Article/News URL:</font><br>
<input type="text" name="Link" value="http://" size="40" />
<br><br>
<font color="#0000CC" face="arial black">Article/News description</font> <font size="4" color="#0000CC">(300 Characters Max)</font><br>
<TABLE style="BORDER-RIGHT: #000000 1px ; BORDER-TOP: #000000 1px ; BORDER-LEFT: #000000 1px ; WIDTH: 100px; BORDER-BOTTOM: #000000 1px ; BORDER-COLLAPSE: separate; BACKGROUND-COLOR: #ffffff" cellSpacing=0 cellPadding=0 border=0 alignment="">
<TBODY>
<TR>
<TD style="BORDER-RIGHT: #000000 1px solid; PADDING-RIGHT: 3px; BORDER-TOP: #000000 1px solid; PADDING-LEFT: 3px; PADDING-BOTTOM: 3px; BORDER-LEFT: #000000 1px solid; PADDING-TOP: 3px; BORDER-BOTTOM: #000000 1px solid">
<textarea id="bob" rows="8" name="Body" cols="60"></textarea>
<script language="JavaScript">
generate_wysiwyg("bob");
</script>
</TD></TR></TBODY></TABLE>
<br>
<font color="#0000CC" face="arial black">Article/News Category?</font><br>
<SELECT name="category">
<OPTION>games
<OPTION>hardware
<OPTION>humor
<OPTION>movies
<OPTION>music
<OPTION>online
<OPTION>politics
<OPTION>programming
<OPTION>radio
<OPTION>science
<OPTION>social
<OPTION>software
<OPTION>sports
<OPTION>technology
<OPTION>television
</SELECT>
<br><br>
<input type="submit" name="submit" value="Input"></form>
PHP 表单处理 (backend.php)
// Connect to database
$con=mysql_connect("localhost","db_user","pwd") or die(mysql_error("Cannot Connect To Database"));
mysql_select_db('db_name', $con) or die(mysql_error("Cannot Select Database"));
if (isset($_POST['submit'])) {
// Define query variables
$ArticleTitle = mysql_real_escape_string(strip_tags($_POST['Title']));
$ArticleBody = mysql_real_escape_string(stripslashes($_POST['Body']));
$ArticleLink = mysql_real_escape_string(strip_tags($_POST['Link'],'<a>'));
$ArticleCategory = mysql_real_escape_string($_POST['category']);
// Sets the timestamp format
$Datum = date('D - M. j - g:ia');
}
//CHECK FOR EMPTY FIELDS
if (empty($_POST["Title"]) or empty($_POST["Body"]) or empty($_POST["Links"]) or empty($_POST["category"])) {
$error ='';
if (trim($_POST['Title'])==''){
$error .= "<li>Please enter a title</li>";
} elseif (trim($_POST['Body'])==''){
$error .= "<li>Please enter some content</li>";
} elseif (trim($_POST['Link'])==''){
$error .= "<li>Please enter a URL</li>";
} elseif (trim($_POST['category'])==''){
$error .= "<li>Please enter a category</li>";
} else {
//IF NO ERRORS DO SQL QUERY
$query1=sprintf("INSERT INTO articles (title, link, body, date, category) VALUES ('%s', '%s', '%s', '%s', '%s')", $ArticleTitle, $ArticleLink, $ArticleBody, $Datum, $ArticleCategory);
// Execute the query or die and echo an error message
mysql_query($query1) or die("Unable to execute query:" . mysql_error());
if ($query1) {
include("thanks.php");
}
else {
header('Location: input.php');
}
}
}
mysql_close($con);
录入结果展示页面 (thanks.php)
echo "Your Article/News URL Has Been Posted - Thank You!";
echo "<br /><br /><b>";
echo $_POST['Title'];
echo "</b><br /><br /><b>";
echo $_POST['Body'];
echo "</b><br /><br /><b>";
echo $_POST['Link'];
echo "</b><br /><br /></b>";
echo $_POST['Date'];
echo "</b><br /><br /><b>";
echo $_POST['category'];
echo "</b><br /><br />";
echo "<a href='index.php'><font face='arial black' size='2' color='#0000CD'><u>Return To Articles</u></font></a>";
我对结束显示没有任何问题,而且这种 PRG 模式工作得非常好,除了在几分钟到几小时后出现的空白行添加。调试的时候,我有时会放过 24 小时,一切都很好。但是空白行会成倍增加(当我访问 PHPMyAdmin 时,所有这些都具有指定的 NULL
值)。我确信 backend.php 中的逻辑以某种奇怪的方式歪曲了。我已经将该页面重写了至少二十次(该页面的四个不同版本为我提供了我想要的数据库输出)。一定有什么东西是我遗漏的,但是在连续近三十天的“搜索和编码”之后,我还是没能弄清楚。
是的,我知道我正在处理弃用问题,但在我解决最后一个问题之前,我无法开始对我的应用程序进行完整的 PDO 重写,并且(相信我),它正在乞求它(笑!) .我认为值得一提的是,input.php 受 PDO 登录脚本保护,可防止随机站点访问者随意张贴。我认为我遇到的唯一两个问题是;
1) 在非记录状态下访问 input.php 会触发表单提交过程(或一些搜索机器人流量,就此而言),
或
2) 正确的编码/错误的放置
我所需要的只是一个指向我如何解决这个问题的指针。我感谢每一个回复。谢谢。
编辑
好吧,你知道吗,我注意到其他辅助页面包含类别及其子标题的信息(即 - 类别:编程/子标题:新/旧/最多/最少 - php 页面在特定的类别主题下——每个主题都有自己的文件夹来将这四个页面组合在一起),从来没有显示过 index.php 刚刚出错的问题,所以我可能只是通过破坏试图在首页上显示代码的想法来改变数据从数据库中出来的方式。这实际上会让我有自由去做一些 super 酷的事情,并包括一些我已经经过实战测试并且知道可以在战壕中工作的疯狂的小应用程序,因为,即使我是螺旋桨头和代码调整的我,我'我仍在努力提升自己谋生的能力,实际上继续吃掉这个我们称之为“Web 开发”的企业(笑!)
最佳答案
好吧,有关于您的整体数据库结构的建议,但是您的数据过滤清理 - 以及与插入数据相关的整体逻辑链 - 可以改进为真正有内容,前提是有内容。所以我会改变这个:
$ArticleTitle = mysql_real_escape_string(strip_tags($_POST['Title']));
$ArticleBody = mysql_real_escape_string(stripslashes($_POST['Body']));
$ArticleLink = mysql_real_escape_string(strip_tags($_POST['Link'],'<a>'));
$ArticleCategory = mysql_real_escape_string($_POST['category']);
对此:
// Let’s set all the variables to null to begin with.
$ArticleTitle = $ArticleBody = $ArticleLink = $ArticleCategory = null;
// Here is an array of variables from '$_POST' as the key with final variables as a value.
$post_variables = array('Title' => 'ArticleTitle', 'Body' => 'ArticleBody', 'Link' => 'ArticleLink', 'category' => 'ArticleCategory');
// Here is an array of items that are links, so they should be parsed differently.
$link_variables = array('Link');
// Roll through the '$post_variables'.
foreach ($post_variables as $post_key => $post_variable) {
// Check if the keys exist in $_POST.
if (array_key_exists($post_key, $_POST) && !empty(trim($_POST))) {
// Check if the key needs special handling in $link_variables.
if (in_array($post_key, $link_variables)) {
$$post_variable = mysql_real_escape_string(strip_tags($_POST[$post_variable]),'<a>');
}
// If it doesn't need special handling, set it as normal.
else {
$$post_variable = mysql_real_escape_string(strip_tags($_POST[$post_variable]));
}
}
}
这个新方法做了一些事情。首先,它将您的变量清理逻辑重构为数组,以避免重复代码。但更重要的是,它确保仅当内容确实存在而不是表单中提交的杂散空白时才设置您的值。如果发生这种情况,该变量将简单地显示为 null
,此时它可以原样插入到您的 MySQL 表中。
CHECK FOR EMPTY FIELDS
的逻辑也应该更改为这样的清理因素。我的意思是,我们已经检查了 $_POST
那么为什么还要检查一次呢?使用现在已知干净有效的数据。此外,我发现最好让 if
成为积极的结果,而让 else
成为后备。我的意思是,目标是没有错误,if
基本上是在确认数据验证链的积极条件,对吧?
// If the fields are not empty, insert it.
if (!empty($ArticleTitle) || !empty($ArticleBody) || !empty($ArticleLink) || !empty($ArticleCategory)) {
$query1 = sprintf("INSERT INTO articles (title, link, body, date, category) VALUES ('%s', '%s', '%s', '%s', '%s')", $ArticleTitle, $ArticleLink, $ArticleBody, $Datum, $ArticleCategory);
// Execute the query or die and echo an error message
mysql_query($query1) or die("Unable to execute query:" . mysql_error());
if ($query1) {
include("thanks.php");
}
else {
header('Location: input.php');
}
mysql_close($con);
}
else {
$error = '';
if (empty($ArticleTitle)) {
$error .= "<li>Please enter a title</li>";
}
elseif (empty($ArticleBody)) {
$error .= "<li>Please enter some content</li>";
}
elseif (empty($ArticleLink)) {
$error .= "<li>Please enter a URL</li>";
}
elseif (empty($ArticleCategory)){
$error .= "<li>Please enter a category</li>";
}
}
编辑 此外,在 backend.php
中添加一些关于 PHP 表单处理的总体建议。总的来说,它看起来很困惑。我的意思是,所有这些都有效,但它也会给你带来问题,对吧?好的,这是它应该是什么的基本流程:
- 清理数据。
- 如果根据您的标准清理数据后数据有效,则执行 MySQL 工作。
- 如果清理后数据无效,则生成错误消息。 3.
我知道这听起来很明显,但是当我看到您的代码在验证之前建立 MySQL 连接时,我想到的唯一问题是:为什么?为什么在不知道数据有效时打开连接?仅在知道需要时才设置 MySQL 连接。
关于PHP 表单成功发布到 MySQL 数据库,但添加了空白行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20668467/