php Foreach Loop проблема - PullRequest
       16

php Foreach Loop проблема

0 голосов
/ 04 июня 2011

У меня большая форма.

Эта форма содержит некоторые входные данные, которые могут дублироваться пользователем.

Таким образом, они могут выбрать, например, сколько Заявителей поработало над песней и ввести некоторые поля для КАЖДОГО заявителя с ограничением в 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();    
  } 
})

Проблема в том, что файл, который обрабатывает вставку в базу данных, использует foreach (я покажу вам весь мой foreach со всеми входными данными, которые передаются с помощью функции сериализации:

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.

Таким образом, для Заявителя 1 будет вставлена ​​его относительная информация

для Claimant2 будет вставлена ​​относительная информация и т. Д.

Это не работает. Что я делаю не так?

Я знаю, что это немного скучно, но, пожалуйста, помогите мне! Давай поиграем с этим. Вы все великолепны Спасибо

Я приложил, что делает в базе данных, чтобы вы видели

Вы увидите, что в базе данных также создаются пустые строки.

Почему это также принимает пустые значения?

Пожалуйста, помогите мне. database_issue

Ответы [ 3 ]

1 голос
/ 04 июня 2011

это происходит потому, что имя формы вы называете со стилем массива 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']);

}
0 голосов
/ 04 июня 2011

Как сказал 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] dealie.

Кстати, вы просто mysql_real_escape_string-ing одно или два значения - вы должны сделать это для КАЖДОГО значения, которое вы помещаете в строку SQL.

0 голосов
/ 04 июня 2011

Я подозреваю, что ваш оператор вставки не должен использовать

mysql_real_escape_string($valueClaimant)

но

mysql_real_escape_string($nameClaimant)

вместо.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...