我不断搜索修复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)
空白行提交的问题让我感到厌烦,因为我试图向表单添加验证,以便没有空提交,是否重新加载页面(通过后退按钮或其他方式)并执行标准{{1检查。
PHP表格(input.php)
isset()
PHP表单处理(backend.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>
输入结果显示页面(thanks.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);
我对结束显示没有任何问题,并且这个PRG模式运行得很好,除了空白行添加,几分钟到几个小时之后。在调试的时候,我会让24小时有时候去,一切都很好。但是当我访问PHPMyAdmin时,空白行将成倍增加(所有值都带有 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>";
个值)。我确信 backend.php 中的逻辑以某种奇怪的方式倾斜。我已经重写了该页面至少二十次(该页面的四个不同版本给了我所需的数据库输出)。必须有一些我缺少的东西,但经过将近三十天的直接“搜索和代码”,我无法将其排除在外。
是的,我知道我正在使用弃用,但是我无法在我的应用程序上开始完整的PDO重写,直到我可以将这个最后一个问题排序,并且(相信我),它是BEGGING它(哈哈!) 。我认为有必要提一下, input.php 受PDO登录脚本的保护,可防止随机网站访问者无所事事地发布。我能想到的唯一两个问题就是那个;
1)在非记录状态下访问 input.php 会使表单提交过程(或某些搜索站点流量)绊倒,
或
2)正确编码/错误放置
我需要的只是指向我如何解决这个问题的指针。我感谢任何回复。感谢。
修改
好的,你知道吗,我注意到其他辅助页面载有类别及其子标题的信息(即 - 类别:编程/子标题:新/旧/大多数/最少 - php页面在特定的类别主题下 - 每个人都有'自己的文件夹,以保持这四个页面组合在一起),从来没有表现出 index.php 刚出错的问题所以我可能只有通过诋毁尝试在首页上显示代码的想法来改变数据从数据库中传出的方式。这实际上给了我一些优点,可以做一些非常酷的事情,并且包含在一些疯狂的小应用程序中,我已经在战斗中测试并且知道在战壕中有效,因为,即使我是旋转式和代码调整,我也是我仍然试图提升自己的生活能力,并继续吃掉这个我们称之为“网络发展”的企业(哈哈!)
答案 0 :(得分:1)
嗯,对你的整体数据库结构有建议,但你的数据过滤清理 - 以及与所插入数据相关的整体逻辑链 - 如果只有内容的话,可以改进以真正拥有内容。所以我会改变这个:
$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连接时,我想到的唯一问题是:为什么?为什么在您不知道数据有效时打开连接?只有在知道需要时才设置MySQL连接。
答案 1 :(得分:0)
在找到答案的过程中,有两件事帮助了我;
A)将我的PHP处理页面转换为PDO;
<?php
if (isset($_POST['submit'])) {
$ArticleTitle = $ArticleLink = $ArticleBody = $ArticleCategory = $Datum = '';
// Define a boolean and set to true before validating
$formValid = true;
// Data pulled from input form
$ArticleTitle = $_POST['title'];
$ArticleLink = $_POST['link'];
$ArticleBody = $_POST['body'];
$ArticleCategory = $_POST['category'];
//Set date parameters
$Datum = date('D - M. j - g:ia');
if ($_SERVER['REQUEST_METHOD'] == "POST") {
if ($_POST['title'] == null OR trim($_POST['title']) ==''|| $_POST['link'] == null OR trim($_POST['link']) =='' || $_POST['body'] == null OR trim($_POST['body']) =='' || $_POST['category'] == null OR trim($_POST['category']) =='') {
echo '<br><br><div align="center"><a href="input.php"><font color="#0000CC" face="arial black">Please return to form and supply required data!</font></a><br><img src="http://www.promodrone.com/images/myimage.gif"></div>';
$formValid = false; // Invalid input - set the flag to false
exit;
} else {
if ($formValid){
//PDO connection string details
try {
$dsn = 'mysql:host=localhost;dbname=dbname';
$username ='user_name';
$password ='pwd';
$options = array(PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES utf8', PDO::ATTR_ERRMODE =>PDO::ERRMODE_EXCEPTION, PDO::ATTR_EMULATE_PREPARES, false);
$dbh = new PDO($dsn, $username, $password, $options);
} catch (Exception $e) {
echo "WTF?!" . $e->getMessage('Cannot connect: ' . mysql_error());
}
//Insert data into db
try {
$sth = $dbh->prepare('INSERT INTO articles(title, link, body, category, date) VALUES (?, ?, ?, ?, ?)');
$sth->execute(array($ArticleTitle, $ArticleLink, $ArticleBody, $ArticleCategory, $Datum));
//If successful redirect to display database insertion details
if($sth){
exit(include('thanks.php'));
}
else{
echo '<a href="input.php"><font color="#0000CC" face="arial black">No record added. Return to form, please!</font></a>';
}
} catch (Exception $e) {
echo "Glugh?!" . $e->getMessage('Cannot continue: <a href="input.php"><font color="#0000CC" face="arial black" size="3">Return to form, please!</font></a>' . mysql_error());
}
}
}
}
}
$dbh = NULL;
?>
和,B)你必须检查SUPER-THOROUGHLY,这样你就不会犯错误造成的错误。
在我的index.php页面上,我没有正确关闭表,并且不知何故,这有助于在数据库中插入额外的(空)行。我今天下午才被带到那里,之后我在另一个编码网站上旋转,我有一个帐户。出于某种原因,我被迫查看HTML表结构。在我意识到之后,我的额头仍然是核面部的痛苦;
echo "<p style='font-size:95%'><b>Category -</b><b>";
echo "</b></p></table></center><br>";
不会强>
echo "<p style='font-size:95%'><b>Category -</b><b>";
echo "</p></b></font></table></center><br>";
我不高兴的唯一一件事就是我不得不摧毁我漂亮的小“P / R / G”模式,因为我不能(无论我尝试过什么),从处理页面(backend.php)获取变量以从thanks.php页面回显。这样做的原因是当用户完成输入他们的文章/新闻URL的细节时,感谢php应该向他们提供他们的输入;
$ArticleTitle (Article/News title)
$ArticleLink (Article/News link)
$ArticleBody (Article/News content/image body)
$ArticleCategory (Article/News category)
完全以上述方式堆叠。从今天下午早些时候起,我演奏了完整的偏执狂(lol),因为我在前一天晚上跳过枪并过早地庆祝。自今天下午以来,我的解决方案一直适用于我,并且HTML表中的上述相同错误已复制到所有其他类别索引页面。通过我的IDE一次性更改它们后,我通过连续添加十个条目(大约三个小时前)严格测试,我甚至没有看到问题弹出。 :深叹:(哈哈!)希望这有助于某人。我不知道这是否甚至是偏离主题(我确信有人会让我知道),但是MySQL的时间已经结束了。我理解为什么许多人对PHP数据对象并不感兴趣,但经过七天的直播,它开始与我“交谈”。我 - 从来没有 - 回去......现在,重写应用程序的其余部分(哈哈!)。