ТД contenteditable и обновление значения в базе данных - PullRequest
1 голос
/ 26 июня 2019

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

Каждые строки и тд имеют значение null в базе данных. Он будет иметь значение, когда пользователь будет что-то вводить, и будет сохранять / обновлять, когда кнопка сохранения будет нажата

мой php для tbody:

 <?php
$emp_name = $_SESSION["emp_name"];
$month = $_SESSION["month"];
$REMARKS = $_SESSION[""];
$date_now = date('m');
$current_day = date('d');
$sample_var=  $_SESSION["username"] ;

        try {
            $pdo = new PDO('mysql:host=localhost:3306;dbname=******;', '****', '*****' );
            $pdo->setAttribute( PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION );
            $stmt = $pdo->prepare(
                " SELECT * from tbl_assessment WHERE employeeName = '{$_SESSION['emp_name']}' "
        );
        $flag = $stmt->execute();
        if ( !$flag ) {
            $info = $stmt->errorInfo();
            exit( $info[2] );
        }
        while ( $row = $stmt->fetch( PDO::FETCH_ASSOC ) ) {

                @$tbody1 .='<tr>';
                    $tbody1 .=' <input type="hidden" id="id" value="'.$_SESSION['id'].'"/> ';
                    $tbody1 .=' <input type="hidden" id="emp_name" value="'.$_SESSION['emp_name'].'"/> ';
                    $tbody1 .=' <input type="hidden" id="teamCode" value="'.$_SESSION['teamCode'].'"/> ';
                    $tbody1 .=' <input type="hidden" id="sectionCode" value="'.$_SESSION['sectionCode'].'"/> ';


                    $tbody1 .='<td style="height:30px" contenteditable>'.$row["date"].'</td>';
                    $tbody1 .='<td style="height:30px" contenteditable>'.$row["staffName"].'</td>';
                    $tbody1 .='<td style="height:30px" contenteditable>'.$row["findings"].'</td>';
                    $tbody1 .='<td style="height:30px" contenteditable>'.$row["action"].'</td>';
                    $tbody1 .='<td style="height:30px" contenteditable>'.$row["date_accomplished"].'</td>';
                    $tbody1 .='<td><button class="btn btn-warning px-2" id="btnSaveFindings" style="color:black;font-weight:bold;" title="Save"><i class="fas fa-save" aria-hidden="true"></i></button><button class="btn btn-info px-2" id="btnEdit" style="color:black;font-weight:bold;" title="Edit"><i class="fas fa-edit" aria-hidden="true"></i></button></td>';


        @$tbody .='</tr>';
        }   
            }
        catch ( PDOException $e ) {
        echo $e->getMessage();
        $pdo = null;
        }   
?>

мой HTML для таблицы:

<div id="containerDiv" style="background-color:white;border-bottom:3px solid #ff6600;margin-left:50px;margin-right:50px;margin-bottom:140px;" class="animated fadeInUp">
    <div class=""  style="margin-left:15px;margin-right:15px;overflow-x:auto;" ><br>
        <button class="btn btn-default px-3" style="float:right;" id="btnAddRow" name="btnAddRow" title="Add New row"><i class="fas fa-plus" aria-hidden="true"></i></button>
        <table class="assessment" id="assessment" width="1526px" >
        <thead style="background:-moz-linear-gradient( white, gray);">
            <tr>    
                <th colspan="6" style="font-size:20px;">ASSESSMENT/FINDINGS:</th>
            </tr>
            <tr> <!---FIRST TABLE ROW--->
                <th>DATE</th>
                <th>NAME OF THE STAFF/S</th>
                <th>ASSESSMENT/FINDINGS</th>
                <th>ACTION TAKEN</th>
                <th>DATE ACCOMPLISHED</th>
                <th>ACTION</th>
            </tr>
            <tbody>
                <?php echo $tbody1; ?>
            </tbody>
        </thead>
    </table><br><br>
</div>

Какой будет функция btnSaveFindings для обновления значения td в базе данных?

1 Ответ

0 голосов
/ 02 июля 2019

Несколько замечаний,

  1. Ваш запрос не использует подготовленное утверждение - что очень просто с PDO;советуем вам использовать это!
  2. Ваш цикл может генерировать несколько элементов HTML с одним и тем же идентификатором - это нарушает уникальность идентификатора - если что-то может иметь одинаковый идентификатор, возможно, это будет класс.
  3. При печати больших блоков HTML часто лучше выйти из режима PHP, чтобы распечатать его там, где вам нужно.
  4. Чтобы обновить таблицу, используйте jQuery с AJAX - назначьте классы различным элементам <td>Таким образом, мы можем получить их с помощью jQuery, и когда вы нажмете кнопку, найдите ближайшие значения этой строки.Добавьте уникальный идентификатор строки к атрибуту data-* кнопки, чтобы мы знали, какую строку нужно обновить.
<?php
$emp_name = $_SESSION["emp_name"];
$month = $_SESSION["month"];
$REMARKS = $_SESSION[""];
$date_now = date('m');
$current_day = date('d');
$sample_var = $_SESSION["username"] ;

try {
    $pdo = new PDO('mysql:host=localhost:3306;dbname=******;charset=utf8mb4', '****', '*****' );
    $pdo->setAttribute( PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION );

    $stmt = $pdo->prepare("SELECT * FROM tbl_assessment WHERE employeeName = :employeeName");
    $stmt->execute(['employeeName' => $_SESSION['emp_name']]);
    ?>
    <script>
        $(".btnSaveFindings").on("click", function() {
            var id = $(this).data('assessment-id'),
                row = $(this).closest("tr"),
                date = $(row).find('.assessment-date')[0],
                staffname = $(row).find('.assessment-staffname')[0],
                findings = $(row).find('.assessment-findings')[0],
                action = $(row).find('.assessment-action')[0],
                accomplished = $(row).find('.assessment-date-accomplished')[0];

            $.ajax({
                type: "POST",
                url: "updateRow.php",
                data: {id: id,
                           date: date,
                       staffname: staffname,
                       findings: findings,
                       action: action,
                       accomplished: accomplished},
                success: function(data) {
                    var status = data.status,
                        message = data.message;

                   alert(message);
                }
            });
        });
    </script>

    <div id="containerDiv" style="background-color:white;border-bottom:3px solid #ff6600;margin-left:50px;margin-right:50px;margin-bottom:140px;" class="animated fadeInUp">
        <div class=""  style="margin-left:15px;margin-right:15px;overflow-x:auto;" ><br>
            <button class="btn btn-default px-3" style="float:right;" id="btnAddRow" name="btnAddRow" title="Add New row"><i class="fas fa-plus" aria-hidden="true"></i></button>
            <table class="assessment" id="assessment" width="1526px" >
                <thead style="background:-moz-linear-gradient( white, gray);">
                    <tr>    
                        <th colspan="6" style="font-size:20px;">ASSESSMENT/FINDINGS:</th>
                    </tr>
                    <tr> <!---FIRST TABLE ROW--->
                        <th>DATE</th>
                        <th>NAME OF THE STAFF/S</th>
                        <th>ASSESSMENT/FINDINGS</th>
                        <th>ACTION TAKEN</th>
                        <th>DATE ACCOMPLISHED</th>
                        <th>ACTION</th>
                    </tr>
                    <tbody>
                        <?php 
                        while ($row = $stmt->fetch()) { ?>
                            <tr>
                                <td style="height:30px" class="assessment-date" contenteditable><?php echo $row["date"] ?></td>
                                <td style="height:30px" class="assessment-staffname" contenteditable><?php echo $row["staffName"]; ?></td>
                                <td style="height:30px" class="assessment-findings" contenteditable><?php echo $row["findings"]; ?></td>
                                <td style="height:30px" class="assessment-action" contenteditable><?php echo $row["action"]; ?></td>
                                <td style="height:30px" class="assessment-date-accomplished" contenteditable><?php echo $row["date_accomplished"]; ?></td>
                                <td>
                                    <button class="btn btn-warning px-2 btnSaveFindings" style="color:black;font-weight:bold;" title="Save" data-assessment-id="<?php echo $row['id']; ?>">
                                        <i class="fas fa-save" aria-hidden="true"></i>
                                    </button>
                                    <button class="btn btn-info px-2 btnEdit" style="color:black;font-weight:bold;" title="Edit">
                                        <i class="fas fa-edit" aria-hidden="true"></i>
                                    </button>
                                </td>
                            </tr>
                            <?php 
                        }
                        ?>
                    </tbody>
                </thead>
            </table>
            <br />
            <br />
        </div>
    <?php 
} catch(PDOException $e) {
    error_log($e->getMessage());
    echo "An error occurred";
}

Затем необходимо создать файл updateRow.php, который выполняет запрос.

<?php
header('Content-Type: application/json');

$pdo = new PDO('mysql:host=localhost:3306;dbname=******;charset=utf8mb4', '****', '*****' );
$pdo->setAttribute( PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION );

// See that the POST is sent
if (empty($_POST)) {
    echo json_encode(['status' = false, 'message' => 'No data was sent. Update aborted']);
    exit;
}

try {
    $stmt = $pdo->prepare("UPDATE tbl_assessment 
                           SET date = :date,
                               staffName = :staffName,
                               findings = :findings,
                               action = :action,
                               date_accomplished = :date_accomplished 
                            WHERE id = :id");
    $stmt->execute(['date' => $_POST['date'],
                    'staffName' => $_POST['staffName'],
                    'findings ' => $_POST['findings'],
                    'action ' => $_POST['action'],
                    'date_accomplished ' => $_POST['date_accomplished'],
                    'id ' => $_POST['id']]);

    echo json_encode(['status' = true, 'message' => 'Update completed.']);
} catch (PDOException $e) {
    error_log($e->getMessage());
    echo json_encode(['status' = false, 'message' => 'An error occurred. Update failed.']);
}

В заключение, часто лучше использовать CSS-классы для элементов вместо встроенных стилей.Делает для более чистого кода и более повторяемого кода.

...