質問するログイン新規登録

Q&A

解決済

1回答

282閲覧

Warning: Undefined variable 及びTrying to access array offset on value of type null を解決したい。

DENPA

総合スコア1

0グッド

0クリップ

投稿2024/08/02 13:55

0

0

実現したいこと

初心者ですが自身のホームページを作成しようと、PHPとデータベースを学んでいるのですが、下記のエラーが出て自力で解決できません。変数にnullが入ってエラーになっているのだと思うのですが、基本がわかっておらず解決のための足掛かりにする情報が欲しいです。よろしくお願いいたします。(同じ内容のエラーが複数ありますが1つでかまいません)。なお、エラーレポート設定の変更での、エラーの非表示は望んでいません。

発生している問題・分からないこと

https://qiita.com/Naughty1029/items/08b0ddeb805442916239のサイトをもとに、vscodeとxamppを使用して、ブラウザ(google chrome)でコード(register.php)を開くが、エラーの文言が表示されている。

エラーメッセージ

error

1```エラー内容ここから 2Sign Up 3Please fill this form to create an account. 4 5Username 6( ! ) Warning: Undefined variable $errors in C:\xxxxxx\xxxxxx\xxxxxx\xxxxxx\xxxxxx\php\register.php on line 108 Call Stack #TimeMemoryFunctionLocation 10.0041447728{main}( )...\register.php:0 Dump $_SERVER 7$_SERVER['REMOTE_ADDR'] = 8C:\xxxxxx\xxxxxx\xxxxxx\xxxxxx\xxxxxx\php\register.php:108:string '::1' (length=3) 9$_SERVER['REQUEST_METHOD'] = 10C:\xxxxxx\xxxxxx\xxxxxx\xxxxxx\xxxxxx\php\register.php:108:string 'GET' (length=3) 11Dump $_GET 12( ! ) Warning: Trying to access array offset on value of type null in C:\xxxxxx\xxxxxx\xxxxxx\xxxxxx\php\register.php on line 108 13Call Stack 14# Time Memory Function Location 151 0.0041 447728 {main}( ) ...\register.php:0 16 17;;;;;;;;;;;;;;;;;;;;;;;;( ! ) Deprecated: htmlspecialchars(): Passing null to parameter #1 ($string) of type string is deprecated in C:\xxxxxx\xxxxxx\xxxxxx\xxxxxx\xxxxxx\php\functions.php on line 4 18Call Stack 19# Time Memory Function Location 201 0.0041 447728 {main}( ) ...\register.php:0 21;;;;;;;;;;;;;;;;;;;;;;;; 2 0.0134 566120 h( $s = NULL ) ...\register.php:108 22;;;;;;;;;;;;;;;;;;;;;;;; 3 0.0134 566120 htmlspecialchars( $string = NULL, $flags = 3, $encoding = 'UTF-8' ) ...\functions.php:4 23" value=""> 24Password 25( ! ) Warning: Undefined variable $errors in C:\xxxxxx\xxxxxx\xxxxxx\xxxxxx\xxxxxx\php\register.php on line 113 Call Stack #TimeMemoryFunctionLocation 10.0041447728{main}( )...\register.php:0 26( ! ) Warning: Trying to access array offset on value of type null in C:\xxxxxx\xxxxxx\xxxxxx\xxxxxx\xxxxxx\php\register.php on line 113 27Call Stack 28# Time Memory Function Location 291 0.0041 447728 {main}( ) ...\register.php:0 30 31;;;;;;;;;;;;;;;;;;;;;;;; ( ! ) Deprecated: htmlspecialchars(): Passing null to parameter #1 ($string) of type string is deprecated in C:\xxxxxx\xxxxxx\xxxxxx\xxxxxx\xxxxxx\php\functions.php on line 4 32;;;;;;;;;;;;;;;;;;;;;;;;Call Stack 33;;;;;;;;;;;;;;;;;;;;;;;; # Time Memory Function Location 34;;;;;;;;;;;;;;;;;;;;;;;; 1 0.0041 447728 {main}( ) ...\register.php:0 35;;;;;;;;;;;;;;;;;;;;;;;; 2 0.0201 566120 h( $s = NULL ) ...\register.php:113 36;;;;;;;;;;;;;;;;;;;;;;;; 3 0.0201 566120 htmlspecialchars( $string = NULL, $flags = 3, $encoding = 'UTF-8' ) ...\functions.php:4 37;;;;;;;;;;;;;;;;;;;;;;;; " value=""> 38Confirm Password 39( ! ) Warning: Undefined variable $errors in xxxxxx\xxxxxx\xxxxxx\xxxxxx\xxxxxx\php\register.php on line 118 Call Stack #TimeMemoryFunctionLocation 10.0041447728{main}( )...\register.php:0 40( ! ) Warning: Trying to access array offset on value of type null in C:\xxxxxx\xxxxxx\xxxxxx\xxxxxx\xxxxxx\php\register.php on line 118 41Call Stack 42# Time Memory Function Location 431 0.0041 447728 {main}( ) ...\register.php:0 44 45;;;;;;;;;;;;;;;;;;;;;;;;( ! ) Deprecated: htmlspecialchars(): Passing null to parameter #1 ($string) of type string is deprecated in C:\xxxxxx\xxxxxx\xxxxxx\xxxxxx\xxxxxx\php\functions.php on line 4 46;;;;;;;;;;;;;;;;;;;;;;;;Call Stack 47;;;;;;;;;;;;;;;;;;;;;;;;# Time Memory Function Location 48;;;;;;;;;;;;;;;;;;;;;;;;1 0.0041 447728 {main}( ) ...\register.php:0 49;;;;;;;;;;;;;;;;;;;;;;;;2 0.0259 566120 h( $s = NULL ) ...\register.php:118 50;;;;;;;;;;;;;;;;;;;;;;;;3 0.0259 566120 htmlspecialchars( $string = NULL, $flags = 3, $encoding = 'UTF-8' ) ...\functions.php:4 51;;;;;;;;;;;;;;;;;;;;;;;;" value=""> 52;;;;;;;;;;;;;;;;;;;;;;;;Already have an account? Login here. 53```ここまで 54

該当のソースコード

```プログラム(File: register.php行番号つき)ここから 001: <?php 002: //ファイルの読み込み 003: require_once "db_connect.php"; 004: require_once "functions.php"; 005: 006: //セッションの開始 007: session_start(); 008: 009: //POSTされてきたデータを格納する変数の定義と初期化 010: $datas = [ 011: 'name' => '', 012: 'password' => '', 013: 'confirm_password' => '' 014: ]; 015: 016: //GET通信だった場合はセッション変数にトークンを追加 017: if($_SERVER['REQUEST_METHOD'] != 'POST'){ 018: setToken(); 019: } 020: //POST通信だった場合はDBへの新規登録処理を開始 021: if($_SERVER["REQUEST_METHOD"] == "POST"){ 022: //CSRF対策 023: checkToken(); 024: 025: // POSTされてきたデータを変数に格納 026: foreach($datas as $key => $value) { 027: if($value = filter_input(INPUT_POST, $key, FILTER_DEFAULT)) { 028: $datas[$key] = $value; 029: } 030: } 031: 032: // バリデーション 033: $errors = validation($datas); 034: 035: //データベースの中に同一ユーザー名が存在していないか確認 036: if(empty($errors['name'])){ 037: $sql = "SELECT id FROM users WHERE name = :name"; 038: $stmt = $pdo->prepare($sql); 039: $stmt->bindValue('name',$datas['name'],PDO::PARAM_INT); 040: $stmt->execute(); 041: if($row = $stmt->fetch(PDO::FETCH_ASSOC)){ 042: $errors['name'] = 'This username is already taken.'; 043: } 044: } 045: //エラーがなかったらDBへの新規登録を実行 046: if(empty($errors)){ 047: $params = [ 048: 'id' =>null, 049: 'name'=>$datas['name'], 050: 'password'=>password_hash($datas['password'], PASSWORD_DEFAULT), 051: 'created_at'=>null 052: ]; 053: 054: $count = 0; 055: $columns = ''; 056: $values = ''; 057: foreach (array_keys($params) as $key) { 058: if($count > 0){ 059: $columns .= ','; 060: $values .= ','; 061: } 062: $columns .= $key; 063: $values .= ':'.$key; 064: $count++; 065: } 066: 067: $pdo->beginTransaction();//トランザクション処理 068: try { 069: $sql = 'insert into users ('.$columns .')values('.$values.')'; 070: $stmt = $pdo->prepare($sql); 071: $stmt->execute($params); 072: $pdo->commit(); 073: header("location: login.php"); 074: exit; 075: } catch (PDOException $e) { 076: echo 'ERROR: Could not register.'; 077: $pdo->rollBack(); 078: } 079: } 080: } 081: ?> 082: 083: <!DOCTYPE html> 084: <html lang="en"> 085: <head> 086: <meta charset="UTF-8"> 087: <title>Sign Up</title> 088: <!-- bootstrap読み込み --> 089: <link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.5.2/css/bootstrap.min.css"> 090: <style> 091: body{ 092: font: 14px sans-serif; 093: } 094: .wrapper{ 095: width: 400px; 096: padding: 20px; 097: margin: 0 auto; 098: } 099: </style> 100: </head> 101: <body> 102: <div class="wrapper"> 103: <h2>Sign Up</h2> 104: <p>Please fill this form to create an account.</p> 105: <form action="<?php echo $_SERVER ['SCRIPT_NAME']; ?>" method="post"> 106: <div class="form-group"> 107: <label>Username</label> 108: <input type="text" name="name" class="form-control <?php echo (!empty(h($errors['name']))) ? 'is-invalid' : ''; ?>" value="<?php echo h($datas['name']); ?>"> 109: <span class="invalid-feedback"><?php echo h($errors['name']); ?></span> 110: </div> 111: <div class="form-group"> 112: <label>Password</label> 113: <input type="password" name="password" class="form-control <?php echo (!empty(h($errors['password']))) ? 'is-invalid' : ''; ?>" value="<?php echo h($datas['password']); ?>"> 114: <span class="invalid-feedback"><?php echo h($errors['password']); ?></span> 115: </div> 116: <div class="form-group"> 117: <label>Confirm Password</label> 118: <input type="password" name="confirm_password" class="form-control <?php echo (!empty(h($errors['confirm_password']))) ? 'is-invalid' : ''; ?>" value="<?php echo h($datas['confirm_password']); ?>"> 119: <span class="invalid-feedback"><?php echo h($errors['confirm_password']); ?></span> 120: </div> 121: <div class="form-group"> 122: <input type="hidden" name="token" value="<?php echo h($_SESSION['token']); ?>"> 123: <input type="submit" class="btn btn-primary" value="Submit"> 124: </div> 125: <p>Already have an account? <a href="login.php">Login here</a>.</p> 126: </form> 127: </div> 128: </body> 129: </html> ```ここまで

試したこと・調べたこと

  • teratailやGoogle等で検索した
  • ソースコードを自分なりに変更した
  • 知人に聞いた
  • その他
上記の詳細・結果

最初から出ていたエラーの内容から、function.phpを編集し、function h($s){}の中の最初にif($s === null) return '';を追加してエラー解決したものを;;;;;;;;;;;;;;;;;;;;;;;;でコメントアウトしています。

補足

windows10 pro 64bit
PHP 8.2.12

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

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

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

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

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

DENPA

2024/08/02 22:59

回答ありがとうございます。 if($_SERVER['REQUEST_METHOD'] != 'POST'){のときにも、初期化すれば、何とかなるのですね。 いい実装ではないとのことで、いい実装にしたいですが、その力量がないので、今は何とかするレベルで行こうと思います。今後の為に言葉だけで結構ですが、本当は、どうするべきだったのでしょうか?それを元に、今後改善していきたいと思います。
guest

回答1

0

ベストアンサー

Warning: Undefined variable $errors in C:\xxxxxx\xxxxxx\xxxxxx\xxxxxx\xxxxxx\php\register.php on line 108
これは if($_SERVER["REQUEST_METHOD"] == "POST"){ の条件の場合にしか$errors が定義されない事によって発生しています。

Warning: Trying to access array offset on value of type null in C:\xxxxxx\xxxxxx\xxxxxx\xxxxxx\php\register.php on line 108

これは $errors が未定義にも関わらず、 h($errors['name']) のように配列扱いとして変数にアクセスしようとしている事によって発生しています。

対策としては $errors を配列として $datas と同様に初期化しておくのが簡単かとは思います。
(項目が増えた場合に2箇所メンテナンスすることになるので、あまり良い実装とは言えないです)

また、余談になりますが data という単語は複数形ですので、 datas という単語は存在しません。
変数名としても何のデータなのか?というのがコードからは読み取りづらいので、別名を検討されたほうが良いと思います。

投稿2024/08/02 17:36

Eggpan

総合スコア3297

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.30%

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

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

質問する

関連した質問