Чтобы обобщить все остальные ответы,
Сначала вы должны заменить $ firstName на '$ firstName' , потому что в противном случае текст (например, «John») будет помещен в ваш запрос без кавычки, например: INSERT INTO CUSTOMER (fname, lname) VALUES (John, 'smith')
Это приводит к ошибке, потому что он думает, что John - это какая-то переменная.
Во-вторых, ваш код уязвим для SQL Injection . Это очень серьезная уязвимость на вашем веб-сайте, так как злоумышленники могут использовать ее для чтения всей вашей базы данных и в этом случае даже создавать записи в вашей базе данных, что может привести к тому, что злоумышленники смогут полностью захватить ваш сайт, записав файлы!
Более подробная информация здесь: https://owasp.org/www-community/attacks/SQL_Injection
Важно то, что пользователь может управлять переменной $ firstName, которую вы используете в $sql = "INSERT INTO CUSTOMER (fname, lname) VALUES ('$firstName', 'smith')";
Таким образом, злоумышленник может изменить запрос в этот момент. Например, он мог бы использовать полезную нагрузку ', 'a'); DROP TABLE CUSTOMER;--
для удаления всей информации в таблице CUSTOMER.
Есть несколько способов предотвратить это, но самый простой - использовать подготовленные операторы. Это выглядит примерно так:
$stmt = $dbConnection->prepare("INSERT INTO CUSTOMER (fname, lname) VALUES (?, ?)");
$stmt->bind_param('ss', $param_firstName, $param_lastName);
$param_firstName = $firstName; // New line
$param_lastName = $lastName; // New line
$stmt->execute();
Таким образом вы убедитесь, что MySQL не интерпретирует ввод пользователя как код SQL, а только как значения.
Опять же, еще подробная информация здесь:
https://cheatsheetseries.owasp.org/cheatsheets/SQL_Injection_Prevention_Cheat_Sheet.html