Форма HTML/PHP не вставляет данные в базу данных MySQL

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

Идея состоит в том, что вы можете вводить тему и описание, и она будет добавлена в базу данных MySQL (это пока что).

Я создал html-форму:

<form action="insert.php">
 <label for="subj">Subject:</label>
 
 
 
 <label for="desc">Description:</label>
 
 
 
 
 </form>

и некоторый php-код:

Проблема в том, что входные данные из полей Subject и Description в HTML-форме не входят в базу данных MySQL.

Однако, если я установил

'VALUES ('$subject', '$description')';

в

'VALUES ("test", "test")';

оно работает.

Любая помощь приветствуется! Благодарю!

3 ответа

Ваша проблема в том, что вы используете одинарные кавычки в своем объявлении $sql,

$sql = 'INSERT INTO organiser '.'(subject,description) '.'VALUES ('$subject', '$description')';

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

$age = 20; 
$myAge = 'I am $age years';
echo $myAge;

Это будет означать, что I am $age years с тех пор, как вы использовали одинарные кавычки.

Однако, если вы использовали двойные кавычки,

$age = 20; 
$myAge = "I am $age years";
echo $myAge;

Выход был бы,

I am 20 years

Таким образом, ваш оператор $ sql должен быть (я пишу его на одной строке)

$sql = "INSERT INTO organiser (subject,description) VALUES ('$subject', '$description')";
 ^ ^

Если вы повторите свой $ sql, это станет чем-то вроде того,

INSERT INTO organiser (subject,description) VALUES ('Your subject', 'Your description')

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


В дополнение к ответу, уже указанному в отношении недостающих точек для конкатенации:

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

Вы используете

что эквивалентно который не то, что вы хотите, и не требуется.

Измените его на

так как вы используете переменные POST.

Это способствует причина, почему 'VALUES ("test", "test")'; работает, а не наоборот, поскольку обе эти переменные $subject - $description основаны на ваших переменных POST:

$subject = $_POST['subj'];
$description = $_POST['desc'];

Вы можете либо сделать

$sql = "INSERT INTO organiser (subject,description) VALUES ('$subject', '$description')";

как указано в комментарии.

или

$sql = "INSERT INTO organiser (subject,description) VALUES ('".$subject."', '".$description."')";

Добавьте отчет об ошибках в начало файла (ов)

error_reporting(E_ALL);
ini_set('display_errors', 1);

которые могли бы сигнализировать об ошибках, обнаруженных в вашем коде.

Тем не менее, ваш метод открыт для SQL-инъекции. Используйте mysqli_* с подготовленными инструкциями или PDO с подготовленными операторами.

Использовать метод подготовленных операторов mysqli; это безопаснее.

<!--?php 

$DB_HOST = "xxx"; // replace with your own
$DB_NAME = "xxx";
$DB_USER = "xxx";
$DB_PASS = "xxx";

$conn = new mysqli($DB_HOST, $DB_USER, $DB_PASS, $DB_NAME);
if($conn--->connect_errno > 0) {
 die('Connection failed [' . $conn->connect_error . ']');
}

// optional to check for empty fields
// if(isset($_POST['submit']) && !empty($_POST['subj']) && !empty($_POST['desc'])) {
if(isset($_POST['submit'])) {

$subject = stripslashes($_POST['subj']);
$description = stripslashes($_POST['desc']);

$stmt = $conn->prepare("INSERT INTO organiser ('subject', 'description') VALUES (?, ?)");

$stmt->bind_param('ss', $subject, $description);

 if (!$stmt->execute()) {
 echo "Execute failed: (" . $stmt->errno . ") " . $stmt->error;
 }

 else{
 echo "<h2>Success!</h2>";
 }

$stmt->close(); // Statement
$conn->close(); // MySQLi

}

?>

Форма: (новая)

<label for="subj">Subject:</label>
 
 
 
 <label for="desc">Description:</label>


Вы забыли точки вокруг переменных, и вы можете добавить несколько двойных кавычек вокруг этого в зависимости от содержимого ваших переменных :)

'VALUES ("'.$subject.'", "'.$description.'")';

licensed under cc by-sa 3.0 with attribution.