PHP-mySQLに挿入できません(構造データベースの問題?)
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のようなすべての日付の列???
誰かが私を助けてくれることを願っています。ありがとうございます!
よろしくお願いします
ダン
答え :
解決策:
問題は、日付の列にDEFAULT値がなく、レコードを追加しているときに列の値を定義しないため、エラーが発生することです。解決策は、レコードを追加するときに列に値を指定するか、列を変更してデフォルト値を指定することです。
しかし、テーブル構造はまったく使用できません。個々の日付の列はありません。このように、テーブルには無限の列があります。したがって、代わりに解決策は、追加した行でマークされた出席日を挿入することです。
答え :
解決策:
nullでない列を持つテーブルがあり、null不可能な列に適切な値のない行を挿入しようとした可能性があります..フィールド'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')";
または、これらの列のnullではないconstranitsを取り消してみてください
alter table table21228 modify column `23-02-2022` date;
またはデフォルト値を設定
ALTER TABLE table21228 MODIFY column `23-02-2022` date DEFAULT '2022-02-20';
答え :
解決策:
問題は、すべての列にデフォルト値があるわけではないテーブルに行を挿入しようとすることです。すべての列にデフォルト値を指定するか(ALTERTABLEまたは変更されたCREATETABLEを使用)、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 `
)値(
NULL、'name1'、'class1'、 '0'、 '0'
);
アプリをSQLインジェクションから保護してください:
<?php
$ pdo-> prepare( "
INSERT INTO `attendances`(
`id`、` name`、 `class`、` 23-02-2022 `、` 26-02-2022 `
)値(
ヌル、 ?、?、?、?
)。
")-> execute(['name1'、'class1'、0、0]);
答え :
解決策:
したがって、列名として日付を使用します。
...システムを長期間使用する場合、理論的には列の数が無限になるため、悪い考えです。また、データを理解するために特定の種類のクエリを作成することは非常に困難になります。
だから、私のデータベースの構造が問題になっているに違いないと思います
...基本的に、はい。
データベースを正しく設計する方法を理解するには、データベースの正規化について学ぶ必要があります。
>
このシナリオでは、すべての人のリスト用に1つのテーブルを用意し、すべてのクラスのリスト用に別のテーブルを用意することをお勧めします。
事前に決められた時刻表を実行している場合は、クラス、日付、およびその日付とクラスに割り当てられている教師を一覧表示するテーブルが作成される場合があります。 (または、通常1人の教師がクラス全体を受講する場合は、クラステーブルで教師を割り当てることができます。)
最後に、「personID」列と「attendanceDate」列、および「classID」列を含む別の「attendance」テーブルがあります。
そうすると、同じ人物/クラスの組み合わせで日付が異なる複数の行が表示され、各クラスとそのクラスの各日付へのすべての出席が記録されます。また、新しいクラスや日付が発表されるたびにテーブルを変更したり、クエリを生成するときにコード内の列名を変更したりすることなく、完全に拡張可能です。
したがって、列名として日付を使用します。
...システムを長期間使用する場合、理論的には列の数が無限になるため、悪い考えです。また、データを理解するために特定の種類のクエリを作成することは非常に困難になります。
だから、私のデータベースの構造が問題になっているに違いないと思います
...基本的に、はい。
データベースを正しく設計する方法を理解するには、
>データベースの正規化について学ぶ必要があります。 このシナリオでは、すべての人のリスト用に1つのテーブルを用意し、すべてのクラスのリスト用に別のテーブルを用意することをお勧めします。
事前に決められた時刻表を実行している場合は、クラス、日付、およびその日付とクラスに割り当てられている教師を一覧表示するテーブルが作成される場合があります。 (または、通常1人の教師がクラス全体を受講する場合は、クラステーブルで教師を割り当てることができます。)
最後に、「personID」列と「attendanceDate」列、および「classID」列を含む別の「attendance」テーブルがあります。
そうすると、同じ人物/クラスの組み合わせで日付が異なる複数の行が表示され、各クラスとそのクラスの各日付へのすべての出席が記録されます。また、新しいクラスや日付が発表されるたびにテーブルを変更したり、クエリを生成するときにコード内の列名を変更したりすることなく、完全に拡張可能です。
答え :
解決策:
最初に、csvファイルにデータベースとして適切な数の列があることを確認してから、列のデフォルトを非NULLからNULLまたはなしに設定します
同様の質問
私たちのウェブサイトで同様の質問で答えを見つけてください。