<form>でPOST送信する値で一部の半角英字が送れません。

解決済

回答 2

投稿 編集

  • 評価
  • クリップ 1
  • VIEW 1,491

tonny

score 69

FuelPHPでFormクラスを使って、入力フォームを作ろうとしています。
作ったページは、
・入力ページ(名前、住所、パスワード)
・確認ページ(POST送信したデータを表示)
です。

このとき、入力ページで半角英字を入力すると、一部の文字だけしか送信されません。
具体的には、例えば
「abcdefghijklmnopqrstuvwxyz」で入力すると、
確認ページで表示されるのが、「abjqvwxz」のみになります。
また、ひらがな、漢字は問題なく送れます。

このような状態のときは、どのあたりに問題があるのでしょうか?
FuelPHPのFormメソッドではなく、HTMLのformタグを使っても同様な状態です。

ご存知の方いらっしゃいましたら、ご教授の程、宜しくお願い致します。

★追記
views/index.php  

<?php echo Form::open('confirm'); ?>

<?php echo Form::label('名前', 'name'); ?><?php echo Form::input('name', Input::post('name')); ?><br />

<?php echo Form::label('住所', 'address'); ?><?php echo Form::input('address', Input::post('address')); ?><br /> 

<?php echo Form::label('パスワード', 'password'); ?><?php echo Form::input('password', Input::post('パスワード')); ?><br /> 

<?php echo Form::submit('submit', '登録する'); ?> 
<?php echo Form::close(); ?>

views/confirm.php 
<h2>こちらで登録してよろしいですか?</h2>  

<p>名前:<?php echo $input['name']; ?></p> 
<p>ユーザーネーム:<?php echo $input['address']; ?></p> 
<p>パスワード:<?php echo $input['password']; ?></p>

controller/add.php  

<?php class Controller_Add_Add extends Controller_Template { 
  public function action_index() { 
   $this->template->title = '会員登録'; 
   $this->template->content = View::forge('index'); 
  } 

  public function action_confirm() { 
   $val = $this->forge_validation(); 
   if($val->run()) { 
    $data['input'] = $val->validated(); 
    $this->template->title = '登録内容確認'; 
    $this->template->content = View::forge('confirm', $data); 
  } else { 
    $this->template->title = 'エラー';
    $this->template->content = View::forge('index'); 
    $this->template->content->set_safe('html_error',$val->show_errors()); 
   } 
 } 

  public function forge_validation() { 
   $val = Validation::forge(); 

   $val->add('name','名前'); 
   $val->add('address','住所'); 
   $val->add('password','パスワード');
   return $val; 
   } 
 }

★2/28追記
以下に変更したところ、改善しました。
(ほぼFuelPHPクラスは使っておりませんが。)
しかし、なぜ改善したのかは現在調査中です。
もしご存知の方がいらっしゃいましたら、ご教授をお願い致します。

問題点
・POST送信した際、英小文字が「abjqvwxy」しか送信できない。
(日本語、数字は問題なし)

改善点
・$_POSTではなく、$_REQUESTにしたら、英小文字も問題なく受信できた。  
(なぜRIQUESTで受信したら、英小文字までカバーできたのか?)

views/index.php  

<form action="confirm" method="post">
    <input type="text" name="name" />
    <input type="text" name="address" />
    <input type="text" name="password" />
    <input type="submit" value="登録する" />
</form>

views/confirm.php 

<h2>こちらで登録してよろしいですか?</h2>
<?php $name = $_REQUEST['name']; ?>
<?php $address = $_REQUEST['address']; ?>
<?php $password = $_REQUEST['password']; ?>
<p>名前:<?php echo $name; ?></p>
<p>住所:<?php echo $address; ?></p>
<p>パスワード:<?php echo $password; ?></p>

controller/add.php  

<?php class Controller_Add_Add extends Controller_Template { 
  public function action_index() { 
   $this->template->title = '会員登録'; 
   $this->template->content = View::forge('index'); 
  } 

  public function action_confirm() {
    $this->template->title = '登録内容確認'; 
    $this->template->content = View::forge('confirm', $data); 
  } else { 
    $this->template->title = 'エラー';
    $this->template->content = View::forge('index'); 
    $this->template->content->set_safe('html_error',$val->show_errors()); 
   } 
 } 
 }
  • 気になる質問をクリップする

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

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

  • tonny

    2016/02/28 15:57

    質問内容を編集しました。
    しかし、なぜこれで解決できたのかがイマイチよくわかりません。
    ご存知の方がいらっしゃいましたら、ご教授をお願いします。

    キャンセル

  • m6u

    2016/02/29 09:54

    場面場面で、var_dump()してみて、validate前後で受けたパラメータが改変されていないか、チェックすると解決しやすいです。

    キャンセル

  • tonny

    2016/02/29 20:54

    m6u 様
    ありがとうございます。
    dumpして確認してみます!

    キャンセル

回答 2

checkベストアンサー

+1

せっかくFuelPHPを使うのですから、
POSTで受けるパラメータは、Input::post()を通すべきでしょう。

フォームを扱うときは、Fieldsetクラスを使うようにして、

$article_form = Fieldset::forge('article');
$validation = $article_form->validation();  // validationインスタンスの取得


などと出来ます。
$article_form->repopulate();
メソッドで同じフォームに送信パラメータを復元させるのも簡単ですし。

詳しくは。

FuelPHP の Fieldset を使おう(Form の自動生成) - A Day in Serenity @ kenjis
http://d.hatena.ne.jp/Kenji_s/20120130/1327911897

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2016/02/29 20:56

    ご回答いただき、ありがとうございます。
    Fieldsetクラスは参考書で学習した程度で、全く身についておりませんでした。。。
    ご指摘いただいた点について、検討してみます。

    キャンセル

+1

FuelPHPは経験がなくよく分かりませんが、
気になるところが2点あります。

1.
views/index.phpでは、ニックネームのinput nameが「address」ですが、

//views/index.php
<?php echo Form::label('ニックネーム', 'address'); ?><?php echo Form::input('address', Input::post('address')); ?><br />


controller/add.phpのvalidationおよび、views/confirm.phpでは、「nickname」と書いてあります。

//controller/add.php
$val->add('nickname','ニックネーム');
//views/confirm.php
<p>ユーザーネーム:<?php echo $input['nickname']; ?></p>


2.views/index.php

<?php echo Form::input('password', Input::post('パスワード')); ?><br />


<?php echo Form::input('password', Input::post('password')); ?><br />


ではないでしょうか。

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2016/02/25 12:55

    加えて、$val->add()で第3パラメータを省略しているので実質バリデーションが聞いていない状況もありますね。

    キャンセル

  • 2016/02/27 11:46

    ご回答いただき、ありがとうございます!
    早速確認してみます!

    キャンセル

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

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