我有一个很大的形式。
此表单包含一些可由用户复制的输入。
因此,他们可以选择例如有多少索赔人为一首歌而工作并为每个索赔人输入一些字段,限制为10个索赔人。
表单看起来像这样(我现在只显示3个)
echo "<form action=\"\" id=\"submForm\" name=\"submForm\" method=\"get\">";
//1 CLAIMANT
echo "<p><span class=\"labelInput\">".(_t('_cR_name_mandatory'))." </span><input id=\"nameClaimant\" name=\"nameClaimant[]\" value=\"\" type=\"text\" class=\"required commonInput\"></p>";
echo "<p><span class=\"labelInput\">".(_t('_cR_DOB_mandatory'))." </span><input id=\"DOBClaimant\" name=\"DOBClaimant[]\" value=\"\" type=\"text\" class=\"required littleInput\"></p>";
echo "<p><span class=\"labelInput\">".(_t('_cR_company'))." </span><input id=\"companyClaimant\" name=\"companyClaimant[]\" value=\"\" type=\"text\" class=\"commonInput\"></p>";
//2 CLAIMANT
echo "<p><span class=\"labelInput\">".(_t('_cR_name_mandatory'))." </span><input id=\"nameClaimant\" name=\"nameClaimant[]\" value=\"\" type=\"text\" class=\"required commonInput\"></p>";
echo "<p><span class=\"labelInput\">".(_t('_cR_DOB_mandatory'))." </span><input id=\"DOBClaimant\" name=\"DOBClaimant[]\" value=\"\" type=\"text\" class=\"required littleInput\"></p>";
echo "<p><span class=\"labelInput\">".(_t('_cR_company'))." </span><input id=\"companyClaimant\" name=\"companyClaimant[]\" value=\"\" type=\"text\" class=\"commonInput\"></p>";
//3 CLAIMANT
echo "<p><span class=\"labelInput\">".(_t('_cR_name_mandatory'))." </span><input id=\"nameClaimant\" name=\"nameClaimant[]\" value=\"\" type=\"text\" class=\"required commonInput\"></p>";
echo "<p><span class=\"labelInput\">".(_t('_cR_DOB_mandatory'))." </span><input id=\"DOBClaimant\" name=\"DOBClaimant[]\" value=\"\" type=\"text\" class=\"required littleInput\"></p>";
echo "<p><span class=\"labelInput\">".(_t('_cR_company'))." </span><input id=\"companyClaimant\" name=\"companyClaimant[]\" value=\"\" type=\"text\" class=\"commonInput\"></p>";
echo "<input type=\"submit\" class=\"submBttnClass\" id=\"buttSubm\" name=\"buttSubm\" value=\"".(_t('_cR_submit_button'))."\">";
echo "</form>";
当用户提交表单时,我使用jQuery序列化函数(我在jQuery 1.3.2上)
echo "<script type=\"text/javascript\">
$(document).ready(function() {
$('#submForm').validate({
submitHandler: function(form) {
var serialized = $('#submForm').serialize()
$.get('".$site['url']."modules/yobilab/copyright/classes/DO_submission.php', serialized);
//alert($('#submForm').serialize());
window.setTimeout('location.reload()', 8000);
return false;
form.submit();
}
})
问题是处理数据库中的Insert的文件使用了foreach(我将向您展示我的整个foreach以及使用serialize函数传递的所有输入:
if(!empty($_GET['nameClaimant'])){
$nameClaimant = $_GET['nameClaimant'];
$DOBClaimant = $_GET['DOBClaimant'];
$companyClaimant = mysql_real_escape_string($_GET['companyClaimant']);
$emailClaimant = $_GET['emailClaimant'];
$mainPhoneClaimant = $_GET['mainPhoneClaimant'];
$alternatePhoneClaimant = $_GET['alternatePhoneClaimant'];
$mobilePhoneClaimant = $_GET['mobilePhoneClaimant'];
$percentageClaimant = mysql_real_escape_string($_GET['percentageClaimant']);
$addressClaimant = mysql_real_escape_string($_GET['addressClaimant']);
$ZIPClaimant = $_GET['ZIPClaimant'];
$countryClaimant = $_GET['countryClaimant'];
foreach ($nameClaimant as $valueClaimant) {
$insClaim = "INSERT INTO cR_Claimants SET memberID ='".$memberID."', ParentSubmission='".$refNumb."', Name ='".mysql_real_escape_string($valueClaimant)."', DOB='".$DOBClaimant."', Company='".$companyClaimant."', Email='".$emailClaimant."', Address='".$addressClaimant."', ZIPcode ='".$ZIPClaimant."', Country='".$countryClaimant."', MainPhone='".$mainPhoneClaimant."', OtherPhone='".$alternatePhoneClaimant."', MobilePhone='".$mobilePhoneClaimant."', OwnershipPercentage='".$percentageClaimant."'";
$resultinsClaim=mysql_query($insClaim) or die("Error insert Claimants: ".mysql_error());
}
}
foreach在数据库中插入了错误的东西。它会显示Array
而不是正确的值。
我想在我的foreach中将数据插入到数据库中。
因此,Claimant1将插入其相关信息
对于Claimant2将插入其相关信息,依此类推。
它不起作用。我做错了什么?
我知道这有点无聊,但请帮助我!让我们玩吧。你们都很棒 谢谢
我已经附上数据库中的内容,以便您查看
您将看到它还在数据库中创建空字符串。
为什么这也是空值?
请帮帮我。
答案 0 :(得分:1)
这种情况发生在您使用数组样式name="key[]"
所以你不能放入SQL $key
,因为此时$key
是一个数组。
正确的INSERT语法是INSERT INTO table (cols) VALUES (values)
另外我认为你的表格会很糟糕。我建议你这样做:
CLAIMANT1
Email: <input name="claimant[0][email]" />
Name: <input name="claimant[0][name]" />
CLAIMANT2
Email: <input name="claimant[1][email]" />
Name: <input name="claimant[1][name]" />
这样您的所有代码都简化为:
foreach($_POST['caimant'] as $k=>$v) { //> PSEUDOCODE
INSERT INTO table VALUES ($v['email'],$v['name']);
}
答案 1 :(得分:0)
我怀疑你的插入语句不应该使用
mysql_real_escape_string($valueClaimant)
但
mysql_real_escape_string($nameClaimant)
代替。
答案 2 :(得分:0)
如同yes123所说,你有'name'字段指定为'DOBClaimant []'。
这是处理这样一个表单的方法,其中有多个具有相同名称的条目。这意味着它作为一个数组出现,这就是为什么你得到'数组'...当你尝试打印数组而不是使用数组的值时会发生什么。
在表单前尝试print_r($_GET)
。它将向您显示阵列的结构,然后您可以学习如何使用它。
你需要以不同的方式进行循环,可能使用for
循环而不是每个循环。
你可以做到
$total = count($_GET['DOBClaimant']);
它告诉你填写了多少表格。然后
for($i=0;$i<$total;$i++){
//do a for loop with $i, which we can use to refer to a place in each array
$nameClaimant = mysql_real_escape_string($_GET['nameClaimant'][$i]);
$DOBClaimant = mysql_real_escape_string($_GET['DOBClaimant'][$i]);
$companyClaimant = mysql_real_escape_string($_GET['companyClaimant'][$i]);
}
看看这是如何设置一个循环的,然后用[$ i]协议引用每个数组中的位置。
顺便说一句,你只需要mysql_real_escape_string一个或两个值 - 你需要将这个值放到一个SQL字符串中。