2014-01-27 172 views
0

基本上,我有一个有5行的表单。插入多个记录并检查一行是否有记录

像这样:

<form action="process.php" method="post"> 
<p><label>Name</label> 
<input type="text" name="name[]" /> 
<label>email</label> 
<input type="text" name="email[]" /> 
</p> 
<p><label>Name</label> 
<input type="text" name="name[]" /> 
<label>email</label> 
<input type="text" name="email[]" /> 
</p> 
<p><label>Name</label> 
<input type="text" name="name[]" /> 
<label>email</label> 
<input type="text" name="email[]" /> 
</p> 
<p><label>Name</label> 
<input type="text" name="name[]" /> 
<label>email</label> 
<input type="text" name="email[]" /> 
</p> 
<p><label>Name</label> 
<input type="text" name="name[]" /> 
<label>email</label> 
<input type="text" name="email[]" /> 
</p> 
<input name="Submit" type="submit" /> 
</form> 

这是我process.php

<?php 
// connect to the database 
include('db.php'); 


$name = count($_POST['name']); 
$email = count($_POST['email']); 

if ($name > 0 && $name == $email) { 
    $insertArr = array(); 
    for ($i=0; $i<$name; $i++) { 
     $insertArr[] = "('" . $_POST['name'][$i] . "', '" . $_POST['email'][$i] . "')"; 
    } 
} 



$sql = "INSERT INTO comments(name, email) VALUES " . implode(',', $insertArr) ; 
$qry = $conn->prepare ($sql); 
$qry->execute($insertArr); 



echo("<pre>\n"); 
print_r($_POST); 
echo("</pre>\n"); 


?> 

但是,如果用户刚刚输入4记录的第5行没有价值,但他们被保存到数据库。我想检查用户是否有5个输入,如果不是,那么我必须忽略空值并只保存有输入的字段。有谁知道如何做到这一点?我很乐意感谢你的帮助。谢谢。

+0

In for在添加到$ insertArr []数组之前,循环检查$ _POST ['name'] [$ i]为null。 – prabu

+0

您应该查看准备好的语句。看起来你正在使用PDO?然后,您可以绑定值并在循环中执行它们,而不是构建插入字符串,这非常容易受到SQL注入的影响。 – NewInTheBusiness

回答

1

相反这两条线:

$name = count($_POST['name']); 
$email = count($_POST['email']); 

替换为:

$name=0;$email=0; 
foreach($_POST['name'] as $post_name) 
{ 
    ($post_name!=='')?$name++:''; //checks for empty values and increments accordingly 
} 

foreach($_POST['email'] as $post_email) 
{ 
    ($post_email!=='')?$email++:''; 
} 
echo 'name counted = '.$name.'<br>'; 
echo 'email counted = '.$email.'<br>'; 

另外,我加入此位代码:

if($_POST['name'][$i]!='' || $_POST['email'][$i]!='') //This checks if there is value in name or email of that index, if not it won't enter any blank. 
{ 
$insertArr[] = "('" . $_POST['name'][$i] . "', '" . $_POST['email'][$i] . "')"; 
} 
+0

这不考虑用户是否填写了相同数量的电子邮件/名称,但未使用相同的段落。最终可能会插入错误的组合。 – NewInTheBusiness

+0

@NewInTheBusiness:不会,但不会导致错误的组合,虽然它会在相邻的单元格中留下一个空白,但是这是假设OP要'至少要'输入'name'或'email'的事实数据库。 –

+0

没有看到你的最后一段代码,我的错误。是的,也许你是对的,他只想保存电子邮件,尽管他在这一点上有点模糊。 – NewInTheBusiness

0

你可以简单地array_filter上使用name数组删除所有空值。

$names = array_filter($_POST['name']); 
$emails = $_POST['email']; 

然后删除那些没有从两个阵列的相应匹配的人,所以你只能在输入电子邮件和名字时插入。

$nr = 0; 
    foreach ($emails as $e) { 
     if (!$names[$nr] || empty($emails[$nr)) unset($emails[$nr]); 
     $nr++; 
    } 

清理数组键

$names = array_values($names); 
$emails = array_values($emails); 
$i = 0; 
foreach ($names as $n) { 
    $insertArr[] = "('" . $n . "', '" . $emails[$i] . "')"; 
    $i++; 
} 
0

我看你想要什么来实现,但如果它总是会在未来5个帖子,你可以解决这个问题是这样的:

$name = $_POST['name0']; 
    $email = $_POST['email0']; 
    if ((!empty($name))&&(!empty($email))) { 
    $mysqli->query("YOUR_SQL_COMMAND"); 
    echo '<your text>'; 
    } 
    $name = $_POST['name1']; 
    $email = $_POST['email1']; 
    if ((!empty($name))&&(!empty($email))) { 
    $mysqli->query("YOUR_SQL_COMMAND"); 
    echo '<your text>'; 
    } // and so on 

并将HTML更改为以下内容:

<form action="process.php" method="post"> 
<p><label>Name</label> 
<input type="text" name="name0" /> 
<label>email</label> 
<input type="text" name="email0" /> 
</p> 
<p><label>Name</label> 
<input type="text" name="name1" /> 
<label>email</label> 
<input type="text" name="email1" /> 
</p> 
<p><label>Name</label> 
<input type="text" name="name2" /> 
<label>email</label> 
<input type="text" name="email2" /> 
</p> 
<p><label>Name</label> 
<input type="text" name="name3" /> 
<label>email</label> 
<input type="text" name="email3" /> 
</p> 
<p><label>Name</label> 
<input type="text" name="name4" /> 
<label>email</label> 
<input type="text" name="email4" /> 
</p> 
<input name="Submit" type="submit" /> 
</form> 
相关问题