質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

90.10%

エラーを解消してデータの登録ができるようにしたい。

解決済

回答 3

投稿

  • 評価
  • クリップ 0
  • VIEW 422

chouette2960

score 5

 前提・実現したいこと

現在、Mac book Airでプログラミングをしています。
データベースにはMAMPを使用。
初心者であるため、ソースコードが見にくいかもしれませんが、ご了承願います。
現在はphpとMySQLを使ってデータの登録システムを作っています。
ですが、エラーが起こり、データの新規登録ができない状態にあります。
なのでデータの登録ができるようにしたいです。
非常に初歩的な問題かもしれませんが、解決できません。
どなたかご教授願います。

 発生している問題・エラーメッセージ

下のエラーが発生しており、データベースにデータが登録されません。
エラー発生: SQLSTATE[23000]: Integrity constraint violation: 1048 Column 'subclass' cannot be null

 該当のソースコード

こちらが受け取った情報を登録するためのコードです。
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF-8">
<title>フクロウデータ登録完了</title>
</head>
<body bgcolor="lightgreen">
<?php
require_once '/Applications/MAMP/owldb_config.php';
try {
    $owl_type = $_POST['owl_type'];
    $owl_type2 = $_POST['owl_type2'];
    $owl_size = $_POST['owl_size'];
    $owl_size2 = $_POST['owl_size2'];
    $hasumi = $_POST['hasumi'];
    $hasumi2 = $_POST['hasumi2'];
    $japanese_name = $_POST['japanese_name'];
    $english_name = $_POST['english_name'];
    $zoological_name = $_POST['zoological_name'];
    $body_length = $_POST['body_length'];
    $distribution = $_POST['distribution'];
    $description = $_POST['description'];
    $Average_price = (INT) $_POST['Average_price'];
    $kingdom = $_POST['kingdom'];
    $phylum = $_POST['phylum'];
    $subphylum = $_POST['subphylum'];
    $class = $_POST['class'];
    $subclass = $_POST['subclass'];
    $orders = $_POST['orders'];
    $famiry = $_POST['family'];
    $subfamily = $_POST['subfamily'];
    $genus = $_POST['genus'];
    $kind = $_POST['kind'];
    $dbh = new PDO('mysql:host=localhost;dbname=allowldata;charset=utf8', $user, $pass);

    $dbh->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);
    $dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
    $sql = "INSERT INTO owldata (owl_type, owl_type2, owl_size, owl_size2, hasumi, hasumi2, japanese_name, english_name, zoological_name, body_length, distribution, description, Average_price, kingdom, phylum, subphylum, family, subfamily, class, subclass, orders, genus, kind) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)";
    $stmt = $dbh->prepare($sql);
    $stmt->bindValue(1, $owl_type, PDO::PARAM_STR);
    $stmt->bindValue(2, $owl_type2, PDO::PARAM_STR);
    $stmt->bindValue(3, $owl_size, PDO::PARAM_STR);
    $stmt->bindValue(4, $owl_size2, PDO::PARAM_STR);
    $stmt->bindValue(5, $hasumi, PDO::PARAM_STR);
    $stmt->bindValue(6, $hasumi2, PDO::PARAM_STR);
    $stmt->bindValue(7, $japanese_name, PDO::PARAM_STR);
    $stmt->bindValue(8, $english_name, PDO::PARAM_STR);
    $stmt->bindValue(9, $zoological_name, PDO::PARAM_STR);
    $stmt->bindValue(10, $distribution, PDO::PARAM_STR);
    $stmt->bindValue(11, $body_length, PDO::PARAM_STR);
    $stmt->bindValue(12, $description, PDO::PARAM_STR);
    $stmt->bindValue(13, $Average_price, PDO::PARAM_INT);
    $stmt->bindValue(14, $kingdom, PDO::PARAM_STR);
    $stmt->bindValue(15, $phylum, PDO::PARAM_STR);
    $stmt->bindValue(16, $subphylum, PDO::PARAM_STR);
    $stmt->bindValue(17, $class, PDO::PARAM_STR);
    $stmt->bindValue(18, $subclass, PDO::PARAM_STR);
    $stmt->bindValue(19, $orders, PDO::PARAM_STR);
    $stmt->bindValue(20, $family, PDO::PARAM_STR);
    $stmt->bindValue(21, $subfamily, PDO::PARAM_STR);
    $stmt->bindValue(22, $genus, PDO::PARAM_STR);
    $stmt->bindValue(23, $kind, PDO::PARAM_STR);
    $stmt->execute();
    $dbh = null;
    echo "フクロウデータの登録が完了しました。<br>";
    echo "<a href='owlindex.php'>トップページへ戻る</a>";
} catch (PDOException $e) {
    echo "エラー発生: " . htmlspecialchars($e->getMessage(), ENT_QUOTES, 'UTF-8') . "<br>";
    die();
}
?>
</body>
</html>

 試したこと

送信されたデータの受け取りができていることはわかっておりますが、原因がわからず、止まってしまっています。しっかりと一文字ずつ、間違いがないかどうかの確認だけはしました。

 補足情報(FW/ツールのバージョンなど)

MacBook Air (11-inch, Early 2015)
MAMP ver3.5.1

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 3

checkベストアンサー

0

subclass に $family を設定していて $family が null なんじゃないの

owl_type,    $stmt->bindValue(1, $owl_type, PDO::PARAM_STR);
 owl_type2,    $stmt->bindValue(2, $owl_type2, PDO::PARAM_STR);
 owl_size,    $stmt->bindValue(3, $owl_size, PDO::PARAM_STR);
 owl_size2,    $stmt->bindValue(4, $owl_size2, PDO::PARAM_STR);
 hasumi,    $stmt->bindValue(5, $hasumi, PDO::PARAM_STR);
 hasumi2,    $stmt->bindValue(6, $hasumi2, PDO::PARAM_STR);
 japanese_name,    $stmt->bindValue(7, $japanese_name, PDO::PARAM_STR);
 english_name,    $stmt->bindValue(8, $english_name, PDO::PARAM_STR);
 zoological_name,    $stmt->bindValue(9, $zoological_name, PDO::PARAM_STR);
 body_length,    $stmt->bindValue(10, $distribution, PDO::PARAM_STR);
 distribution,    $stmt->bindValue(11, $body_length, PDO::PARAM_STR);
 description,    $stmt->bindValue(12, $description, PDO::PARAM_STR);
 Average_price,    $stmt->bindValue(13, $Average_price, PDO::PARAM_INT);
 kingdom,    $stmt->bindValue(14, $kingdom, PDO::PARAM_STR);
 phylum,    $stmt->bindValue(15, $phylum, PDO::PARAM_STR);
 subphylum,    $stmt->bindValue(16, $subphylum, PDO::PARAM_STR);
 family,    $stmt->bindValue(17, $class, PDO::PARAM_STR);
 subfamily,    $stmt->bindValue(18, $subclass, PDO::PARAM_STR);
 class,    $stmt->bindValue(19, $orders, PDO::PARAM_STR);
 subclass,    $stmt->bindValue(20, $family, PDO::PARAM_STR);
 orders,    $stmt->bindValue(21, $subfamily, PDO::PARAM_STR);
 genus,    $stmt->bindValue(22, $genus, PDO::PARAM_STR);
 kind,    $stmt->bindValue(23, $kind, PDO::PARAM_STR);

比較した

 順番待ち替え対策

<?php
/* バインドされた PHP 変数によってプリペアドステートメントを実行する */
$calories = 150;
$colour = 'red';
$sth = $dbh->prepare('
SELECT name, colour, calories 
  FROM fruit 
 WHERE calories < :calories AND colour = :colour');
$sth->bindValue(':calories', $calories, PDO::PARAM_INT);
$sth->bindValue(':colour', $colour, PDO::PARAM_STR);
$sth->execute();


のように namebind を利用しましょう

? の代わりに :bindname のように : と 項目名 を結合して bindValue の第一引数に :bindname を設定しましょう。

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/01/27 19:58

    調べて試行錯誤した結果、確かにfamilyがnullになっていました。

    キャンセル

0

Column 'subclass' cannot be null

「subclass は null を代入できません。」と書かれています。

$_POST['subclass'] が null になっておるんでしょうね。

こう書くのではなく、

$sql = "INSERT INTO owldata (owl_type, owl_type2, owl_size, owl_size2, hasumi, hasumi2, japanese_name, english_name, zoological_name, body_length, distribution, description, Average_price, kingdom, phylum, subphylum, family, subfamily, class, subclass, orders, genus, kind) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)";
$sql = "INSERT INTO owldata (";
$sql .= "owl_type";
$sql .= ", owl_type2";
$sql .= ", owl_size";
$sql .= ", owl_size2";
$sql .= ", hasumi";
$sql .= ", hasumi2";
$sql .= ", japanese_name";
$sql .= ", english_name";
$sql .= ", zoological_name";
$sql .= ", body_length";
$sql .= ", distribution";
$sql .= ", description";
$sql .= ", Average_price";
$sql .= ", kingdom";
$sql .= ", phylum";
$sql .= ", subphylum";
$sql .= ", family";
$sql .= ", subfamily";
$sql .= ", class";
$sql .= ", subclass";
$sql .= ", orders";
$sql .= ", genus";
$sql .= ", kind";
$sql .= ") VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)";

こんな風に書くと、間違いを発見しやすい。

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/01/27 18:47

    調べてみます。

    キャンセル

  • 2018/01/27 18:57

    データベースのテーブルにはカラムが1つ目の「ID」から25個目の「owllink」まであり、合わせて25個のカラムがあります。「owl_type」は2つ目のカラムになるのですが、登録するのはowl_typeからなのでbindValueの最初においているのですが、ここからおかしいのでしょうか?

    キャンセル

  • 2018/01/27 20:11

    バインドする変数と、owl_type〜kindまで、順番が異なるとダメです。

    キャンセル

0

お二人の方、教授いただき,誠にありがとうございました!
無事に解決しました!並び順がおかしかったみたいです。
Kosuke_Shibuya様も見やすいコードの書き方を教えていただきありがとうございました!

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 90.10%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる