【解決方法】致命的なエラー: キャッチされていない mysqli_SQL_exception: SQL 構文にエラーがあります。


Fatal error: Uncaught mysqli_sql_exception: You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near 'keys SET keyNum = '36332', employeeID = '4 ', dateKeyGiven = '2022-11-30', da...' at line 1 in C:\xampp\htdocs\acceso-stephanie\confirmedit_key.php:19 Stack trace: #0 C:\xampp\htdocs\acceso-stephanie\confirmedit_key.php(19): mysqli_query(Object(mysqli), 'UPDATE keys SET...') #1 {main} thrown in C:\xampp\htdocs\acceso-stephanie\confirmedit_key.php on line 19

私のコード:

<?php

	include_once 'database/dbConnect.php';
	session_start();
	if(!isset($_SESSION['admin']))
	{
		header ("Location: loginpage.php");
	}

    $_SESSION['editkey']['id'] = $_POST['id'];
	$_SESSION['editkey']['keyNum'] = $_POST['keyNum'];
	$_SESSION['editkey']['employee'] = $_POST['employee'];
	$_SESSION['editkey']['dateKeyGiven'] = $_POST['dateKeyGiven'];
	$_SESSION['editkey']['dateKeyReturned'] = $_POST['dateKeyReturned'];
	$_SESSION['editkey']['user'] = $_POST['user'];

	$sql = "UPDATE keys SET keyNum = '".$_SESSION['editkey']['keyNum']."', employeeID = '".$_SESSION['editkey']['employee']."', dateKeyGiven = '".$_SESSION['editkey']['dateKeyGiven']."', dateKeyReturned = '".$_SESSION['editkey']['dateKeyReturned']."', userID = '".$_SESSION['editkey']['user']."' WHERE id = ".$_SESSION['editkey']['id'];

	$editkey_query = mysqli_query($mysqli, $sql);

	if (count($_POST) > 0)
	{
		$sql = "INSERT INTO `log`(`user`, `date`, `transtype`, `purpose`) VALUES ('".$_SESSION['admin']."', NOW(), 'Updated key ".$_SESSION['editkey']['keyNum']."', 'Edit key information')";

		if (mysqli_query($mysqli, $sql))
		{}
		else
		{
			echo '<script>alert("Error record: " . mysqli_error($mysqli)!");</script>';
		}
			mysqli_close($mysqli);
	}

	echo ("<SCRIPT LANGUAGE='JavaScript'>
    window.alert('Succesfully Updated')
    window.location.href='keys.php';
    </SCRIPT>");
?>

フォーム送信を受信:

<Style>
	.button {
	border: none;
	color: white;
	padding: 16px 32px;
	text-align: center;
	text-decoration: none;
	display: inline-block;
	font-size: 16px;
	margin: 4px 2px;
	transition-duration: 0.4s;
	cursor: pointer;
	}

	.button-back {
	background-color: white; 
	color: black; 
	border: 2px solid #4CAF50;
	}

	.button-back:hover {
	background-color: #4CAF50;
	color: white;
	}
</style>


<?php
	require_once ('database/dbConnect.php');
	session_start();

	if(!isset($_SESSION['admin']))
	{
		header ("Location:loginpage.php");
	}

	$sql = ("SELECT * from `keys` WHERE keys.id = " .$_GET['id']);
	$qry = mysqli_query($mysqli, $sql);
	$edit = mysqli_fetch_assoc($qry);

	$emp_sql = "SELECT * FROM `employee`";
	$emp_query = mysqli_query($mysqli, $emp_sql);

	$user_sql = "SELECT * FROM `users`";
	$user_query = mysqli_query($mysqli, $user_sql);

				$employeeID = $edit['employeeID'];

				$eid = ("SELECT firstName, lastNames
						FROM employee
						WHERE employee.id = '$employeeID'");

				$eidRes = mysqli_query($mysqli, $eid);
				$employee = mysqli_fetch_array($eidRes);

				$userID = $edit['userID'];

				$uid = ("SELECT firstName, lastNames
						FROM users
						WHERE users.id = '$userID'");

				$uidRes = mysqli_query($mysqli, $uid);
				$user = mysqli_fetch_array($uidRes);
?>



<html>

<head>
	<title>Edit key</title>
    <link href = "CSS/style_for_edit.css" rel = "stylesheet" media ="all">

</head>

<?php
	include("mainheader.php");
		if(!isset ($_GET['page']))
	{}
?>

<body>
	
	<div class="divider"></div>

	<a href = "keys.php"><button class = "button button-back" style = "float: left;">Back</button></a>

<div class = "emp-edit">
	<div class = "emp-body">

	<center><h1>Edit key</h1></center>
	<center><h3>REMINDER: Only authorized users can edit keys.</h3></center>

	<form method = "post" action = "confirmedit_key.php" enctype = "multipart/form-data">

	<input type = "hidden" name = "id" value = "<?php echo $edit['id'];?>" required = "required">

				<div class="editor editor-space">
					<div class="col">
						<div class="input-group">
							<label>Key number:</label>
							<input class="input--style-1" type="text" name="keyNum" value = "<?php echo $edit['keyNum'];?>">
						</div>
					</div>
					<div class="col">
						<div class="input-group">
							<label>Employee:</label>
							<input class="input--style-1" type="text" name="emp" value="<?php echo $employee['firstName'] . " " . $employee['lastNames'];?>">
							<br/><br/>
							<label>Change selected employee:</label>
							<select name="employee">
								<?php

								while ($employee = mysqli_fetch_array ($emp_query, MYSQLI_ASSOC)):;?>
									<?php echo $employee["employeeID"];?>
									<option value="<?php echo $employee["id"];?> ">
										<?php echo $employee["firstName"] . " " . $employee["lastNames"]; ?>
									</option>
								
								<?php
									endwhile;
								?>
							</select>
						</div>
					</div>
				</div>

				<div class="editor editor-space">
					<div class="col">
						<div class="input-group">
							<label>Date key given:</label>
							<input class="input--style-1" type="date" name="dateKeyGiven" value = "<?php echo $edit['dateKeyGiven'];?>">
						</div>
					</div>
					<div class="col">
						<div class="input-group">
							<label>Date key returned:</label>
							<input class="input--style-1" type="date" name="dateKeyReturned" value = "<?php echo $edit['dateKeyReturned'];?>">
						</div>
					</div>
				</div>

				<div class="editor editor-space">
					<div class="col">
							<div class="input-group">
								<label>User:</label>
								<input class="input--style-1" type="text" name = "u" value="<?php echo $user['firstName'] . " " . $user['lastNames'];?>">
								<br/><br/>
								<label>Change selected employee:</label>
								<select name="user">
									<?php

									while ($user = mysqli_fetch_array ($user_query, MYSQLI_ASSOC)):;?>

										<option value="<?php echo $user["id"];?> ">
											<?php echo $user["firstName"] . " " . $user["lastNames"]; ?>
										</option>
									
									<?php
										endwhile;
									?>
								</select>
							</div>
					</div>
				</div>

                <br><br>
                	<div class = "p-t-20">
                        <input type = "submit" name = "submit" value = "Upload">
					</div>
                        
    </form>
</div>
</div>
</div>
</div>

</body>
</html>

私が試したこと:

オンラインで多くのチュートリアルとヘルプを試しましたが、何が問題なのかわかりません。

解決策 1

そんなことしないで! 文字列を連結して SQL コマンドを作成しないでください。 データベース全体を破壊する可能性のある、偶発的または意図的な SQL インジェクション攻撃にさらされる可能性があります。 代わりに、常にパラメーター化されたクエリを使用してください。

文字列を連結すると、SQL が次のようなコマンドを受け取るため、問題が発生します。

SQL
SELECT * FROM MyTable WHERE StreetAddress = 'Baker's Wood'

ユーザーが追加した引用符は、SQL に関する限り文字列を終了させ、問題が発生します。 しかし、それはもっと悪いかもしれません。 代わりに「x’;DROP TABLE MyTable;–」と入力すると、SQL は非常に異なるコマンドを受け取ります。

SQL
SELECT * FROM MyTable WHERE StreetAddress = 'x';DROP TABLE MyTable;--'

どの SQL が 3 つの別個のコマンドとして認識されるか:

SQL
SELECT * FROM MyTable WHERE StreetAddress = 'x';

完全に有効な SELECT

SQL
DROP TABLE MyTable;

完全に有効な「テーブルの削除」コマンド

SQL
--'

そして、それ以外はすべてコメントです。
一致する行を選択し、DB からテーブルを削除し、それ以外は無視します。

したがって、常にパラメーター化されたクエリを使用してください。 または、DB をバックアップから頻繁に復元する準備をしてください。 バックアップは定期的に取っていますよね?

アプリ全体でそれを修正すると、気付いた問題が同時に解消される可能性があります。

コメント

タイトルとURLをコピーしました