[ad_1]
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 をバックアップから頻繁に復元する準備をしてください。 バックアップは定期的に取っていますよね?
アプリ全体でそれを修正すると、気付いた問題が同時に解消される可能性があります。
[ad_2]
コメント