Есть некоторые проблемы с вашим кодом, которые мы должны рассмотреть:
Переменные связывания
Я просто выберу один из запросов SQL, но то же самое относится и к остальнымони:
$sql2 = "SELECT EmployeeID FROM employee WHERE Name Like '%$Name%' ";
// ...
$stmt2->bindValue(':Name', $Name);
Именованные заполнители должны иметь вид: :Name
, поэтому ваш запрос должен выглядеть следующим образом (подстановочный оператор делает его немного менее интуитивным):
$sql2 = "SELECT EmployeeID FROM employee WHERE Name Like CONCAT('%', :Name, '%')";
Не извлекается из операторов SELECT
$sql2 = "SELECT EmployeeID FROM employee WHERE Name Like LIKE CONCAT('%', :Name, '%')";
$stmt2->bindValue(':Name', $Name);
$result2 = $stmt2->execute();
Вы выполняете инструкцию, но нигде не используете результат в своем коде.Вместо этого вы должны извлечь одну строку и показать ее где-нибудь в вашей форме:
if ($stmt2->rowCount() > 0) {
$row= $stmt2->fetch(PDO::FETCH_ASSOC);
$employeeId= $row['EmployeeID'];
}
Использование значений NULL для значений по умолчанию
Также просто указать на один пример строки:
$DatePassed = !empty($_POST['DatePassed']) ? trim($_POST['DatePassed']) : null;
// ...
$sql = "INSERT INTO learning (CertificateID, EmployeeID, DatePassed, DateElapsed) VALUES (:CertificateID, :EmployeeID, :DatePassed, :DateElapsed)";
$stmt = $dbCon->prepare($sql);
$stmt->bindValue(':DatePassed', $DatePassed);
$result = $stmt->execute();
В случае, если ваша таблица базы данных «learning» позволяет вставлять в поля значения NULL, вы можете создать множество ошибочных строк, содержащих значения NULL в таких полях, как «CertificateID», «EmployeeID» и т. Д.Вместо этого я бы порекомендовал:
- Проверить поля на полноту на стороне клиента
- «Вернуть досрочно»: вместо попытки вставить запись, которая, скорее всего, потерпит неудачу, если обязательные поляотсутствуют, введите проверку поля также на стороне сервера.Что-то вроде:
if (empty($_POST['CertificateID'] || empty($_POST['EmployeeID']) || empty($_POST['DatePassed'])) {
print "Mandatory fields are missing. Please try again.";
} else {
// continue with inserting data.
}
Использование LIKE вместо проверки на равенство
Мне также интересно, зачем вам нужно использовать LIKE-предложение вместо проверки на равенство?Вместо того, чтобы пользователь вручную вводил имя сотрудника, создайте SELECT, содержащий имена сотрудников, и затем используйте WHERE Name = :Name
.Это намного удобнее для пользователя.
Обновление 1:
Ваша форма в настоящее время имеет избыточные - лучше сказать подверженные ошибкам - поля: идентификатор сертификата и имя / идентификатор сотрудника и имя.Если кто-то введет идентификатор сертификата, который не соответствует имени сертификата, в вашей базе данных будут неверные данные.Вместо этого, как говорилось в комментариях, вы будете использовать списки выбора.
Сначала загрузите необходимые данные для SELECT:
$sqlEmployees = "SELECT EmployeeID, Name FROM employee ORDER BY name";
$stmtEmployees = $dbCon->prepare($sql2);
$arrEmployees= array();
if ($stmtEmployees->execute()) {
$arrEmployees = $stmtEmployees->fetchAll(PDO::FETCH_ASSOC);
}
$sqlCertificates = "SELECT CertificateID, CertificateName FROM certificate ORDER BY CertificateName";
$stmtCertificates = $dbCon->prepare($sql2);
$arrCertificates= array();
if ($stmtCertificates->execute()) {
$arrCertificates = $stmtCertificates->fetchAll(PDO::FETCH_ASSOC);
}
Затем выведите значения как часть формы, избавляясь от лишних полей:
<form action="newlearn.php" method="post">
<label for="CertificateID">Certificate</label>
<select name="CertificateID" id="CertificateID">
<?php
for($i=0;$i<count($arrCertificates);$i++) {
$row= $arrCertificates[$i];
?>
<option value="<?= $row['CertificateID'] ?>"><?= $row['CertificateName'] ?></option>
<?php
}
?>
</select>
<label for="EmployeeID">Employee</label>
<select name="EmployeeID" id="EmployeeID">
<?php
for($i=0;$i<count($arrEmployees);$i++) {
$row= $arrEmployees[$i];
?>
<option value="<?= $row['EmployeeID'] ?>"><?= $row['Name'] ?></option>
<?php
}
?>
</select>
<label for="DatePassed">Date Passed</label><center>(Date in YYYY.MM.DD)</center>
<input type="text" id="DatePassed" name="DatePassed"><br>
<label for="DateElapsed">Date Elapsed</label><center>(Date in YYYY.MM.DD)</center>
<input type="text" id="DateElapsed" name="DateElapsed"><br>
<input type="submit" name="AddLearn" value="Add New Record"></button>
</form>