SQL Обновление запроса на получение данных из формы не выполняется - PullRequest
0 голосов
/ 11 марта 2020

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

Когда они нажимают на кнопку Отправить запускается сценарий PHP, который по существу проверяет, не являются ли какие-либо поля не пустыми, и, если они не пусты, запускает запрос на обновление базы данных в таблице student. Однако, похоже, ничего не происходит, интересно, если кто-то может указать, где я ошибся, поскольку таблица student не обновляет профиль *

. php:

<form action="scripts/update-profile.php" method="post">  
    <h3 class="left-align fontAmaticH1">Student Details</h3>
        <p class="left-align"><b>Username: </b><?php echo $row['username']; ?>
        <div class="update-profile"><input type="text" name="username" placeholder="Update Username..."></div>    
        </p>

        <p class="left-align"><b>Email Address: </b><?php echo $row['email']; ?>
        <div class="update-profile"><input type="text" name="email" placeholder="Update Email..."></div>
        </p>

        <p class="left-align"><b>First Name: </b><?php echo $row['firstName']; ?>
        <div class="update-profile"><input type="text" name="firstName" placeholder="Update First Name..."></div>
        </p>

        <p class="left-align"><b>Surname: </b><?php echo $row['lastName']; ?>
        <button name="update-details" class="update-details" type="submit">Update Details</button>
        </form>

Изменить сведения

PHP:

<?php
// Checking whether the user got to this page by clicking the proper button.
if (isset($_POST['update-details'])) {

      require 'db.php';

// We grab all the data which we passed from the update form
    $studentID = $_SESSION['studentID'];

    $username = $_POST['username'];
    $email = $_POST['email'];
    $profileImage = $_POST['profileImage'];
    $firstName = $_POST['firstName'];
    $lastName = $_POST['lastName'];


    $update = [];
    if (! empty($username)) {
        $update['username'] = "username ='".$username ."'";
    }

    if (! empty($email)) {
        $update['email'] = "email='".$email ."'";
    }

    if (! empty($firstName)) {
        $update['firstName'] = "firstName='".$firstName ."'";
    }

    if (! empty($lastName)) {
        $update['lastName'] = "lastName='".$lastName ."'";
    }


    if (! empty($update)) {
        $query = "UPDATE `student` SET ";
        $query .= implode(', ', $update);
        $query .= " WHERE `student`.`studentID` = $studentID ";
        $result = $conn->query($query) or die ("update SQL error");
    }


    header("Location: ../profile.php?update=success");
}

?>

СТОЛ ДЛЯ СТУДЕНТОВ student Table

1 Ответ

1 голос
/ 11 марта 2020

1:

Вы широко открыты для SQL инъекции здесь. Используйте параметризованные запросы. ВСЕГДА.

2:

Проверьте свои PHP Журналы ошибок

3:

D on't
R epeat
Y нас

Что означает использование PHP l oop структуры для экономии кода, времени и усилий.

4:

Имейте в виду, что MySQL UTF-8 равен NOT действительно UTF-8 и должен всегда быть заменены utf8mb4_ наборами символов и сопоставлениями.

5:

Ваше перенаправление header Location должно всегда сопровождаться exit / die() оператор, потому что PHP будет продолжать обработку, пока не достигнет конца скрипта, даже если вы дадите ему header. Если вы дадите несколько заголовков "Location: ..." s, то последним будет тот, который будет следовать.

6:

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

7:

Использование блоков Try / Catch в PHP Они должны использоваться для catch ошибок и проблем до их совершения.

8 :

НИКОГДА не доверяйте пользовательскому вводу. Ever.


Быстрый и грязный Пример:

Использование синтаксиса MySQLi ?;

В вашем файле db. php, чтобы разрешить перехват ошибок try / catch с помощью метода MySQLi:

    \mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);

В вашем скрипте ....

if (isset($_POST['update-details'])) { //tacky but it will do.

      require 'db.php';

    $studentID = (int)$_SESSION['studentID']; 
                  // force to type integer to ensure 
                  // data is always valid.

    unset($_POST['update-details']); // forget this value. 
    $update = []; // make a new array
    // Because your array keys are the same, you can simply loop through 
    // checking and then adding from one array to another. 
    // 
    // alternatively you can copy the whole @_POST array and simply 
    // run `array_filter` on it to clean it of empty values. 
    // (but this will not catch whitespaces)
    foreach($_POST as $key=>$data){
          $data = trim($data);
          if(!empty($data)){
             // use REGEX to do some cleaning of your Key values. 
             // NEVER EVER trust user input. NEVER. 
             $key = preg_replace("/[^a-z]/i","",$key);
             $update[$key] = $data;
          }
    }
    // end foreach. 
    if (\count($update) > 0 ) {
        $keyString = implode(" = ? ,",array_keys($update));
        $keyString." = ?" //append last reference

        // Now build the dynamically built Parameterised SQL:
        $query = "UPDATE `student` SET ".$keyString." WHERE `student`.`studentID` = ? ";

        $runQuery = $conn->prepare($query);

        // We will assume here all your data is a string (s) type. 

        $dataType = str_repeat("s", count($update));
        $dataType .= "i"; // append data type for the ID at the end. 
        $update[] = $studentID;


        //Use a Try / Catch block to check the functions work correctly. 
        // you can also use SQL transactions. 
        try {
            // Bind your data to your query object
            $runQuery->bind_param($dataType, \implode(",",$update));
            // Execute your query.
            $runQuery->execute(); 
            $runQuery->free_result();

            // This can feedback the number of rows updated. 
            $rows = (string)$runQuery->affected_rows;
            error_log("Rows updated: ".$rows);

            //close your query. 
            $runQuery->close();
        }
        catch(\mysqli_sql_exception $ex) {
             // Do something with your query failure. 
             error_log("MySQL Error!: ".print_r($ex,true));
         } 
    } //end count update

    header("Location: ../profile.php?update=success");
    exit; // STOP further PHP execution. 
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...