2011-09-20 119 views
0

所以我有一个看起来如此的表单。如何阻止PHP向MYSQL数据库添加空白行/字段

<form action="thanks.php" method="post" class="niceform" name="myform"> 
<table> 
<tr> 
<td><label for="company_name">Company Name</label></td> 
<td><input type="text" name="company" value="" size="38" /></td> 
</tr> 
// and so on 

我验证了javascript。但问题是,当我直接从localhost/mysite/form/thanks.php直接访问thanks.php时,我在查看phpmyadmin时插入了一个空行。 Thanks.php看起来像这样。

<?php 
// open the connection 
$conn = mysql_connect("localhost", "root", "password"); 
// pick the database to use 
mysql_select_db("company_register",$conn); 

$sql = "INSERT INTO `tblsignups` VALUES ('NULL', '$_POST[company]', '$_POST[email]', '$_POST[phone]', '$_POST[address]', '$_POST[comments]', '$_POST[contact_person]')"; 

$result = mysql_query($sql, $conn) or die(mysql_error()); 

mysql_close($conn); 
?> 
// And I have a thank you msg I display 

我如何检查,如果某些人应该直接去thanks.php我告诉他们先去填写表格,不要把任何数据库

+3

面点,你需要开始尝试将它们插入到数据库之前,您消毒POST变量。 –

+0

详细说明一下,你的数据库受到了所谓的“SQL注入”的限制。由于构建查询字符串的方式,有人可以很容易地擦除整个数据库。相反,请尝试使用准备好的声明:http://www.php.net/manual/en/class.mysqli-stmt.php –

+0

谢谢JonStirling。但更重要的是@SkyKelsey我很欣赏这个解释。我将搜索卫生Mysql/Php的最佳实践并相应地修改我的代码! – Anele

回答

1

这里是接收POST数据后的草图例如

你必须进行检查,并在情况下提高错误标志
的一些错误显示回来的形式而不是保存它

<? 
if ($_SERVER['REQUEST_METHOD']=='POST') { 

    $err = array(); 
    //performing all validations and raising corresponding errors 
    if (empty($_POST['name']) $err[] = "Username field is required"; 
    if (empty($_POST['text']) $err[] = "Comments field is required"; 

    if (!$err) { 
    // if no errors - saving data 
    // and then redirect: 
    header("Location: ".$_SERVER['PHP_SELF']); 
    exit; 
    } else { 
    // all field values should be escaped according to HTML standard 
    foreach ($_POST as $key => $val) { 
     $form[$key] = htmlspecialchars($val); 
    } 
} else { 
    $form['name'] = $form['comments'] = ''; 
} 
include 'form.tpl.php'; 
?> 

并修改您的表单,使其能够显示错误

<? if ($err): ?> 
    <? foreach($err as $e): ?> 
<div class="err"><?=$e?></div> 
    <? endforeach ?> 
<? endif ?> 
<form> 
    <input type="text" name="name" value="<?=$form['name']?>"> 
    <textarea name="comments"><?=$form['comments']?></textarea> 
    <input type="submit"> 
</form> 
2

您需要检查形式已提交。你可能想是这样的:

<?php 

if ($_POST) 
{ 
    // open the connection 
    $conn = mysql_connect("localhost", "root", "password"); 
    // pick the database to use 
    mysql_select_db("company_register",$conn); 

    $sql = "INSERT INTO `tblsignups` VALUES ('NULL', '$_POST[company]', '$_POST[email]', '$_POST[phone]', '$_POST[address]', '$_POST[comments]', '$_POST[contact_person]')"; 

    $result = mysql_query($sql, $conn) or die(mysql_error()); 

    mysql_close($conn); 
} 

?> 
0

您可以检查所有的

if(empty($_POST['company'])) 
{ 
//redirect or show error msg that its required 
} 
else 
{ 
//do what you want 
} 

,并相应地对所有。

如果您发布了表单$ _POST将始终为真,因此当您必须检查空值时,您必须像这样检查所有数据。

if(empty($_POST['company']) || empty($_POST['email']) || empty($_POST['user'])) 

等等。

-1

只需检查是否存在所有必需的表单域。如果它们不存在,请重定向到您的表单页面。

if(!array_key_exists("company", $_POST){ 
    header('Location: http://your.form.page.html'); 
} 
+0

真的吗?........ –

1

检查公司名称是否已在请求中提供且不为空。如果没有公司名称,可能会出现错误消息,将用户重定向到表单。

形式:

<form action="thanks.php" method="post" class="niceform" name="myform"> 
<?php if($_GET['error']): ?> 
<span class="error">Please fill the required fields!</span> 
<?php endif; ?> 
<table> 
<tr> 
<td><label for="company_name">Company Name</label></td> 
<td><input type="text" name="company" value="" size="38" /></td> 
</tr> 

Thanks.php:

<?php 
// Is company specified? 
if(!isset($_POST['company']) || $_POST['company'] == '') { 
    header('Location: form.php?error=1'); 
    exit(); 
} 

// open the connection 
$conn = mysql_connect("localhost", "root", "password"); 
// pick the database to use 
mysql_select_db("company_register",$conn); 

$sql = "INSERT INTO `tblsignups` VALUES ('NULL', '$_POST[company]', '$_POST[email]', '$_POST[phone]', '$_POST[address]', '$_POST[comments]', '$_POST[contact_person]')"; 

$result = mysql_query($sql, $conn) or die(mysql_error()); 

mysql_close($conn); 
?> 
1

检查是否有$ _ POST是不够的。在帖子后重定向 - 否则如果添加一行并刷新页面,则最终会在数据库中创建2条记录。所以发布到process.php,并从process.php重定向到thanks.php。此外,在PHP中验证,而不是在JavaScript中

0
if(count($_POST)>0){ 
    // your code... 
} 
else{ 
    // else code... 
} 
0

首先和最重要的是:不要在表格内使用表格。 (我很抱歉无法抗拒,但这伤害了我的眼睛)

关于主题:永远记得在你的前端和后端进行验证。

因此,在这种情况下,一些验证添加到您的PHP文件,如:

<?php 

if(empty($_POST['company'])) 
{ 
// show validation message 
} else { 

// open the connection 
$conn = mysql_connect("localhost", "root", "password"); 
// pick the database to use 
mysql_select_db("company_register",$conn); 

$sql = "INSERT INTO `tblsignups` VALUES ('NULL', '$_POST[company]', '$_POST[email]', '$_POST[phone]', '$_POST[address]', '$_POST[comments]', '$_POST[contact_person]')"; 

$result = mysql_query($sql, $conn) or die(mysql_error()); 

mysql_close($conn); 
} 
?> 
1

只需选中下面的代码

<?php 
// open the connection 
$conn = mysql_connect("localhost", "root", "password"); 
// pick the database to use 
mysql_select_db("company_register",$conn); 

if($_POST[company]!="" or $_POST[email]!="" or $_POST[phone]!="" or $_POST[address]!="") { 
    $sql = "INSERT INTO `tblsignups` VALUES ('NULL', '$_POST[company]', '$_POST[email]', '$_POST[phone]', '$_POST[address]', '$_POST[comments]', '$_POST[contact_person]')"; 
    $result = mysql_query($sql, $conn) or die(mysql_error()); 
} else { 
    echo "Please fill all fields "; 
} 

mysql_close($conn);