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

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

ただいまの
回答率

88.61%

確認ページでのphpの書き方

受付中

回答 1

投稿

  • 評価
  • クリップ 0
  • VIEW 2,010

hosayuki

score 8

以下はフォームと確認ページからなり、フォームの「原文」から単語数を獲得して確認ページに書き加えるというプログラムです。問題は確認ページでどのように「単語数の獲得」のプログラムを加えるかということです。

単語数獲得のPHP:str_word_count($str);

フォームは以下です。
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="ja" lang="ja">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<meta http-equiv="Content-Style-Type" content="text/css" />
<style type="text/css">

formWrap {

width:700px;
margin:0 auto;
color:#555;
line-height:120%;
font-size:90%;
}
table.formTable{
width:100%;
margin:0 auto;
border-collapse:collapse;
}
table.formTable td,table.formTable th{
border:1px solid #ccc;
padding:10px;
}
table.formTable th{
width:30%;
font-weight:normal;
background:#efefef;
text-align:left;
}
</style>
</head>
<body>
<div id="formWrap">
<h3>お問い合わせ</h3>
<form name="namae" method="post" action="A.php">
<table class="formTable">  
<tr>
<th>Email</th>
<td><input size="30" type="text" name="Email" requied/></td>
<td><input size="30" type="hidden" name="単語数" /></td>
</tr>
<tr>
<th>原文</th>
<td><textarea name="原文" rows="4" cols="40"></textarea></td></tr>

</table>
<p align="center">
<input type="submit" value="  確認  " /> <input type="reset" value="リセット" />
</p>
</form>
</div>
</body>
</html>

以下は確認ページです(長くてすみません):
<?php header("Content-Type:text/html;charset=utf-8"); ?>
<?php //error_reporting(E_ALL | E_STRICT);
$to = "";
$Email = "Email";
$useToken = 1;
$userMail = 1;
$subject = "お問い合わせ";
$confirmDsp = 1;
$jumpPage = 0;
$thanksPage = "";
$requireCheck = 1;
$remail = 0;
$refrom_name = "";
$re_subject = "";
$dsp_name = '';
$mailFooterDsp = 0;
$mail_check = 1;
$hankaku = 0;
$encode = "UTF-8";//このファイルの文字コード定義(変更不可)
$sendmail = 0;
$empty_flag = 0;
$post_mail = '';
$errm ='';
$header ='';
if(empty($errm)){
foreach($_POST as $key=>$val) {
if($val == "confirm_submit") $sendmail = 1;
if($key == $Email) $post_mail = h($val);
if($key == $Email && $mail_check == 1 && !empty($val)){
if(!checkMail($val)){
$errm .= "<p class=\"error_messe\">【".$key."】はメールアドレスの形式が正しくありません。</p>\n";
$empty_flag = 1;
}
}
}
}  
if(($confirmDsp == 0 || $sendmail == 1) && $empty_flag != 1){    
//差出人に届くメールをセット
if($remail == 1) {
$userBody = mailToUser($_POST,$dsp_name,$remail_text,$mailFooterDsp,$mailSignature,$encode);
$reheader = userHeader($refrom_name,$to,$encode);
$re_subject = "=?iso-2022-jp?B?".base64_encode(mb_convert_encoding($re_subject,"JIS",$encode))."?=";
}
$adminBody = mailToAdmin($_POST,$subject,$mailFooterDsp,$mailSignature,$encode,$confirmDsp);
$header = adminHeader($userMail,$post_mail,$BccMail,$to);
$subject = "=?iso-2022-jp?B?".base64_encode(mb_convert_encoding($subject,"JIS",$encode))."?=";    
mail($to,$subject,$adminBody,$header);
if($remail == 1 && !empty($post_mail)) mail($post_mail,$re_subject,$userBody,$reheader);
}
else if($confirmDsp == 1){ 
?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="ja" lang="ja">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>確認画面</title>
<style type="text/css">

formWrap {

width:700px;
margin:0 auto;
color:#555;
line-height:90%;
font-size:90%;
}
table.formTable{
width:90%;
margin:0 auto;
border-collapse:collapse;
}
table.formTable td,table.formTable th{
border:1px solid #ccc;
padding:10px;
}
table.formTable th{
width:30%;
font-weight:normal;
background:#efefef;
text-align:left;
}
p.error_messe{
margin:5px 0;
color:red;
}
</style>
</head>
<body>
<div id="formWrap">
<?php if($empty_flag == 1){ ?>
<div align="center">
<h4>入力にエラーがあります。下記をご確認の上「戻る」ボタンにて修正をお願い致します。</h4>
<?php echo $errm; ?><br /><br /><input type="button" value=" 前画面に戻る " onClick="history.back()">
</div>
<?php }else{ ?>
<h3>確認画面</h3>
<p align="center">以下の内容で間違いがなければ、「送信する」ボタンを押してください。</p>
<form action="<?php echo h($_SERVER['SCRIPT_NAME']); ?>" method="POST">
<table class="formTable">
<?php echo confirmOutput($_POST);//入力内容を表示?>
</table>
<p align="center"><input type="hidden" name="mail_set" value="confirm_submit">
<input type="hidden" name="httpReferer" value="<?php echo h($_SERVER['HTTP_REFERER']);?>">
<input type="submit" value=" 送信する ">
<input type="button" value="前画面に戻る" onClick="history.back()"></p>
</form>
<?php } ?>
</div><!-- /formWrap -->
</body>
</html>
<?php
}
if(($jumpPage == 0 && $sendmail == 1) || ($jumpPage == 0 && ($confirmDsp == 0 && $sendmail == 0))) { 
?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="ja" lang="ja">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>完了画面</title>
</head>
<body>
<div align="center">
<?php if($empty_flag == 1){ ?>
<h4>入力にエラーがあります。下記をご確認の上「戻る」ボタンにて修正をお願い致します。</h4>
<div style="color:red"><?php echo $errm; ?></div>
<br /><br /><input type="button" value=" 前画面に戻る " onClick="history.back()">
</div>
</body>
</html>
<?php }else{ ?>
送信ありがとうございました。<br />
送信は正常に完了しました。<br /><br />
<a href="<?php echo $site_top ;?>">トップページへ戻る&raquo;</a>
</div>
<?php copyright(); ?>
</body>
</html>
<?php 
}
}
else if(($jumpPage == 1 && $sendmail == 1) || $confirmDsp == 0) { 
if($empty_flag == 1){ ?>
<div align="center"><h4>入力にエラーがあります。下記をご確認の上「戻る」ボタンにて修正をお願い致します。</h4><div style="color:red"><?php echo $errm; ?></div><br /><br /><input type="button" value=" 前画面に戻る " onClick="history.back()"></div>
<?php 
}else{ header("Location: ".$thanksPage); }
}
function checkMail($str){
$mailaddress_array = explode('@',$str);
if(preg_match("/^[\.!#%&\-_0-9a-zA-Z\?\/\+]+\@[!#%&\-_0-9a-z]+(\.[!#%&\-_0-9a-z]+)+$/", "$str") && count($mailaddress_array) ==2){
return true;
}else{
return false;
}
}
function h($string) {
global $encode;
return htmlspecialchars($string, ENT_QUOTES,$encode);
}
function sjisReplace($arr,$encode){
foreach($arr as $key => $val){
$key = str_replace('\','ー',$key);
$resArray[$key] = $val;
}
return $resArray;
}
//送信メールにPOSTデータをセットする関数
function postToMail($arr){
global $hankaku,$hankaku_array;
$resArray = '';
foreach($arr as $key => $val) {
$out = '';
if(is_array($val)){
foreach($val as $key02 => $item){ 
//連結項目の処理
if(is_array($item)){
$out .= connect2val($item);
}else{
$out .= $item . ', ';
}
}
$out = rtrim($out,', ');            
}else{ $out = $val; }//チェックボックス(配列)追記ここまで
if(get_magic_quotes_gpc()) { $out = stripslashes($out); }        
//全角→半角変換
if($hankaku == 1){
$out = zenkaku2hankaku($key,$out,$hankaku_array);
}
if($out != "confirm_submit" && $key != "httpReferer") {
$resArray .= "【 ".h($key)." 】 ".h($out)."\n";
}
}
return $resArray;
}
//確認画面の入力内容出力用関数
function confirmOutput($arr){
global $hankaku,$hankaku_array;
$html = '';
foreach($arr as $key => $val) {
$out = '';   
if(is_array($val)){

foreach($val as $key02 => $item){ 
//連結項目の処理
if(is_array($item)){
$out .= connect2val($item);
}else{
$out .= $item . ', ';
}
}
$out = rtrim($out,', ');

}else{ $out = $val; }//チェックボックス(配列)追記ここまで
if(get_magic_quotes_gpc()) { $out = stripslashes($out); }
$out = nl2br(h($out));//※追記 改行コードを<br>タグに変換
$key = h($key);        
//全角→半角変換
if($hankaku == 1){
$out = zenkaku2hankaku($key,$out,$hankaku_array);
}        
$html .= "<tr><th>".$key."</th><td>".$out;
$html .= '<input type="hidden" name="'.$key.'" value="'.str_replace(array("<br />","<br>"),"",$out).'" />';
$html .= "</td></tr>\n";
}
return $html;
}
//全角→半角変換
function zenkaku2hankaku($key,$out,$hankaku_array){
global $encode;
if(is_array($hankaku_array) && function_exists('mb_convert_kana')){
foreach($hankaku_array as $hankaku_array_val){
if($key == $hankaku_array_val){
$out = mb_convert_kana($out,'a',$encode);
}
}
}
return $out;
}
//配列連結の処理
function connect2val($arr){
$out = '';
foreach($arr as $key => $val){
if($key === 0 || $val == ''){//配列が未記入(0)、または内容が空のの場合には連結文字を付加しない(型まで調べる必要あり)
$key = '';
}elseif(strpos($key,"円") !== false && $val != '' && preg_match("/^[0-9]+$/",$val)){
$val = number_format($val);//金額の場合には3桁ごとにカンマを追加
}
$out .= $val . $key;
}
return $out;
}
//管理者宛送信メールヘッダ
function adminHeader($userMail,$post_mail,$BccMail,$to){
$header = '';
if($userMail == 1 && !empty($post_mail)) {
$header="From: $post_mail\n";
if($BccMail != '') {
$header.="Bcc: $BccMail\n";
}
$header.="Reply-To: ".$post_mail."\n";
}else {
if($BccMail != '') {
$header="Bcc: $BccMail\n";
}
$header.="Reply-To: ".$to."\n";
}
$header.="Content-Type:text/plain;charset=iso-2022-jp\nX-Mailer: PHP/".phpversion();
return $header;
}
//管理者宛送信メールボディ
function mailToAdmin($arr,$subject,$mailFooterDsp,$mailSignature,$encode,$confirmDsp){
$adminBody="「".$subject."」からメールが届きました\n\n";
$adminBody .="===========================\n\n";
$adminBody.= postToMail($arr);//POSTデータを関数からセット
$adminBody.="\n===========================\n";
$adminBody.="送信された日時:".date( "Y/m/d (D) H:i:s", time() )."\n";
$adminBody.="送信者のIPアドレス:".@$_SERVER["REMOTE_ADDR"]."\n";
$adminBody.="送信者のホスト名:".getHostByAddr(getenv('REMOTE_ADDR'))."\n";
if($confirmDsp != 1){
$adminBody.="問い合わせのページURL:".@$_SERVER['HTTP_REFERER']."\n";
}else{
$adminBody.="問い合わせのページURL:".@$arr['httpReferer']."\n";
}
if($mailFooterDsp == 1) $adminBody.= $mailSignature;
return mb_convert_encoding($adminBody,"JIS",$encode);}
?>

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • papinianus

    2018/09/28 21:27

    他の修整依頼に加えて、その関数では日本語の単語はカウントできませんよ

    キャンセル

  • hosayuki

    2018/09/28 21:42

    日本語の単語ではなく英語の単語です

    キャンセル

  • papinianus

    2018/09/28 22:39

    「入力にエラーがあります。下記をご確認の上「戻る」ボタンにて修正をお願い致します。」というメッセージ、全角半角の処理、金額の項目名として"円"が出てくるなどからは入力される文字が英語であることは全く明らかではないと思います。あなたがこのコードを無から生んだとは思えないのですが、書いた人に聞いたらよいのではないでしょうか?

    キャンセル

回答 1

-2

必要な個所のみ書きます。
フォーム:
<table class="formTable">   
<tr>
<th>Email</th>
<td><input size="30" type="text" name="Email" requied/></td>
<td><input size="30" type="hidden" name="単語数" /></td>
</tr>
<tr>
<th>原文</th>
<td><textarea name="原文" rows="4" cols="40"></textarea></td></tr> 

</table>
確認ページ:以下を加える必要があると思いますがどのようにするのか分かりません。itemの意味と連結項目の目的が分かりません。

$str=$_POST("原文")
$count=str_word_count($str);

$count=$val[1]

<pre>
<?php
if(isset($POST['genbun']){
//確認画面の入力内容出力用関数
function confirmOutput($arr){
global $hankaku,$hankaku_array;
$html = '';

'''
foreach($arr as $key => $val) {
$out = '';   
if(is_array($val)){ 

foreach($val as $key02 => $item){ 
//連結項目の処理
if(is_array($item)){
$out .= connect2val($item);
}else{
$out .= $item . ', ';
}
}
$out = rtrim($out,', '); 

}else{ $out = $val; }//チェックボックス(配列)追記ここまで
if(get_magic_quotes_gpc()) { $out = stripslashes($out); }
$out = nl2br(h($out));//※追記 改行コードを<br>タグに変換
$key = h($key); 

'''       

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/09/28 22:45

    confirmOutputの引数$arrは$_POSTが渡されるので、$keyはform上のname、$valは値。$valが配列のときに項目をカンマで連結するのが、連結項目の処理、の意味です。
    そのようになるのは後のコメントにあるようにチェックボックスのときだと想定できます。つまり、チェックボックスの複数がチェックされていたときにそれらの値をカンマで連結して表示させる。
    このとき、$itemはチェックボックス一つ一つを表現します。

    キャンセル

  • 2018/09/28 22:51

    これは
    https://www.php-factory.net/mail/01.php
    を使用しました。上の回答ありがとうございます。上の回答を自分でよく理解してからご連絡します。よろしく

    キャンセル

  • 2018/09/28 22:59

    引用元はメールフォームです。単語数の獲得という質問意図には全く合わないように思えます。なぜ数あるサイトからここを利用しようと思ったのか理解に苦しみます。
    訳も分からない他人のコードを苦しんで理解する以前に、PHPの文法と自分がやりたいことを具体化する作業をなさったほうがよいと思われます。

    キャンセル

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

  • ただいまの回答率 88.61%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る