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

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

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

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

Q&A

解決済

2回答

6666閲覧

Warning: Illegal string offsetというエラーが表示される

VAAAANG

総合スコア1

PHP

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

0グッド

1クリップ

投稿2021/05/25 08:54

編集2021/05/26 05:33

前提・実現したいこと

元々ロリポップにて運用していたHPをエックスサーバに移管したところ
お問い合わせフォームにて必須項目のテキストを入れずに確認画面ボタンを押すと下記のエラーが表示されるようになりました。

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

Warning: Illegal string offset 'name' in /home/xs000000/~/page-form.php on line 48

該当のソースコード

if( isset($_POST['check']) ){ $items = $_POST['items']; $blank = false;   if( !$items['name'] ) $blank = $error['name'] = 'お名前が入力されていません'; ...  $_SESSION["items"] = $items; }

試したこと

調べたところPHPのバージョンが7だとエラーが表示されるようで、phpファイルの下記の記述を変更するのが解決策だとは思うのですが、私はプログラマーではなく申し訳ありませんがあまりよく分からず...

$text = array(); $blank = true; $items = $_SESSION["items"];

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

下記がだいたいのコードになります。
※今回の質問と関係ない記述(htmlタグなど)は省いています。

<?php session_start(); function h($s) { return htmlspecialchars($s, ENT_QUOTES, "UTF-8"); } $text = array(); $blank = true; $items = $_SESSION["items"]; $client_name = '企業名'; $client_address = "企業メールアドレス"; if( isset($_POST['check']) ){ $items = $_POST['items']; $blank = false; if( !$items['name'] ) $blank = $error['name'] = 'お名前が入力されていません'; if( !$items['ruby'] ) $blank = $error['ruby'] = 'ふりがなが入力されていません'; if( !preg_match("/^[^@]+@[^@]+$/",$items['mail01']) ) $blank = $error['mail01'] = '正しい形式のメールアドレスをご入力ください'; if( !$items['mail01'] ) $blank = $error['mail01'] = 'メールアドレスが入力されていません'; if( !$items['mail02'] ) $blank = $error['mail02'] = 'メールアドレスが入力されていません'; if( $items['mail01'] !== $items['mail02'] ) $blank = $error['mail02'] = '上記メールアドレスと異なります'; if( !($items['tel01'] && $items['tel02'] && $items['tel03']) ) $blank = $error['tel'] = '電話番号が入力されていません'; $_SESSION["items"] = $items; } if( isset($_POST['send']) ){ setcookie( session_name(), '', time()-42000, '/' ); session_destroy(); $_SESSION['send_num'] = $send_num; $message = <<<EOT ■ お名前 $items[name] ■ ふりがな $items[ruby] ■ メールアドレス $items[mail01] ■ 電話番号 $items[tel01] - $items[tel02] - $items[tel03] ■ ご住所 $items[pc01] - $items[pc02] $items[address] EOT; $client_message = <<<EOT ホームページからお問い合わせがありました。 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ $message ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ $home_url EOT; $user_message = <<<EOT $items[name] 様 このたびは、 $client_name にお申込みいただき、ありがとうございます。 近日担当者よりご連絡を差し上げますので、しばらくお待ちくださいませ。 $message EOT; mb_language("japanese"); mb_internal_encoding("UTF-8"); mb_convert_encoding($client_address,"UTF-8"); mb_convert_encoding($client_message,"UTF-8"); $user_message = mb_convert_encoding($user_message,"UTF-8"); if(!mb_send_mail($client_address,$items['name']."さんよりお問い合わせがありました",$client_message,"From: ".$client_address)){exit("e");} if(!mb_send_mail($items['mail01'],"お問い合わせありがとうございました",$user_message,"From:".mb_encode_mimeheader($client_name)."<".$client_address.">")){exit("e");} $sent = true; $blank = false; header('Location: /thanks/'); exit; } ?> <?php if( $blank ){ ?> <p>下記項目を入力の上、「確認画面へ進む」を押してください。</p> <p>お申し込み受付後、受付完了メールをお送りします。※は必須項目です。</p> <?php }elseif( !isset($sent) ){ ?> <p>以下の内容でよろしければ「送信する」ボタンを押して下さい</p> <?php } else { ?> <p>送信が完了しました。</p> <p>このたびはお申込みいただき、ありがとうございます。</p> <p>近日担当者よりご連絡を差し上げますので、しばらくお待ちくださいませ。</p> <?php } ?> <form action="#anc-contact" method="post" class="contact-form"> <?php if( $blank ){ ?> <table class="contact-form-table"> <tr> <th><label for="name">お名前(全角)</label><span>*</span></th> <td> <?php if( isset($error['name']) ) echo '<p class="error-text">' . h($error['name']) . '</p>'; ?> <input type="text" name="items[name]" value="<?php echo h($items['name']); ?>" id="name" class="input-mid" placeholder="例) 山田 太郎"> </td> </tr> <tr> <th><label for="ruby">ふりがな(全角)</label><span>*</span></th> <td> <?php if( isset($error['ruby']) ) echo '<p class="error-text">' . h($error['ruby']) . '</p>'; ?> <input type="text" name="items[ruby]" value="<?php echo h($items['ruby']); ?>" id="ruby" class="input-mid" placeholder="例) やまだ たろう"> </td> </tr> <tr> <th><label for="mail01">メールアドレス(半角)</label><span>*</span></th> <td> <?php if( isset($error['mail01']) ) echo '<p class="error-text">' . h($error['mail01']) . '</p>'; ?> <input type="email" name="items[mail01]" value="<?php echo h($items['mail01']); ?>" id="mail01" class="input-big" placeholder="例) xxxxxx@example.com"> </td> </tr> <tr> <th><label for="mail02">確認用メールアドレス(半角)</label><span>*</span></th> <td> <?php if( isset($error['mail02']) ) echo '<p class="error-text">' . h($error['mail02']) . '</p>'; ?> <input type="email" name="items[mail02]" value="<?php echo h($items['mail02']); ?>" id="mail02" class="input-big" placeholder="例) xxxxxx@example.com"> </td> </tr> <tr> <th><label for="tel">電話番号(半角)</label><span>*</span></th> <td> <?php if( isset($error['tel']) ) echo '<p class="error-text">' . h($error['tel']) . '</p>'; ?> <input type="tel" name="items[tel01]" value="<?php echo h($items['tel01']); ?>" class="input-min" id="tel"> - <input type="tel" name="items[tel02]" value="<?php echo h($items['tel02']); ?>" class="input-min"> - <input type="tel" name="items[tel03]" value="<?php echo h($items['tel03']); ?>" class="input-min"> </td> </tr> <tr> <th><label for="pc01">ご住所</label></th> <td> 〒 <input type="tel" name="items[pc01]" value="<?php echo h($items['pc01']); ?>" id="pc01" class="input-min">- <input type="tel" name="items[pc02]" value="<?php echo h($items['pc02']); ?>" class="input-min"> <input type="button" value="郵便番号から自動入力" onclick="AjaxZip3.zip2addr('items[pc01]','items[pc02]','items[address]','items[address]');"> <input type="text" name="items[address]" value="<?php echo h($items['address']); ?>" class="input-big mt5"> </td> </tr> </table> <p class="submits"><input type="submit" value="入力内容を確認する" name="check"></p> <?php }elseif( !isset($sent) ){ ?> <table class="contact-form-table"> <tr> <th>お名前</th> <td><?php echo h($items['name']); ?></td> </tr> <tr> <th>ふりがな</th> <td><?php echo h($items['ruby']); ?></td> </tr> <tr> <th>メールアドレス</th> <td><?php echo h($items['mail01']); ?></td> </tr> <tr> <th>電話番号</th> <td><?php echo h($items['tel01']); ?> - <?php echo h($items['tel02']); ?> - <?php echo h($items['tel03']); ?></td> </tr> <tr> <th>ご住所</th> <td><?php echo h($items['pc01']); ?>-<?php echo h($items['pc02']); ?><br><?php echo h($items['address']); ?></td> </tr> </table> <p class="submits"> <input type="submit" name="return" value="入力内容を変更する"> <input type="submit" name="send" value="送信する"> </p> <?php } ?>

現サーバPHPバージョン:7.4.13
旧サーバPHPバージョン:5.6

すみませんが、どなたかご教示いただけますと幸いですm(__)m

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

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

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

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

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

m.ts10806

2021/05/25 09:33

コードは一部ではなく全体がわかるように提示してください。 page-form.php on line 48 ということは少なくとも48行はあるんでしょうし
itagagaki

2021/05/25 10:26

もともとのPHPのバージョンも一応書いてください。 5系ですかね? (移行は結構大変かも)
VAAAANG

2021/05/26 05:35

コードをほぼすべて提示いたしました。 PHPのバージョンは5系になります。 WPのサイト含めサーバ移管はこれまで基本問題なく行えていたのですが今回のようなケースが初めてで...。 何卒宜しくお願い致します。
itagagaki

2021/05/26 09:43 編集

(編集済み。間違えました)
itagagaki

2021/05/26 15:17

質問では48行目がエラーになっているので、その48行目はどこにあたるのかを調べて質問に追記していただけますか?それが重要な手掛かりになります。 あと、出ているのは「エラー」ではなく「警告(Warning)」ですね。実際は。 それで、メッセージが表示される以外に何か不都合は出ているのでしょうか?
VAAAANG

2021/05/27 04:06

if( !$items['name'] ) $blank = $error['name'] = 'お名前が入力されていません'; こちらが48行目のコードになります。 すみませんエラーが表示されるまでの処理を説明しておりませんでした...。 フォームの内容をすべて記入すると問題ないのですが、お名前などの必須項目に文字を入力せずに確認画面に移りますと該当エラー(警告)がページ上部に表示されるような状態です。
itagagaki

2021/05/27 04:25

$items = $_POST['items']; の直前に var_dump($_POST); を追加して、該当の警告が出るような操作をして、すると警告の前に $_POST の内容が表示されると思いますので、それを教えていただけますか?
VAAAANG

2021/05/27 04:36

最初の画面では array(0) { } と表示され、お名前やメールアドレス等の必須項目に設定している情報も未入力の状態で確認画面へのボタンを押すと下記のような記述が表示されました。 array(2) { ["items"]=> array(10) { ["name"]=> string(0) "" ["ruby"]=> string(0) "" ["mail01"]=> string(0) "" ["mail02"]=> string(0) "" ["tel01"]=> string(0) "" ["tel02"]=> string(0) "" ["tel03"]=> string(0) "" ["pc01"]=> string(0) "" ["pc02"]=> string(0) "" ["address"]=> string(0) "" } ["check"]=> string(27) "入力内容を確認する" } こちらの記述の下に下記警告が表示されております。 Warning: Illegal string offset 'name' in /home/xs000000/~/page-form.php on line 49 Warning: Illegal string offset 'ruby' in /home/xs000000/~/page-form.php on line 50 Warning: Illegal string offset 'mail01' in /home/xs000000/~/page-form.php on line 52 Warning: Illegal string offset 'mail01' in /home/xs000000/~/page-form.php on line 53 Warning: Illegal string offset 'mail02' in /home/xs000000/~/page-form.php on line 54 Warning: Illegal string offset 'tel' in /home/xs000000/~/page-form.php on line 57
guest

回答2

0

たぶんですが、わかりました。
$items[name]といった書き方をしているところがありますね。
これは$items['name']に直してみてください。
bubyとかmail01とかもすべてです。

たしか、PHP5では許容されていたが、PHP7ではダメになったんだったと思います。
(あれ?でもwarningなのかな?)

※この回答は勘違いでした※

投稿2021/05/26 09:50

編集2021/05/26 15:13
itagagaki

総合スコア8402

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

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

VAAAANG

2021/05/26 14:42 編集

コメントありがとうございます。 送られてくるメールの文章のところですよね? ご指摘があったようにこちら修正をしたのですが下記のようなエラーが表示されてしまいました、、、。 Parse error: syntax error, unexpected '' (T_ENCAPSED_AND_WHITESPACE), expecting '-' or identifier (T_STRING) or variable (T_VARIABLE) or number (T_NUM_STRING) in /home/xs000000/〇〇.jp/~/page-form.php on line 71 このサイトで重大なエラーが発生しました。
itagagaki

2021/05/26 15:12

確かにそうなりますね。この回答は勘違いでした。すみません。
guest

0

ベストアンサー

今度こそわかりました。
問題は、おそらく$error['name']です。
提示されているコードにはありませんが、どこかで$errorに配列ではない値がセットされているということが推測されます。
もし$errorを空に初期化して問題ないのでしたら、

PHP

1$text = array(); 2$error = array();

のように$errorを配列として初期化するコードを加えてみてください。

投稿2021/05/27 05:48

itagagaki

総合スコア8402

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

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

VAAAANG

2021/05/27 07:56

警告が非表示になりその他エラーも出なくなりました! 質問の仕方や基本的な知識が足りずお手間を取らせてしまい大変申し訳ございませんでした。 とても助かりました。ありがとうございました。 これを機に勉強します。。。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問