【解決方法】致命的なエラーが発生しました: 編集した PHP コードで mysqli_SQL_Exception がキャッチされませんでした

プログラミングQA


こんにちは! 学校のプロジェクト用に簡単な表を作成しているのですが、このチュートリアルが役立つことがわかりました
「https://www.youtube.com/watch?v=NqP0-UkIQS4」
CRUD 操作を使用した PHP と MySQL: 作成、読み取り、更新、削除 – YouTube
すべてに従いましたが、テーブルを更新/編集すると、常に次の結果になります。

致命的なエラー: mysqli_sql_例外をキャッチできません: SQL 構文にエラーがあります。 MariaDB サーバーのバージョンに対応するマニュアルで、行の「= `2023-03-22T11:50:28`、Number_Of_Items = `5`、Item = `Tempra`、Expiration_D…」付近で使用する正しい構文を確認してください。 1 in C:\xampp\htdocs\Inven\edit.php:75 スタック トレース: #0 C:\xampp\htdocs\Inven\edit.php(75): mysqli_query(Object(mysqli), ‘UPDATE Clinic_i… ‘) #1 {main} が C:\xampp\htdocs\Inven\edit.php の 75 行目でスローされました。

私の第一言語ではない下手な英語でごめんなさい、ありがとう。

私が試したこと:

query($sql);
	$row = $result->fetch_assoc();

	if (!$row) {
		header("location: /inven/index.php");
		exit;
	}


$Date_Received = $row["Date_Received"];
$Number_Of_Items = $row["Number_Of_Items"];
$Item = $row["Item"];
$Expiration_Date = $row["Expiration_Date"];
$Last_Updated = $row["Last_Updated"];
$Quantity = $row["Quantity"];

}
	else{

$id = $_POST["id"];
$Date_Received = $_POST["Date_Received"];
$Number_Of_Items = $_POST["Number_Of_Items"];
$Item = $_POST["Item"];
$Expiration_Date = $_POST["Expiration_Date"];
$Last_Updated = $_POST["Last_Updated"];
$Quantity = $_POST["Quantity"];

	do {
		if ( empty($id) || 
			empty($Date_Received) || 
			empty($Number_Of_Items) || 
			empty($Item) || 
			empty($Expiration_Date) || 
			empty($Last_Updated) || 
			empty($Quantity) ) 
			{ $errorMessage= "All the Fields are required";
				break;
		} 

		$sql = "UPDATE clinic_inventory" .
			"SET Date_Received = `$Date_Received`, Number_Of_Items = `$Number_Of_Items`, Item = `$Item`, Expiration_Date = `$Expiration_Date`, Last_Updated = `$Last_Updated`, Quantity = `$Quantity`" . "WHERE id = $id";
		
			$result = mysqli_query($connection, $sql);

			if (!$result) {
			$errorMessage = "Invalid Query: " . $connection->error;
			break;
		}

			$successMessage = "Item Successfully Added";
			header("location: /inven/index.php");
			exit;
			
}	while (false);
	
}


?>

解決策 1

SQL では、文字列値にはバックティックではなく一重引用符を使用する必要があります。 また、クエリ内の「SET」の前にスペースがありません。「UPDATE Clinic_inventorySET」となります。SQL は次のようになります。

PHP
$sql = "UPDATE clinic_inventory SET " .
       "Date_Received = '$Date_Received', " .
       "Number_Of_Items = '$Number_Of_Items', " .
       "Item = '$Item', " .
       "Expiration_Date = '$Expiration_Date', " .
       "Last_Updated = '$Last_Updated', " .
       "Quantity = '$Quantity' " .
       "WHERE id = $id";

また、SQL インジェクションに対して無防備な状態にしていることになります。むしろプリペアド ステートメントとパラメータ化されたクエリを使用する必要があります。 プリペアドステートメントとストアドプロシージャ[^]

コードは大まかに次のようになります。

PHP
$sql = "UPDATE clinic_inventory SET " .
       "Date_Received = ?, " .
       "Number_Of_Items = ?, " .
       "Item = ?, " .
       "Expiration_Date = ?, " .
       "Last_Updated = ?, " .
       "Quantity = ? " .
       "WHERE id = ?";

$stmt = $connection->prepare($sql);

if ($stmt) {
    $stmt->bind_param("ssssssi", $Date_Received, $Number_Of_Items, $Item, $Expiration_Date, $Last_Updated, $Quantity, $id);

    $stmt->execute();

    if ($stmt->affected_rows > 0) {
        //Your query was successful...
        $successMessage = "Item Successfully Added";
        header("location: /inven/index.php");
        exit;
    } else {
        //Handle error/s...
        $errorMessage = "Error updating item: " . $stmt->error;
    }

    $stmt->close();
} else {
    //Handle error/s...
    $errorMessage = "Error preparing statement: " . $connection->error;
}

コメント

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