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

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

ただいまの
回答率

90.34%

Fatal error: Uncaught exception 'PDOException'

解決済

回答 1

投稿

  • 評価
  • クリップ 0
  • VIEW 1,162

yuus2733

score 109

Fatal error: Uncaught exception 'PDOException' with message 'SQLSTATE[23000]: Integrity constraint violation: 1048 Column 'ID' cannot be null' in C:\xampp\htdocs\portfolio\register_submit.php:62 Stack trace: #0 C:\xampp\htdocs\portfolio\register_submit.php(62): PDOStatement->execute(Array) #1 {main} thrown in C:\xampp\htdocs\portfolio\register_submit.php on line 62
register_submit.php
というエラーが投げられました。

tryかcatchの中に必要な命令を書き込めば、解消できるものなのでしょうか?
ご教示お願いします。(参考にできるサイト等ありましたら教えていただきたいです。)

<?php

require("function.php");
session_start();
header("Content-type: text/html; charset=utf-8");

//CSRFチェック
if($_SESSION['token'] != $_POST['token']){
     $_SESSION = array();
     session_destroy();
     session_start();

     $_SESSION["error_status"] = 2;
     header("HTTP/1.1 301 Moved Permanently");
     header("Location: register.php");
     exit();
}

//エラー情報のリセット
$_SESSION["error_status"] = 0;

$id = filter_input(INPUT_POST,'user');
$mail = $_POST["mail"];
$password = $_POST["password"];

//ソルト作成
$salt = get_salt();

//一時URLパスワード作成
$url_pass = get_url_password();

//ユーザー仮登録

//ストレッチングパスワード
$hash = stretchedPassword($salt,$password);

//データベース接続
$dsn = 'mysql:dbname=portfolio;host=localhost;charset=utf8mb4';
$user = 'root';
$password = '';
$dbh = new PDO($dsn,$user,$password);
$dbh->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_EXCEPTION);

//プレースホルダでSQL作成
$sql = "INSERT INTO USER (ID,SALT,PASSWORD,MAILADDRESS,
          TEMP_PASS,LAST_CHANGE_PASS_TIME,RESISTER_TIME)";
          $sql .= "VALUES(?,?,?,?,?,?,?);";

//パラメータの型を指定
$stmt = $dbh->prepare($sql,array('text','text','text','text','text','timestamp','timestamp'));

//パラメータを渡してSQL実行
$res = $stmt->execute(array($id,$salt,$hash,$mail,$url_pass,date('Y-m-d H:i:s'),date('Y-m-d H:i:s')));

//ID重複チェック ※

try{//57行目

}catch(PDOException $e){
     die("接続失敗です{$e->getMessage()}");

     $dbh = null;

     $_SESSION['error_status'] = 4;
     header("HTTP/1.1 301 Moved Permanently");
     header("Location: register.php");
     exit();
}

$dbh = null;

//ユーザーに確認メール送信
$mail = str_replace(["/r" , "/n"] , "" , $mail);

$url = "http://" . SERVER . "/register_confirm.php?" . $url_pass;

$msg = "以下のアドレスからアカウントを有効にしてください。" . PHP_EOL;
$msg .= "アドレスの有効期限は10分間です。" . PHP_EOL;
$msg .= "有効時間が過ぎたらパスワードのリセットをしてください" . PHP_EOL . PHP_EOL;
$msg .= $url;

mb_send_mail($mail,"ユーザー登録",$msg,"From:" . SENDER_EMAIL);

?>

<!DOCTYPE html>
<html>
<head>
  <meta charset="utf-8">
</head>
<body>
  <h1>仮登録完了</h1>
  仮登録が完了しました。<br />
  登録を完了するには送信されたメールで手続きを行ってください。<br />
<a href="login.php">ログイン画面へ</a><br />
</body>
</html>
  • 気になる質問をクリップする

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

回答 1

checkベストアンサー

+2

IDという列にはnullを入れられないという意味です。issetを使用してみてはいかがでしょうか?

<?php

require("user.php");
session_start();
header("Content-type: text/html; charset=utf-8");

if (isset($_POST["user"], $_POST["mail"], $_POST["password"], $_POST['token'])) {
    //CSRFチェック
    if ($_SESSION['token'] != $_POST['token']) {
        $_SESSION = array();
        session_destroy();
        session_start();

        $_SESSION["error_status"] = 2;
        header("HTTP/1.1 301 Moved Permanently");
        header("Location: register.php");
        exit();
    }

//エラー情報のリセット
    $_SESSION["error_status"] = 0;

    $id = filter_input(INPUT_POST, 'user');
    $mail = $_POST["mail"];
    $password = $_POST["password"];

//ソルト作成
    $salt = get_salt();

//一時URLパスワード作成
    $url_pass = get_url_password();

//ユーザー仮登録

//ストレッチングパスワード
    $hash = stretchedPassword($salt, $password);

//データベース接続
    $dsn = 'mysql:dbname=portfolio;host=localhost;charset=utf8mb4';
    $user = 'root';
    $password = '';
    $dbh = new PDO($dsn, $user, $password);
    $dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

//プレースホルダでSQL作成
    $sql = "INSERT INTO USER (ID,SALT,PASSWORD,MAILADDRESS,
          TEMP_PASS,LAST_CHANGE_PASS_TIME,RESISTER_TIME)";
    $sql .= "VALUES(?,?,?,?,?,?,?);";

//パラメータの型を指定
    $stmt = $dbh->prepare($sql, array('text', 'text', 'text', 'text', 'text', 'timestamp', 'timestamp'));

//パラメータを渡してSQL実行
    $res = $stmt->execute(array($id, $salt, $hash, $mail, $url_pass, date('Y-m-d H:i:s'), date('Y-m-d H:i:s')));

//ID重複チェック ※

    try {//57行目

    } catch (PDOException $e) {
        die("接続失敗です{$e->getMessage()}");

        $dbh = null;

        $_SESSION['error_status'] = 4;
        header("HTTP/1.1 301 Moved Permanently");
        header("Location: register.php");
        exit();
    }

    $dbh = null;

//ユーザーに確認メール送信
    $mail = str_replace(["/r", "/n"], "", $mail);

    $url = "http://" . SERVER . "/register_confirm.php?" . $url_pass;

    $msg = "以下のアドレスからアカウントを有効にしてください。" . PHP_EOL;
    $msg .= "アドレスの有効期限は10分間です。" . PHP_EOL;
    $msg .= "有効時間が過ぎたらパスワードのリセットをしてください" . PHP_EOL . PHP_EOL;
    $msg .= $url;

    mb_send_mail($mail, "ユーザー登録", $msg, "From:" . SENDER_EMAIL);

}
?>

<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8">
</head>
<body>
<h1>仮登録完了</h1>
仮登録が完了しました。<br/>
登録を完了するには送信されたメールで手続きを行ってください。<br/>
<a href="login.php">ログイン画面へ</a><br/>
</body>
</html>

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2017/08/12 19:25

    ありがとうございます!
    早速定義後の位置に入れ替えてみたところtrueになりました。
    変数定義→動作確認のための関数をいれるのが使い方って言うことですね。
    (言われて考え直すと当然なのですが、ひたすら手打ちで写してただけなので色々な理解が追いついてないです・・・)
    一応データベースにデータは入れられるようになったのですが今度はログインができません・・・
    どういう調査をしたらいいでしょうか・・・(別の記事にしたほうがよかったらすみません)

    キャンセル

  • 2017/08/12 19:48

    > 一応データベースにデータは入れられるようになったのですが今度はログインができません・・・
    どういう調査をしたらいいでしょうか・・・(別の記事にしたほうがよかったらすみません)

    現在の質問文などから得られる情報で解決するのは少し厳しいと思います。一度実現したいことや手元のソースコードなどを整理して改めて質問しなおすことをお勧めします。

    キャンセル

  • 2017/08/12 19:54

    わかりました、ありがとうございます!

    キャンセル

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

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

同じタグがついた質問を見る