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

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

新規登録して質問してみよう
ただいま回答率
85.49%
PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Q&A

解決済

1回答

374閲覧

Fatal error: Uncaught exception 'PDOException'

退会済みユーザー

退会済みユーザー

総合スコア0

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

0グッド

0クリップ

投稿2017/08/12 07:12

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>

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

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

HTML

1<?php 2 3require("user.php"); 4session_start(); 5header("Content-type: text/html; charset=utf-8"); 6 7if (isset($_POST["user"], $_POST["mail"], $_POST["password"], $_POST['token'])) { 8 //CSRFチェック 9 if ($_SESSION['token'] != $_POST['token']) { 10 $_SESSION = array(); 11 session_destroy(); 12 session_start(); 13 14 $_SESSION["error_status"] = 2; 15 header("HTTP/1.1 301 Moved Permanently"); 16 header("Location: register.php"); 17 exit(); 18 } 19 20//エラー情報のリセット 21 $_SESSION["error_status"] = 0; 22 23 $id = filter_input(INPUT_POST, 'user'); 24 $mail = $_POST["mail"]; 25 $password = $_POST["password"]; 26 27//ソルト作成 28 $salt = get_salt(); 29 30//一時URLパスワード作成 31 $url_pass = get_url_password(); 32 33//ユーザー仮登録 34 35//ストレッチングパスワード 36 $hash = stretchedPassword($salt, $password); 37 38//データベース接続 39 $dsn = 'mysql:dbname=portfolio;host=localhost;charset=utf8mb4'; 40 $user = 'root'; 41 $password = ''; 42 $dbh = new PDO($dsn, $user, $password); 43 $dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 44 45//プレースホルダでSQL作成 46 $sql = "INSERT INTO USER (ID,SALT,PASSWORD,MAILADDRESS, 47 TEMP_PASS,LAST_CHANGE_PASS_TIME,RESISTER_TIME)"; 48 $sql .= "VALUES(?,?,?,?,?,?,?);"; 49 50//パラメータの型を指定 51 $stmt = $dbh->prepare($sql, array('text', 'text', 'text', 'text', 'text', 'timestamp', 'timestamp')); 52 53//パラメータを渡してSQL実行 54 $res = $stmt->execute(array($id, $salt, $hash, $mail, $url_pass, date('Y-m-d H:i:s'), date('Y-m-d H:i:s'))); 55 56//ID重複チェック ※ 57 58 try {//57行目 59 60 } catch (PDOException $e) { 61 die("接続失敗です{$e->getMessage()}"); 62 63 $dbh = null; 64 65 $_SESSION['error_status'] = 4; 66 header("HTTP/1.1 301 Moved Permanently"); 67 header("Location: register.php"); 68 exit(); 69 } 70 71 $dbh = null; 72 73//ユーザーに確認メール送信 74 $mail = str_replace(["/r", "/n"], "", $mail); 75 76 $url = "http://" . SERVER . "/register_confirm.php?" . $url_pass; 77 78 $msg = "以下のアドレスからアカウントを有効にしてください。" . PHP_EOL; 79 $msg .= "アドレスの有効期限は10分間です。" . PHP_EOL; 80 $msg .= "有効時間が過ぎたらパスワードのリセットをしてください" . PHP_EOL . PHP_EOL; 81 $msg .= $url; 82 83 mb_send_mail($mail, "ユーザー登録", $msg, "From:" . SENDER_EMAIL); 84 85} 86?> 87 88<!DOCTYPE html> 89<html> 90<head> 91 <meta charset="utf-8"> 92</head> 93<body> 94<h1>仮登録完了</h1> 95仮登録が完了しました。<br/> 96登録を完了するには送信されたメールで手続きを行ってください。<br/> 97<a href="login.php">ログイン画面へ</a><br/> 98</body> 99</html>

投稿2017/08/12 07:22

s8_chu

総合スコア14731

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2017/08/12 07:49

仰る通りにコードをいれてみたところ、 var_dump(isset($sql));false var_dump(isset($dbh));true と返ってきました。 $dbhは○$sqlが×な理由がちょっとわかりません・・・今回線の状態悪いのでまた後でやってみます。
s8_chu

2017/08/12 07:54

どこでそれらを実行しているのでしょうか
退会済みユーザー

退会済みユーザー

2017/08/12 08:21

プレースホルダでSQL作成、のコメントのすぐ上ですね、どこに入れればいいのかわからなかったのでとりあえずで...
s8_chu

2017/08/12 08:25

- `プレースホルダでSQL作成`というコメントのすぐ下でsqlという変数を定義しており、そのコメントの上では変数sqlは未定義になので`var_dump(isset($sql));`の結果は`false`になります。 - 変数dbhは`プレースホルダでSQL作成`というコメントの上で既に定義されているので`var_dump(isset($dbh));`の結果は`true`になります。
退会済みユーザー

退会済みユーザー

2017/08/12 10:25

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

2017/08/12 10:48

> 一応データベースにデータは入れられるようになったのですが今度はログインができません・・・ どういう調査をしたらいいでしょうか・・・(別の記事にしたほうがよかったらすみません) 現在の質問文などから得られる情報で解決するのは少し厳しいと思います。一度実現したいことや手元のソースコードなどを整理して改めて質問しなおすことをお勧めします。
退会済みユーザー

退会済みユーザー

2017/08/12 10:54

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.49%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問