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

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

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

WordPressは、PHPで開発されているオープンソースのブログソフトウェアです。データベース管理システムにはMySQLを用いています。フリーのブログソフトウェアの中では最も人気が高く、PHPとHTMLを使って簡単にテンプレートをカスタマイズすることができます。

PHP

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

Q&A

解決済

1回答

3003閲覧

Warning: implode(): ~~~ の配列エラーを修正したい

Yariii

総合スコア61

WordPress

WordPressは、PHPで開発されているオープンソースのブログソフトウェアです。データベース管理システムにはMySQLを用いています。フリーのブログソフトウェアの中では最も人気が高く、PHPとHTMLを使って簡単にテンプレートをカスタマイズすることができます。

PHP

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

0グッド

0クリップ

投稿2020/06/03 07:59

wordpressの中で、PHPmailerで組んでいるフォームがあるのですが、基本的に問題なく送信されるのですが、ある端末(galaxy 10s)で送信したところ、送信完了ページで以下のエラーがでてしまうという報告を受けまして。

Warning: implode(): Invalid arguments passed in /〇〇/〇〇/〇〇/mailto.php

それ以外での端末ではちゃんとメールは送信されていて、エラーは今把握できるのでこの1件だけです。
上記エラーは3箇所で、mailto.phpの29行目、31行目、87行目
どれもimplode()で配列の中身を展開したい場所です。

フォームから送信すると、確認画面→送信完了画面と行きますが、エラーは送信完了画面で出ます。

以下、諸々phpコードです。

▼mailto.php
長いので後半は削っていますが、29行目、31行目、87行目のimplode()を注目して頂けると。

<?php use PHPMailer\PHPMailer\PHPMailer; use PHPMailer\PHPMailer\SMTP; use PHPMailer\PHPMailer\Exception; session_start(); require_once( dirname( __FILE__ ) . '/wp-load.php' ); get_header(); ?> <main class="Contact"> <div class="Top_main"> <img src="<?php echo esc_url(get_template_directory_uri()); ?>/img/Top-main.png" alt="Take out <?php echo $_area['kanji']; ?>"> </div> <div class="Top_catch"> <p class="Top_catch_phrase"><strong>ご注文完了!</strong></p> <p class="Top_catch_sub"><span>以上で注文は完了致しました。<br>後ほど確認のメールを送信致します。</span></p> </div> <div class="Search_keyword"> <h2 class="Search_title">ご質問・ご意見</h2> <p class="txt">当サイトは公式<span style="color:#1dcd00;">LINE</span>アカウントより、お客様のご質問・ご意見、またはご要望等を受け付けております。<br> また再度ご利用いただいた際、ご注文の完了通知を<span style="color:#1dcd00;">LINE</span>の方で行いたいと思います。ぜひお友達登録をよろしくお願い致します。<br> <a href="https://lin.ee/2tcP67SLL"><img src="https://scdn.line-apps.com/n/line_add_friends/btn/ja.png" alt="友だち追加" height="36" border="0"></a> </p> </div> <div class="Contact complete"> <div class="Contact_phpReport"> <?php $subject = "ご注文が入りました"; $sessions = $_SESSION['menu']; $bodyhead = implode("\n",$sessions); $body = '[注文店舗名]'."\n".$_SESSION['shopname']."\n\n" .'[注文内容]'."\n".implode("\n",$sessions)."\n\n" .'[お名前]'."\n".$_SESSION['name']."\n\n" .'[メールアドレス]'."\n".$_SESSION['mail']."\n\n" .'[電話番号]'."\n".$_SESSION['tel']."\n\n" .'[配達先住所]'."\n".$_SESSION['zip']." ".$_SESSION['address']." ".$_SESSION['address2']."\n\n" .'[希望日時]'."\n".$_SESSION['date']." ".$_SESSION['timehour']."時 ".$_SESSION['timeminits']."分頃\n\n" .'[備考]'."\n".$_SESSION['text']."\n\n\n\n" .'このメールはホームページのお問い合わせフォームから送信されました。'; $fromname = $_SESSION['name']; $userAddress = $_SESSION['mail']; $fromaddress = '〇〇〇〇'; $smtp_user = "〇〇〇〇"; $smtp_password = "RKbIznuX1"; require_once("phpmailer/vendor/autoload.php"); require 'phpmailer/vendor/phpmailer/phpmailer/language/phpmailer.lang-ja.php'; $mail = new PHPMailer(); $mail->IsSMTP(); $mail->SMTPDebug = 0; // debugging: 1 = errors and messages, 2 = messages only $mail->SMTPAuth = true; $mail->CharSet = 'utf-8'; $mail->SMTPSecure = 'ssl'; $mail->Host = "sv10113.xserver.jp"; $mail->Port = 465; $mail->IsHTML(false); $mail->Username = $smtp_user; $mail->Password = $smtp_password; $mail->SetFrom($smtp_user); $mail->From = $fromaddress; $mail->Subject = $subject; $mail->Body = $body; $mail->addReplyTo($userAddress, $fromname); $address = array('〇〇〇〇','〇〇〇〇'); foreach($address as $value){ $mail->addBCC($value); } $main_address = $_SESSION['shopmail']; $to = $main_address; $mail->addAddress($to); if( !$mail -> Send() ){ $message = "Message was not sent<br/ >"; $message .= "Mailer Error: " . $mailer->ErrorInfo; } else { $message = "お問い合わせありがとうございました。以下の内容で送信されました。"; $mail->ClearAddresses(); //送信先をリセット $mail->addAddress($fromaddress); $sub2 = 'ご注文ありがとうございました。'; $body2 ='[注文店舗名]'."\n".$_SESSION['shopname']."\n\n" .'[注文内容]'."\n".implode("\n",$sessions)."\n\n" .'[お名前]'."\n".$_SESSION['name']."\n\n" .'[メールアドレス]'."\n".$_SESSION['mail']."\n\n" .'[電話番号]'."\n".$_SESSION['tel']."\n\n" .'[受取方法]'."\n".$_SESSION['receive']."\n\n" .'[配達先住所]'."\n".$_SESSION['zip']." ".$_SESSION['address']." ".$_SESSION['address2']."\n\n" .'[希望日時]'."\n".$_SESSION['date']." ".$_SESSION['timehour']."時 ".$_SESSION['timeminits']."分頃\n\n" .'[備考]'."\n".$_SESSION['text']."\n\n\n\n" .'このメールはEat Home Kagaのお問い合わせフォームから送信されました。'; $mail->Subject = $sub2; $mail->Body = $body2; $mail->send(); } ?> </div> </div> </main> <?php get_footer(); ?>

▼フォーム

<?php $MenuGroup = get_field('group'); $i = 0; foreach($MenuGroup as $child): $manu_name = $child['group-menu-name']; $manu_price = $child['group-menu-price']; if($manu_name && $manu_price): $i++;?> <div class="Contact_menu"> <label for="menunum<?php echo $i; ?>"><?php echo $manu_name. ' ¥'.$manu_price; ?></label> <input type="hidden" name="menu<?php echo $i; ?>" value="<?php echo $manu_name. '¥'.$manu_price; ?>"> <input type="hidden" name="price<?php echo $i; ?>" value="<?php echo $manu_price; ?>"> <select class="Contact_menu_btn btn_num<?php echo $i; ?>" name="menunum<?php echo $i; ?>" value="" required> <?php for($inum = 0;$inum<31;$inum++): ?> <option value="<?php echo $inum; ?>"><?php echo $inum; ?></option> <?php endfor; ?> </select> <!-- <input type="number" class="Contact_menu_btn btn_num<?php echo $i; ?>" name="menunum<?php echo $i; ?>" value="0" min="0" max="100" onChange="keisan()"> --> <span class="Contact_menu_unit">個</span> </div> <?php endif; endforeach; ?><br>

▼確認画面
ここで、$_SESSION['menu']の配列を作っています。
このページで$_SESSION['menu']をforeach文で展開している箇所は正常に動いています。
送信を押した後の「送信完了ページ」ではinplode()を使っていて、そこでエラーが出ます。

<?php require_once( dirname( __FILE__ ) . '/wp-load.php' ); session_start(); //ここで$_SESSION['menu']の配列を作っています $_SESSION['menu'] = array(); for($i = 1;$i < 11;$i++){ if($_POST["menunum${i}"] == 0){ $_SESSION["menunum${i}"] = 0; }else{ $menuname = $_POST["menu${i}"]; $menunumber = $_POST["menunum${i}"]; $meta = $menuname.' *'.$menunumber; $_SESSION['menu']["menu${i}"] = $meta; $_SESSION["menunum${i}"] = $menunumber; } } //ここまで $_SESSION['shopname'] = $_POST['shopname']; $_SESSION['dir'] = $_POST['dir']; $_SESSION['postid'] = $_POST['postid']; $_SESSION['shopmail'] = $_POST['shopmail']; $_SESSION['name'] = $_POST['name']; $_SESSION['tel'] = $_POST['tel']; $_SESSION['mail'] = $_POST['mail']; $_SESSION['receive'] = $_POST['receive']; $_SESSION['zip'] = $_POST['zip']; $_SESSION['address'] = $_POST['address']; $_SESSION['address2'] = $_POST['address2']; $_SESSION['date'] = $_POST['date']; $_SESSION['timehour'] = $_POST['timehour']; $_SESSION['timeminits'] = $_POST['timeminits']; $_SESSION['text'] = $_POST['text']; get_header(); ?> <main class="Contact"> <h3 class="Single_order_title">ご注文内容の確認</h3> <section class="Contact_comfirm"> <p class="Contact_comfirm_txt" id="txt_imp">以下の内容をご確認いただき、注文のお間違えがなければ「注文確定」ボタンを押してください。<br>その後、管理センターより確定メールが送信されます。</p> <div class="Contact_comfirm_shipping top"> <p><strong>【配達(デリバリー)について】</strong><br> <対応地域と時間帯><br> 加賀市内限定<br> ・ランチタイム 11:30〜14:00 ※当日10:00迄に予約<br> ・ディナータイム 16:00〜22:00<br> <br> <条件><br> 配達は注文合計金額が2,000円以上のときに可能となります。<br> (2,000円未満の場合の配達は2,000円に満たない差額分を支払えば可能)</p> </div> <table class="Contact_comfirm_table"> <tr class="Contact_comfirm_table_item"> <th>注文店舗名:</th> <td><?php echo $_SESSION['shopname']; ?></td> </tr> <tr class="Contact_comfirm_table_item"> <th>注文内容:</th> <td> <div class=""> <!-- ここのforeach()だと正常に吐き出されます。次の送信完了画面でinplodeを使っていて、そこでエラーが出ます --> <?php $sessions = $_SESSION['menu']; foreach($sessions as $sessionmenu): ?> <span><?php echo $sessionmenu; ?></span><br> <?php endforeach; ?> </div> </td> </tr> </table> <form action="./edit.php" method="post"> <input class="Contact_comfirm_submit back" type="submit" value="内容を修正する"> </form> <form action="./mailto.php" method="post"> <input class="Contact_comfirm_submit" type="submit" value="注文確定"> </form> </section> </main> <?php get_footer(); ?>

以上になります。
原因と対処方法が分かる方いましたら、どうかご教授いただけると嬉しいです。
できればimplode()を使った方法な上で、対処方法を学びたいという気持ちです。

よろしくお願いいたします。

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

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

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

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

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

guest

回答1

0

ベストアンサー

PHP: implode - Manual

implode ( string $glue , array $pieces ) : string

$piecesがarray型になってないんじゃないかな?
(複数のメニューを選択する前提で、単品しか入力していない、もしくはそもそもゼロとか)

しらんけど。

投稿2020/06/03 08:14

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

Yariii

2020/06/03 08:30

早々のご回答ありがとうございます。 フォーム入力内容としては、「単品」「複数」「そもそも入力しない(この場合値は0になる)」の3つのパターンで検証したところ、エラーは出ませんでした。なのでarray型にはなってると認識していて(知識的にミスリードしてたらごめんなさい)、 そもそも注文が既に数百ある中での1件のエラー報告なので、原因がつかめず検証にも困ってるんですよね、、、端末の設定or仕様が影響するなんてこともあるんでしょうか?
退会済みユーザー

退会済みユーザー

2020/06/03 08:39

Warning: implode(): Invalid arguments passed が措定しているデータ型じゃないものが引数として与えられているという意味です。 "\n"自体は問題ないので確実に$piecesがarray型になってなくて、 セッション情報が消えていたりしたらどうなるかなど、var_dump()/var_export()を使って根気強く追いかけてください。 <input type="hidden" name="menu<?php echo $i; ?>"(略) を if($_POST["menunum${i}"] == 0){ で受けるのはおかしくて $menuname = $_POST["menu${i}"]; ならまだよいのですが、など変数名の引き回し方のどこかに問題点がありそう。
Yariii

2020/06/03 12:41

お返事とご指摘ありがとうございます! 確認したところ手元の端末ではarray()型として機能はしていて、セッションを消すとエラーが出ました。 該当の端末で確認ができないのが辛いですが、おそらく該当の端末のみ何かしらの理由でセッションが消されている?感じですかね、、 phpinfoも見つつまた調べていこうと思います。 何かまたお気づきの点などあれば、助言いただければ幸いです。m_ _m
Yariii

2020/06/04 00:44

解決しました! どうやらその方の端末でクッキーの受け入れを拒否していて、解除したら直りました。 クッキー拒否の場合にエラー出ないような書き方だと良かったですね、、、 この度はありがとうございましたm_ _m
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.37%

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

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

質問する

関連した質問