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.
}