我在將資料插入 MySQL 資料庫時遇到問題。db 的結構如下所示:
id | name | class | 23-02-2022 | 26-02-2022 | and so on ...
資料庫是考勤系統的一部分。所以我使用日期作為列名。
我使用此代碼打開一個 csv 檔案并將一些資料上傳到資料庫中。正如您在這部分代碼中看到的那樣,我只將資料放在名稱和類列中。
if (($handle = fopen("class.csv", "r")) !== FALSE)
{
while (($data = fgetcsv($handle, 1000, ";")) !== FALSE)
{
$query="INSERT INTO table21228 (name, class) VALUES ('$data[0]' , '$data[1]')";
if ($conn->query($query) === TRUE) {
}
else {
echo 'Error: '. $conn->error;
} fclose($handle);
}
我收到此錯誤訊息:錯誤:欄位 '23-02-2022' 沒有默認值
當我使用不同的表時,其中唯一的列是 id、name、class 它可以正常作業。所以我想我的資料庫的結構一定是問題所在
也許所有這些日期列都像 23-02-2022 一樣???
希望有人能幫助我。謝謝!
親切的問候丹
uj5u.com熱心網友回復:
問題是日期的列沒有 DEFAULT 值,因為在添加記錄時,您沒有為該列定義值,它給出了錯誤。解決方案是在添加記錄時為列指定值,或者更改列并為其指定默認值。
但是您的表結構根本無法使用。您不應該有個別日期的列。像這樣,您的表中將有無限的列。因此,解決方案是插入標有您添加的行的出勤日期。
uj5u.com熱心網友回復:
可能是您有一個不包含空列的表,并且您嘗試為不可為空的列插入沒有正確值的行..您收到欄位“23-02-2022”的訊息沒有默認值
嘗試為這些列插入適當的值
$query="INSERT INTO table21228 (name, class, `23-02-2022`, `26-02-2022` ) VALUES ('$data[0]' , '$data[1]', '2022-02-20', '2022-02-20')";
或嘗試撤銷這些列的非空約束
alter table table21228 modify column `23-02-2022` date;
或設定默認值
ALTER TABLE table21228 MODIFY column `23-02-2022` date DEFAULT '2022-02-20';
uj5u.com熱心網友回復:
問題是,您嘗試將行插入到并非所有列都具有默認值的表中。您要么需要為所有列提供默認值(使用 ALTER TABLE 或修改后的 CREATE TABLE),要么必須在 INSERT 查詢中提及所有這些列。
此外,您的代碼容易受到 SQL 注入的影響。閱讀有關如何防止這種情況的精彩指南: https ://phpdelusions.net/pdo
如果您的表格如下所示:
CREATE TABLE `attendances` (
`id` INT NOT NULL AUTO_INCREMENT,
`name` VARCHAR(250) NOT NULL,
`class` VARCHAR(250) NOT NULL,
`23-02-2022` INT NOT NULL,
`26-02-2022` INT NOT NULL,
PRIMARY KEY (`id`)) ENGINE = InnoDB;
您可以像這樣更改它:
ALTER TABLE `attendances`
CHANGE `23-02-2022` `23-02-2022` INT NULL DEFAULT NULL;
要么
ALTER TABLE `attendances`
CHANGE `26-02-2022` `26-02-2022` INT NOT NULL DEFAULT '0';
這里,23-02-2022默認值為“NULL”,26-02-2022是默認值為“0”的示例。或者首先正確地創建表:
CREATE TABLE `attendances` (
`id` INT NOT NULL AUTO_INCREMENT,
`name` VARCHAR NOT NULL,
`class` VARCHAR NOT NULL,
`23-02-2022` INT NULL DEFAULT NULL,
`26-02-2022` INT NOT NULL DEFAULT '0',
PRIMARY KEY (`id`)) ENGINE = InnoDB;
作為替代方案,您可以將所有沒有默認值的列添加到 INSERT 查詢中:
INSERT INTO `attendances` (
`id`, `name`, `class`, `23-02-2022`, `26-02-2022`
) VALUES (
NULL, 'name1', 'class1', '0', '0'
);
確保保護您的應用免受 SQL 注入:
<?php
$pdo->prepare("
INSERT INTO `attendances` (
`id`, `name`, `class`, `23-02-2022`, `26-02-2022`
) VALUES (
NULL, ?,?,?,?
)
")->execute(['name1', 'class1', 0, 0]);
uj5u.com熱心網友回復:
所以我使用日期作為列名。
...壞主意,因為如果系統長期使用,理論上你有無限數量的列。并且它會使撰寫某些型別的查詢來理解資料變得非常困難。
所以我想我的資料庫的結構一定是問題所在
...基本上,是的。
要了解如何正確設計資料庫,您應該了解資料庫規范化。
在這種情況下,我建議您將一張表用于所有人的串列,另一張用于所有類的串列。
如果您正在運行預定的時間表,那么您可能會有一個表格,其中列出了班級、日期和分配給該日期和班級的老師。(或者,如果一名教師通常負責整個班級,您可以在班級表中指定教師。)
最后,您將有一個單獨的“出席”表,其中包含“personID”和“attendanceDate”以及“classID”列。
這樣一來,您最終將在那里獲得多行,其中包含相同的人/班級組合和不同的日期,以記錄他們在每個班級的所有出勤情況和該班級的每個日期。而且它是完全可無限擴展的,您無需在每次宣布新的類或日期時修改表,也無需在嘗試生成查詢時在代碼中提供列名。
uj5u.com熱心網友回復:
首先檢查您的 csv 檔案是否具有正確數量的列作為您的資料庫然后將您的列默認設定為從非 NULL 到 null 或無
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/430031.html
上一篇:有沒有辦法解決這個typeError:connection.connectisnotafunctioninnodejs?
