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

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

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

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

Q&A

解決済

1回答

2855閲覧

php $_SESSIONがnullになる原因が知りたい。

退会済みユーザー

退会済みユーザー

総合スコア0

PHP

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

0グッド

0クリップ

投稿2022/02/10 08:27

編集2022/02/11 00:46

提示コードですがsignup.php$_SESSION配列を使って値取り出そうとしているのですがなぜかNULLになり以下の警告文が表示されます。signup.php///コメント部内部です。print()関数で中身を直接表示させましたが何も表示されませんこれはなぜでしょうか?参考サイトのよにsesson_start()を一番上で宣言しているのですが

参考サイト: https://teratail.com/questions/48497
参考サイト(signup部): https://note.com/koushikagawa/n/n9c6e396e2687

Deprecated: password_hash(): Passing null to parameter #1 ($password) of type string is deprecated in /opt/lampp/htdocs/sample/signup.php on line 89
signup.php

php

1<!DOCTYPE html> 2<html lang=ja> 3 <head> 4 <meta charset="utf-8"> 5 <title> 登録 </title> 6 </head> 7<body> 8 9 10 11<?php 12session_start(); 13ini_set("display_errors",1); 14error_reporting(E_ALL); 15 16 17$dsn = 'mysql:dbname=Bulletin_Board;host=localhost;charset=utf8'; 18$dbh = new PDO($dsn,"root",""); 19$dbh->setAttribute(PDO::ATTR_EMULATE_PREPARES, false); 20$dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 21$dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 22 23$urltoken = $_GET["urltoken"]; 24 25 26 27try{ 28 // DB接続 29 //flagが0の未登録者 or 仮登録日から24時間以内 30 $sql = "SELECT mail FROM preAccount WHERE token=(:urltoken) AND enable = 0 AND date > now() - interval 24 hour"; 31 $stm = $dbh->prepare($sql); 32 $dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 33 $stm->bindValue(':urltoken', $urltoken, PDO::PARAM_STR); 34 $stm->execute(); 35 36 //レコード件数取得 37 $row_count = $stm->rowCount(); 38 39 //24時間以内に仮登録され、本登録されていないトークンの場合 40 if( $row_count ==1) 41 { 42 $mail_array = $stm->fetch(); 43 $mail = $mail_array["mail"]; 44 $_SESSION['mail'] = $mail; 45 } 46 else 47 { 48 $errors['urltoken_timeover'] = "このURLはご利用できません。有効期限が過ぎたかURLが間違えている可能性がございます。もう一度登録をやりなおして下さい。"; 49 } 50 //データベース接続切断 51 $stm = null; 52 }catch (PDOException $e) 53 { 54 print('Error:'.$e->getMessage()); 55 die(); 56 } 57 58 //POSTされたデータを各変数に入れる 59 $name = isset($_POST['name']) ? $_POST['name'] : NULL; 60 $password = isset($_POST['password']) ? $_POST['password'] : NULL; 61 62 //セッションに登録 63 $_SESSION['name'] = $name; 64 $_SESSION['password'] = $password; 65///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// 66 print("test".$_SESSION["password"]); 67///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// 68 //アカウント入力判定 69 //パスワード入力判定 70 if ($password == ''): 71 $errors['password'] = "パスワードが入力されていません。"; 72 else: 73 $password_hide = str_repeat('*', strlen($password)); 74 endif; 75 76 if ($name == ''): 77 $errors['name'] = "氏名が入力されていません。"; 78 endif; 79 80 81 82 83?> 84 85<?php 86if(isset($_POST['btn_submit'])) 87{ 88///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// 89 //パスワードのハッシュ化 90 $password = password_hash($_SESSION['password'], PASSWORD_DEFAULT); 91///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// 92 //ここでデータベースに登録する 93 try{ 94 $sql = "INSERT INTO Account (`name`,`id`,`password`,`mail`,`date`) VALUES (:name,:password_hash,:mail,now())"; 95 $stm = $dbh->prepare($sql); 96 $stm->bindValue(':name', $_SESSION['name'], PDO::PARAM_STR); 97 $stm->bindValue(':mail', $_SESSION['mail'], PDO::PARAM_STR); 98 $stm->bindValue(':password_hash', $password, PDO::PARAM_STR); 99 $stm->execute(); 100 101 //pre_userのflagを1にする(トークンの無効化) 102 $sql = "UPDATE preAccount SET enable=1 WHERE mail=:mail"; 103 $stm = $dbh->prepare($sql); 104 //プレースホルダへ実際の値を設定する 105 $stm->bindValue(':mail', $mail, PDO::PARAM_STR); 106 $stm->execute(); 107 108 /* 109 * 登録ユーザと管理者へ仮登録されたメール送信 110 */ 111 112 $mailTo = $mail.','.$companymail; 113 $body = <<< EOM 114 この度はご登録いただきありがとうございます。 115 本登録致しました。 116EOM; 117 mb_language('ja'); 118 mb_internal_encoding('UTF-8'); 119 120 //Fromヘッダーを作成 121 $header = 'From: ' . mb_encode_mimeheader($companyname). ' <' . $companymail. '>'; 122 123 if(mb_send_mail($mailTo, $registation_mail_subject, $body, $header, '-f'. $companymail)) 124 { 125 $message['success'] = "会員登録しました"; 126 } 127 else 128 { 129 $errors['mail_error'] = "メールの送信に失敗しました。"; 130 } 131 132 //データベース接続切断 133 $stm = null; 134 135 //セッション変数を全て解除 136 $_SESSION = array(); 137 //セッションクッキーの削除 138 if (isset($_COOKIE["PHPSESSID"])) 139 { 140 setcookie("PHPSESSID", '', time() - 1800, '/'); 141 } 142 //セッションを破棄する 143 session_destroy(); 144 145 }catch (PDOException $e) 146 { 147 print("sample"); 148 //トランザクション取り消し(ロールバック) 149 $dbh->rollBack(); 150 $errors['error'] = "もう一度やりなおして下さい。"; 151 print('Error:'.$e->getMessage()); 152 } 153} 154?> 155 156 157<!-- page_3 完了画面--> 158<?php if(isset($_POST['btn_submit'])): ?> 159<h3>本登録されました。</h3> 160 161<!-- page_2 確認画面--> 162<?php elseif (isset($_POST['btn_confirm'])): ?> 163 <form action="<?php echo $_SERVER['SCRIPT_NAME'] ?>?urltoken=<?php print $urltoken; ?>" method="post"> 164 <p>メールアドレス:<?=htmlspecialchars($_SESSION['mail'], ENT_QUOTES)?></p> 165 <p>パスワード:<?=$password_hide?></p> 166 <p>氏名:<?=htmlspecialchars($name, ENT_QUOTES)?></p> 167 168 <input type="submit" name="btn_back" value="戻る"> 169 <input type="hidden" name="token" value="<?=$_POST['token']?>"> 170 <input type="submit" name="btn_submit" value="登録する"> 171 </form> 172 173<?php else: ?> 174<!-- page_1 登録画面 --> 175 176 <?php if(!isset($errors['urltoken_timeover'])): ?> 177 <form action="<?php echo $_SERVER['SCRIPT_NAME'] ?>?urltoken=<?php print $urltoken; ?>" method="post"> 178 <p>メールアドレス:<?=htmlspecialchars($mail, ENT_QUOTES, 'UTF-8')?></p> 179 <p>パスワード:<input type="password" name="password"></p> 180 <p>氏名:<input type="text" name="name" value="<?php if( !empty($_SESSION['name']) ){ echo $_SESSION['name']; } ?>"></p> 181 <input type="hidden" name="token" value="<?=$token?>"> 182 <input type="submit" name="btn_confirm" value="確認する"> 183 </form> 184<?php endif; ?> 185<?php endif; ?> 186 187 </body> 188</html> 189

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

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

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

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

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

yambejp

2022/02/10 08:36 編集

質問にあまり不要な情報をダラダラ載せないほうがよいでしょう。 何から何をしたときにセッションが消えてしまうかシンプルな例をつくり それを検証・改良して全体に設定すればよいでしょう
退会済みユーザー

退会済みユーザー

2022/02/10 12:13

質問内容を修正しました。
tabuu

2022/02/10 23:22

$_POST['password'] これに想定した値は入っていますか?
退会済みユーザー

退会済みユーザー

2022/02/11 00:14

printしたのですが値が入っていませんがそのソースファイル内で値を設定しているのですが
guest

回答1

0

ベストアンサー

原因が知りたい。

基本を理解していないから。
https://www.php.net/manual/ja/session.examples.basic.php

投稿2022/02/10 08:28

m.ts10806

総合スコア80850

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問