Вставка в базу данных нескольких параметров из 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 СКРИПКА
Я создал JS СКРИПКА чтобы проверить эту часть формы. У вас есть идеи, как это исправить?
8 answers
Используйте свой скрипичный 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-скрипте используйте следующее:
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);
}
}
:)
Вам необходимо создать формы в этом формате
<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>
При отправке формы в этом формате вы получите Массив числовых ключей в $_POST['CertificateType']
в insert.php
array(
"0" => array(
"STCWCode" => "somevalue",
"CertNo" => "somevalue",
"PlaceofIssueCert" => "somevalue",
"FromCert" => "somevalue",
"ToCert" => "somevalue",
),
"1" => array(
"STCWCode" => "somevalue",
"CertNo" => "somevalue",
"PlaceofIssueCert" => "somevalue",
"FromCert" => "somevalue",
"ToCert" => "somevalue",
),
. . .
)
Здесь каждый индекс будет представлять одну строку.Это может быть восстановлено с помощью цикла foreach, как показано ниже:
Обновите свой php-код как
foreach($_POST['CertificateType'] as $val){
$CertificateType = $val;
$CertificateType = $val;
$STCWCode = $val['STCWCode'];
$CertNo = $val['CertNo'];
$FromCert = $val['FromCert'];
$ToCert = $val['ToCert'];
$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);
}
}
Видите, что я нашел:
Во-первых, замените
CertificateType[]
наCertificateType
в<select id='options' name="CertificateType[]" class="field-style div-format align-left">
Потому что этот выпадающий список не является множественным. Основываясь только на функциональностиonchange
, вы получаетеSTCWCode
,CertNo
,FromCert
&ToCert
значения, которые являются множественными (не раскрывающийся списокCertificateType
). Что вы можете сделать, так это: вы можете добавить одинhidden text
, а именноCertificateTypeHidden[]
, в который будет вставлено значение выпадающего спискаCertificateType
.Как я указал в Первом пункте.
CertificateType
не является множественным. Итак, он рассматривает только одно значение. Что вы можете сделать: Как я писал выше, вместоCertificateType
вы можете использоватьCertificateTypeHidden[]
, например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
.
Пройдите через это. Всего наилучшего.
Вы зацикливаетесь на $_POST['Тип сертификата'], который (с вашей конфигурацией) будет содержать только одно значение (без множественного выбора в поле выбора)
Вы используете весь неправильный цикл. Вместо этого вам нужно запустить цикл, например, STCWCode
переменная POST.
Но все же я бы посоветовал вам изменить код javascript и сделать имена ввода такими, как это row[0][STCWCode], row[0][CertNo]
и так далее, где row[0]
для первой строки и row[1]
будет для второй строки и так далее. Затем вы можете запустить цикл с $_POST['row']
Вам нужно создать скрытый ввод с выбранным значением для сертификата, раскрывающийся список предназначен только для создания новой строки, но вам нужно создать новый ввод с формой массива, возможно, изменить имя раскрывающегося списка, например, 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>
Я еще не все просмотрел, но все ваши поля ввода, похоже, имеют одно и то же имя в скрипке.
Первый ввод всех строк, по-видимому, "name="STCWCODE[]". Вы посмотрели на свой $_POST и убедились, что можете видеть весь свой ввод или есть только ввод из первой строки? Я думаю, что имена могут быть проблемой.
Вы пытаетесь вставить весь массив в один код. Сначала сосчитайте. А затем извлеките содержимое из массива и с помощью цикла 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
}
`