Member 13889029 Ответов: 3

Не удается вставить данные в базу данных


Я попытался вставить данные, и предупреждение все еще говорит, что я успешно зарегистрировался, но когда я проверил sql, данных там нет. Я перепробовал множество способов и до сих пор не могу решить эту проблему. Кто-нибудь может мне помочь?

<?php
include ('../dbcon.php'); 
ini_set('display_errors', 1);
ini_set('display_startup_errors', 1);
error_reporting(E_ALL);
  
if (isset($_POST['reg_pelajar'])) {
	$idmurid = mysqli_real_escape_string($db,$_POST['idmurid']);
	$namamurid = mysqli_real_escape_string($db,$_POST['namamurid']);
	$jantina =  mysqli_real_escape_string($db,$_POST['jantina']);
	$idkelas =  $_POST['pkelas'];

	$query = "INSERT INTO murid(`IDMurid`,`NamaMurid`,`Jantina`, `IDKelas`)VALUES ('$idmurid','$namamurid','$jantina', '$idkelas')";
  if($query){
    echo"<script>alert('Rekod berjaya daftar')</script>";
  }else{
    echo"<script>alert('Rekod gagal daftar')</script>";
  }
}
?>

<!DOCTYPE html>
<html>
<head>
	<meta charset = "UTF-8">
	<meta name = "viewport" content="width= device-width, initial-scale= 1.0">
	<title>Pendaftaran Pelajar</title>
	<link rel="stylesheet" type="text/css" href="/Web/css/registerpelajar.css">
</head>

<body>
		<div class "info">
			<img src = "/Web/images/info.jpg" alt="addinfo" id = "add">	
		</div>
		<div class = "Title">
		Pendaftaran Pelajar 
		</div>
		<div class = "borang">
			<form action = "daftarpelajar.php" method="post">
				<div class = "muridid">
					No. Kad Pengenalan :
					<input type = "text" name = "idmurid" placeholder = " No Kad Pengenalan " required/></br>
				</div>
				<div class = "muridname">
					Nama Murid :
					<input type = "text" name = "namamurid" placeholder = "-Nama Murid-" required/><br>
				</div>	
				<div class = "gender">		
					Jantina :
					<input type = "text" name = "jantina" placeholder = "-Jantina-" required/><br>
				</div>
				<div class = "class">
					Kelas :
					<select name = "pkelas" id = "pkelas">
					<option value="--">Pilih Kelas</option>
						<?php
						$query = "SELECT * FROM kelas";
						$result = mysqli_query ($db, $query);
						
						while ($row = mysqli_fetch_array($result)):; ?>
						<option value="<?=$row['IDKelas'] ?>"><?=$row['Kelas'] ?></option>
						<?php endwhile; ?>
					</select>
				</div>
				<input type ="submit" name = "reg_pelajar" value = "Register">
			
			</form>
		</div>
	
</body>
</html>


мой dbcon.php:

<?php

// initializing variables
$username = "";
$errors = array(); 

// connect to the database
$db = mysqli_connect('localhost', 'root', '', 'harithprojek') or die("Couldn't connect"); ?>


Что я уже пробовал:

-изменена опция выбора
-изменил переменные
-добавить mysqli

3 Ответов

Рейтинг:
2

OriginalGriff

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

Когда вы объединяете строки, вы вызываете проблемы, потому что SQL получает такие команды, как:

SELECT * FROM MyTable WHERE StreetAddress = 'Baker's Wood'
Цитата, добавленная пользователем, завершает строку в том, что касается SQL, и вы получаете проблемы. Но могло быть и хуже. Если я приду и наберу вместо этого: "x';DROP TABLE MyTable;--", то SQL получит совсем другую команду:
SELECT * FROM MyTable WHERE StreetAddress = 'x';DROP TABLE MyTable;--'
Которые SQL видит как три отдельные команды:
SELECT * FROM MyTable WHERE StreetAddress = 'x';
Совершенно правильный выбор
DROP TABLE MyTable;
Вполне допустимая команда "удалить таблицу"
--'
А все остальное-это комментарии.
Так оно и происходит: выбирает любые совпадающие строки, удаляет таблицу из базы данных и игнорирует все остальное.

Поэтому всегда используйте параметризованные запросы! Или будьте готовы часто восстанавливать свою БД из резервной копии. Вы ведь регулярно делаете резервные копии, не так ли?

Видеть здесь: РНР: Подготовленные инструкции и хранимые процедуры - руководство пользователя[^]


Member 13889029

так что же я должен изменить прямо сейчас?

OriginalGriff

Все ваше приложение, чтобы не использовать конкатенацию строк.

Member 13889029

поэтому я должен сделать это как "вставить в murid(IDMurid) значения ("")" и просто сделать другую строку в другой оператор запроса, не так ли?

OriginalGriff

Нет, пройдите по ссылке и внимательно все прочтите.

Member 13889029

Я попытался поставить bind param и добавить строки, но это дает мне эту ошибку Fatal error: Uncaught Error: вызов функции-члена bindParam() на boolean. Как мне сделать так, чтобы это стало правдой?

Рейтинг:
12

Richard MacCutchan

Вы создаете $query строка, а затем проверьте это, чтобы показать предупреждение. Но ты никогда не сделаешь этого. PHP: mysqli_execute - руководство пользователя[^] вызов для выполнения фактического оператора insert.


Member 13889029

спасибо Вам, я только что искал о mysqli_execute, и теперь данные находятся в базе данных. Я очень ценю вашу помощь!

Рейтинг:
0

Patrice T

Вы уверены насчет кавычек вокруг названий полей ?

$query = "INSERT INTO murid(`IDMurid`,`NamaMurid`,`Jantina`, `IDKelas`)VALUES ('$idmurid','$namamurid','$jantina', '$idkelas')";

Не решение вашего вопроса, а еще одна проблема, которая у вас есть.
Никогда не создавайте SQL-запрос путем объединения строк. Рано или поздно вы сделаете это с помощью пользовательских вводов, и это откроет дверь к уязвимости под названием "SQL-инъекция", она опасна для вашей базы данных и подвержена ошибкам.
Одна кавычка в имени - и ваша программа выйдет из строя. Если пользователь вводит имя, например "Брайан О'Коннер", может привести к сбою вашего приложения, это уязвимость SQL-инъекции, и сбой-это наименьшая из проблем, вредоносный пользовательский ввод, и он продвигается к командам SQL со всеми учетными данными.
SQL-инъекция - Википедия[^]
SQL-инъекция[^]
Атаки SQL-инъекций на примере[^]
PHP: SQL-инъекция - руководство пользователя[^]
Шпаргалка по предотвращению инъекций SQL - OWASP[^]
Как я могу объяснить SQL-инъекцию без технического жаргона? - Обмен Стеками Информационной Безопасности[^]