Вставить в базу данных несколько опций из HTML-формы через PHP
У меня есть раскрывающийся список, после выбора любого значения. Он добавляет новую строку с некоторыми полями, пример показан на рисунке ниже:
![раскрывающийся список]()
У меня есть insert.php для вставки значений в базу данных MySQL. Но есть проблема, что в базу данных вставляются только значения из первой строки.
PHP выглядит так:
foreach($_POST['CertificateType'] as $key => $val){
$CertificateType = $val;
$CertificateType = $_POST['CertificateType'][$key];
$STCWCode = $_POST['STCWCode'][$key];
$CertNo = $_POST['CertNo'][$key];
$FromCert = $_POST['FromCert'][$key];
$ToCert = $_POST['ToCert'][$key];
$CertificateType = mysqli_real_escape_string($link, $CertificateType);
$STCWCode = mysqli_real_escape_string($link, $STCWCode);
$CertNo = mysqli_real_escape_string($link, $CertNo);
$FromCert = mysqli_real_escape_string($link, $FromCert);
$ToCert = mysqli_real_escape_string($link, $ToCert);
$sql3 = "INSERT INTO Tbl (
CertificateType
,UserId
,STCWCode
,CertNo
,FromCert
,ToCert
,DateCreated
) VALUES (
'$CertificateType',
'$UserID',
'$STCWCode',
'$CertNo',
'$FromCert',
'$ToCert',
now())";
if(mysqli_query($link, $sql3)){
echo "Resume created successfully.";
} else{
echo "ERROR: Could not able to execute $sql. " . mysqli_error($link);
}
}
HTML выглядит так:
<fieldset class="fieldset-borders">
<legend>4. Licenses & Certificates</legend>
<ul class="header">
<li>
<select id='options' name="CertificateType[]" class="field-style div-format align-left">
<option selected disabled value="0">Select certificates</option>
<option value="1">One</option>
<option value="2">Two</option>
<option value="3">Three</option>
</select>
</li>
</ul>
<ul class="cert" id="cert">
<li>
<ul class="column">
<li><p class="test-label11">Name</p></li>
</ul>
</li>
<li>
<ul class="column">
<li><p class="test-label11">STCW Code</p></li>
</ul>
</li>
<li>
<ul class="column">
<li><p class="test-label11">Cert. No</p></li>
</ul>
</li>
<li>
<ul class="column">
<li><p class="test-label11">Place of Issue</p></li>
</ul>
</li>
<li>
<ul class="column">
<li><p class="test-label11">Date of Issue</p></li>
</ul>
</li>
<li>
<ul class="column">
<li><p class="test-label11">Date of Expire</p></li>
</ul>
</li>
</ul>
<div class="action2" ></div>
</fieldset>
Javascript, который вы можете проверить на JS FIDDLE
Я создал JS FIDDLE, чтобы проверить эту часть формы. У вас есть идеи, как это исправить?
Ответы
Ответ 1
Используйте скрипт JavaScript и добавьте тип сертификата в скрытое поле для каждой строки; и назовите его RowCertificateType так же, как и другие поля для строки;
<input type="hidden" name="RowCertificateType[]" value="" />
<!-- set value of this field same as you are showing in li as label for this row; -->
то в вашем php script используйте следующее:
foreach($_POST['RowCertificateType'] as $key=> $val){
$CertificateType = $val;
$STCWCode = $_POST['STCWCode'][$key];
$CertNo = $_POST['CertNo'][$key];
$FromCert = $_POST['FromCert'][$key];
$ToCert = $_POST['ToCert'][$key];
$CertificateType = mysqli_real_escape_string($link, $CertificateType);
$STCWCode = mysqli_real_escape_string($link, $STCWCode);
$CertNo = mysqli_real_escape_string($link, $CertNo);
$FromCert = mysqli_real_escape_string($link, $FromCert);
$ToCert = mysqli_real_escape_string($link, $ToCert);
$sql3 = "INSERT INTO Tbl (
CertificateType
,UserId
,STCWCode
,CertNo
,FromCert
,ToCert
,DateCreated
) VALUES (
'$CertificateType',
'$UserID',
'$STCWCode',
'$CertNo',
'$FromCert',
'$ToCert',
now())";
if(mysqli_query($link, $sql3)){
echo "Resume created successfully.";
}else{
echo "ERROR: Could not able to execute $sql. " . mysqli_error($link);
}
}
:)
Ответ 2
Вам необходимо создать формы с этим форматом
<form action="insert.php" method="post">
<ul>
<li>
<input name="CertificateType[0]" type="hidden">
<input name="CertificateType[0]['STCWCode']" type="text">
<input name="CertificateType[0]['CertNo']" type="text">
<input name="CertificateType[0]['PlaceofIssueCert']" type="text">
<input name="CertificateType[0]['FromCert']" type="date">
<input name="CertificateType[0]['ToCert']" type="date">
</li>
<li>
<input name="CertificateType[1]" type="hidden">
<input name="CertificateType[1]['STCWCode']" type="text">
<input name="CertificateType[1]['CertNo']" type="text">
<input name="CertificateType[1]['PlaceofIssueCert']" type="text">
<input name="CertificateType[1]['FromCert']" type="date">
<input name="CertificateType[1]['ToCert']" type="date">
</li>
...
</ul>
</form>
Ответ 3
Смотрите, что я нашел:
-
Сначала замените CertificateType[]
на CertificateType
в <select id='options' name="CertificateType[]" class="field-style div-format align-left">
Потому что это выпадающее меню не много. На основе функциональности onchange
вы получаете только значения STCWCode
, CertNo
, FromCert
и ToCert
, которые являются краткими (не CertificateType
).
Что вы можете сделать: вы можете добавить один hidden text
а именно CertificateTypeHidden[]
, в который будет вставлено значение CertificateType
.
-
Как я указал в Ist Point. CertificateType
не кратно. Таким образом, он учитывает только одно значение. Что вы можете сделать, так это: Как я написал выше, вместо CertificateType
вы можете использовать CertificateTypeHidden[]
Like foreach($_POST['CertificateTypeHidden'] as $key => $val){
.
После изменения код должен выглядеть так. (Если вы следуете выше)
<?php
foreach($_POST['CertificateTypeHidden'] as $key => $val){
$CertificateType = $_POST['CertificateTypeHidden'][$key];
$STCWCode = $_POST['STCWCode'][$key];
$CertNo = $_POST['CertNo'][$key];
$FromCert = $_POST['FromCert'][$key];
$ToCert = $_POST['ToCert'][$key];
.
.
.
}
?>
Для моей цели тестирования. Я удалил foreach($_POST['CertificateType'] as $key => $val){
с помощью foreach($_POST['STCWCode'] as $key => $val){
. Все приложенные несколько значений текстового поля поступают правильно.
<?php
foreach($_POST['STCWCode'] as $key => $val){
$CertificateType = $_POST['CertificateTypeHidden'][$key];
$STCWCode = $_POST['STCWCode'][$key];
$CertNo = $_POST['CertNo'][$key];
$FromCert = $_POST['FromCert'][$key];
$ToCert = $_POST['ToCert'][$key];
.
.
.
}
?>
Это единственная проблема. Все хорошо. Просто добавьте одно скрытое поле. (<input type='hidden' name='CertificateTypeHidden[]'>
). В котором значения выбранного выпадающего списка выходят и сидят в атрибуте value
этого скрытого поля. На странице отправки или странице insert.php выполните foreach
с помощью CertificateTypeHidden
.
Пройдите через него. Все лучшее.
Ответ 4
вы зацикливаете на $_POST ['CertificateType'], который (с вашей конфигурацией) будет содержать только одно значение (без выбора в поле выбора)
Ответ 5
Вы используете целую неправильную петлю. Вместо этого вам нужно запустить цикл, например, переменную STCWCode
POST.
Но я бы предложил вам изменить javascript-код и внести имена для ввода как-то как row[0][STCWCode], row[0][CertNo]
и так далее, где row[0]
для первой строки, а row[1]
будет для второй строки и так далее. Затем вы можете запустить цикл с помощью $_POST['row']
Ответ 6
Вам нужно создать скрытый ввод с выбранным значением для сертификата, выпадающий список предназначен только для создания новой строки, но вам нужно создать новый вход с формой Array, возможно, изменить имя выпадающего списка, например, CertificateType [] = > CertificateTypeList и новое скрытое имя ввода с помощью CertificateType []
UL не отправляет с формами только типы ввода.
<select id='options' name="CertificateList">
<option selected disabled value="0">Select certificates</option>
<option value="1">One</option>
<option value="2">Two</option>
<option value="3">Three</option>
</select>
Создайте тег формы только один раз и входы для каждого повторения
<form action="insert.php" method="post">
<ul>
<li>
<input name="CertificateType[]" type="hidden">
<input name="STCWCode[]" type="text">
<input name="CertNo[]" type="text">
<input name="PlaceofIssueCert[]" type="text">
<input name="FromCert[]" type="date">
<input name="ToCert[]" type="date">
</li>
<li>
<input name="CertificateType[]" type="hidden">
<input name="STCWCode[]" type="text">
<input name="CertNo[]" type="text">
<input name="PlaceofIssueCert[]" type="text">
<input name="FromCert[]" type="date">
<input name="ToCert[]" type="date">
</li>
...
</ul>
</form>
Ответ 7
Я еще не просмотрел все, но ваши поля ввода, похоже, имеют одно и то же имя в скрипке.
Первый вход всех строк выглядит "name=" STCWCode [] ". Вы посмотрели на свой $_POST и подтвердили, что можете видеть все свои данные или если есть только ввод из первой строки? Я думаю, что имена могут быть проблемой.
Ответ 8
вы пытаетесь вставить весь массив в один код. Сначала возьмите счет. А затем выберите содержимое из массива и с помощью цикла for вставьте его в базу данных
например, если мое имя для текстового поля cellname[]
то для вставки это должно быть сделано
$itemCount = count($_POST['cellname']);
$info=$_POST['cellname'];
for($i=0;$i<$itemCount;$i++) {
$query = "INSERT INTO item (item_name) VALUES('$info[$i]') ";
//rest of the queries
}
`