Как автоматически получать данные из текстового поля формы с помощью SQL-запросов - PullRequest
0 голосов
/ 11 июля 2019

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

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

таблица обучения использует только int и даты, я хочу, чтобы моя форма для изучения записей была более удобной для пользователя.

В настоящее время я работаю с этими элементами формы

certificateid
employeeid
datepassed
dateelapsed

Я хочу добавить certificatename / employeename, который будет в запросе с предложением LIKE. Я пробовал это, но не получил желаемых результатов, так как не могу получить поля формы для передачи результатов в запрос.

Пожалуйста, помогите или направьте меня в правильном направлении.

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

    <?php
    error_reporting(E_ALL);
    ini_set('display_errors', 1);
    // user always
    session_start();
    // Redirect if not logged in
    if (!isset($_SESSION['loggedin'])) {
        header('Location: index.html');
        exit();
    }
    //include Header & db Connection
    include ("templates/header.php");
    require ("connect-db.php");

    if(isset($_POST['AddLearn'])){

        //Retrieve the field values from our learning form.
        $CertificateID = !empty($_POST['CertificateID']) ? trim($_POST['CertificateID']) : null;
        $CertificateName = !empty($_POST['CertificateName']) ? trim($_POST['CertificateName']) : null;
        $EmployeeID = !empty($_POST['EmployeeID']) ? trim($_POST['EmployeeID']) : null;
        $Name = !empty($_POST['Name']) ? trim($_POST['Name']) : null;
        $DatePassed = !empty($_POST['DatePassed']) ? trim($_POST['DatePassed']) : null;
        $DateElapsed = !empty($_POST['DateElapsed']) ? trim($_POST['DateElapsed']) : null;

       $sql = "INSERT INTO learning (CertificateID, EmployeeID, DatePassed, DateElapsed) VALUES (:CertificateID, :EmployeeID, :DatePassed, :DateElapsed)";

       $sql2 = "SELECT EmployeeID FROM employee WHERE Name Like '%$Name%' ";

       $sql3 = "SELECT CertificateID FROM certificate WHERE CertificateName LIKE '%$CertificateName%' ";

            $stmt = $dbCon->prepare($sql);
            $stmt2 = $dbCon->prepare($sql2);
            $stmt3 = $dbCon->prepare($sql3);

           //Bind our variables.
            $stmt->bindValue(':CertificateID', $CertificateID);
            $stmt->bindValue(':EmployeeID', $EmployeeID);    
            $stmt->bindValue(':DatePassed', $DatePassed);
            $stmt->bindValue(':DateElapsed', $DateElapsed);

            //secondry binds for stmt2-3

            $stmt2->bindValue(':Name', $Name);

            $stmt3->bindValue(':CertificateName', $CertificateName);

            //Execute the statement
            $result = $stmt->execute();
            $result2 = $stmt2->execute();
            $result3 = $stmt3->execute();



        //If the process is successful.
        if($result){

          echo  'Record Added';
       }else
       {
           echo 'No record was added due to mistakes';
       }
    }

    ?>
    <!DOCTYPE html>
    <html>
        <head>
            <meta charset="UTF-8">
            <title>Add New Learning Record</title>
        </head>
        <body>
            <div class="adding">
            <h1>Add New learning Record</h1><br>
                 <form action="newlearn.php" method="post">

                <label for="CertificateID">Certificate ID</label>
                <input type="text" id="CertificateID" name="CertificateID"><br>

                <label for="CertificateName">Certificate Name</label>
                <input type="text" id="CertificateNameID" name="CertificateNameID"><br>

                <label for="EmployeeID">Employee ID</label>
                <input type="text" id="EmployeeID" name="EmployeeID"><br>

                <label for="Name">Name</label>
                <input type="text" id="NameID" name="NameID"><br>

                <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>
        </div>
    </html>

Я ожидаю, что идентификатор сотрудника и идентификатор сертификата будут сгенерированы с использованием предложения like путем извлечения данных из двух соответствующих таблиц.

Это моя форма. Я хочу иметь возможность ввести имя и имя сертификата, и он автоматически вводит идентификаторы

Код ошибки отображается на консоли

Код для формы

PHP-код для переменных

1 Ответ

1 голос
/ 11 июля 2019

Есть некоторые проблемы с вашим кодом, которые мы должны рассмотреть:

Переменные связывания

Я просто выберу один из запросов 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» и т. Д.Вместо этого я бы порекомендовал:

  1. Проверить поля на полноту на стороне клиента
  2. «Вернуть досрочно»: вместо попытки вставить запись, которая, скорее всего, потерпит неудачу, если обязательные поляотсутствуют, введите проверку поля также на стороне сервера.Что-то вроде:
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>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...