質問編集履歴

1 追記

amakusa

amakusa score 176

2015/08/20 12:42  投稿

データのsanitizeをどうしたらよいのか教えてください。
みなさんお疲れ様です。
現在、データを保存する際のサニタイズを行っているのですが、
remove_htmlをしたところ、正しい挙動でもエラーが発生してしまっていて困っています。
saveするデータが数値でしているので、そのせいだとは思うのですが、どう書いたら正しいかわかりません。
周りに気軽に聞けるcakephpをよく理解している方がいないので、どなたかご教授お願いします。
以下はその部分のコードになります。
View/Details/index.ctp
```php
  <div id="status">
     <?php
        echo "●処理状態 : ";
        if ($reportstatus == 0){
           echo "未処理";
        } else if($reportstatus == 1){
           echo "処理済み";
        } else {
           echo "不明な処理";
        }
     ?>
  </div>
  <form action="/details/update" method="post">
     <input type="radio" name="report_status" value=0><?php echo "未処理" ?> //ここの部分
     <input type="radio" name="report_status" value=1><?php echo "処理済み" ?> //ここの部分
     <input type="hidden" name="report_id" value=<?php echo $reportId ?>>
     <input id="reportstatus_submit" type="submit" value="変更">
  </form>
  <div id="status">
     <?php
        echo "●表示状態 : ";
        if($requeststatus == 9){
           echo "非表示処理";
        } else {
           echo "表示";
        }
     ?>
  </div>
  <form action="/details/update" method="post">
     <input type="radio" name="request_status" value=0><?php echo "表示" ?> //ここの部分
     <input type="radio" name="request_status" value=9><?php echo "非表示" ?> //ここの部分
     <input type="hidden" name="report_id" value=<?php echo $reportId ?>>
     <input type="hidden" name="request_id" value=<?php echo $requestId ?>>
     <input id="requeststatus_submit" type="submit" value="変更">
  </form>
  <div id="comment">
     <?php echo "●管理側コメント" ?><br />
     <?php
        if (isset($comment)) {
           echo "$comment";
        } else {
           echo "";
        }
     ?>
  </div>
  <form action="/details/update" method="post">
     <textarea name="report_comment" cols=40 rows=4 maxlength=66></textarea>
     <input type="hidden" name="report_id" value=<?php echo $reportId ?>>
     <input id="reportcomment_submit" type="submit" value="更新"><input id="reportcomment_reset" type="reset" value="リセット">
  </form>
```
Controller/DetailsController
```php
   public function update(){
       $this->autoRender = false;
       //処理状態の更新--------------------------------------------------------------
       if($this->request->is('post')){
           if(isset($this->request->data['report_status'])){
               $reportId = $this->request->data['report_id'];
               $report = $this->Report->find('all', array('conditions' => array("id" => $reportId)));//そのreportsの中にあるさっきのidがあるドキュメントの情報を取得
               $report = $this->Report->find('all', array('conditions' => array("id" => $reportId)));
               $report_obj = $report[0]["Report"];
               $report_obj["status"] = $this->request->data['report_status'];
               $report_obj["modified"] = array('modified' => date('Y-m-d H:i:s'));
               $data = $report_obj;
               $data = Sanitize::clean($data, array('remove_html' => true)); //このままだとエラーになる
               if($this->Report->save($data)){
                   //save成功
               } else {
                   //save失敗エラー画面
                   $this->Session->setFlash('処理状態の更新に失敗しました');
                   $this->Session->flash();
               }
               $this->redirect($_SERVER['HTTP_REFERER']);
           }
           //表示状態の更新--------------------------------------------------------------
           if(isset($this->request->data['request_status'])){
               $requestId = $this->request->data['request_id'];
               $request = $this->Request->find('all', array('conditions' => array("id" => $requestId)));//そのreportsの中にあるさっきのidがあるドキュメントの情報を取得
               $request = $this->Request->find('all', array('conditions' => array("id" => $requestId)));
               $request_obj = $request[0]["Request"];
               $request_obj["status"] = $this->request->data['request_status'];
               $data = $request_obj;
               $data = Sanitize::clean($data, array('remove_html' => true)); //このままだとエラーになる
               if($this->Request->save($data)){
                   // save成功 この後の処理に続く
               } else {
                   // save失敗 エラー画面
                   $this->Session->setFlash('表示状態の更新に失敗しました');
                   $this->Session->flash();
               }
               $reportId = $this->request->data['report_id'];
               $report = $this->Report->find('all', array('conditions' => array("id" => $reportId)));//そのreportsの中にあるさっきのidがあるドキュメントの情報を取得
               $report = $this->Report->find('all', array('conditions' => array("id" => $reportId)));
               $report_obj = $report[0]["Report"];
               $report_obj["modified"] = array('modified' => date('Y-m-d H:i:s'));
               $data = $report_obj;
               $data = Sanitize::clean($data, array('remove_html' => true)); //このままだとエラーになる
               if($this->Report->save($data)){
                   //save成功 この後の処理に続く
               } else {
                   //save失敗エラー画面
                   $this->Session->setFlash('時間の更新に失敗しました');
                   $this->Session->flash();
               }
               $this->redirect($_SERVER['HTTP_REFERER']);
           }
           //コメントの更新--------------------------------------------------------------
           if(isset($this->request->data['report_comment'])){
               $reportId = $this->request->data['report_id'];
               $report = $this->Report->find('all', array('conditions' => array("id" => $reportId)));//そのreportsの中にあるさっきのidがあるドキュメントの情報を取得
               $report = $this->Report->find('all', array('conditions' => array("id" => $reportId)));
               $report_obj = $report[0]["Report"];
               $report_obj["comment"] = $this->request->data['report_comment'];
               $report_obj["modified"] = array('modified' => date('Y-m-d H:i:s'));
               $data = $report_obj;
               $data = Sanitize::clean($data, array('remove_html' => true)); //このままだとエラーになる
               if($this->Report->save($data)){
                   // save成功 この後の処理に続く
               } else {
                   // save失敗 エラー画面表示
                   $this->Session->setFlash('コメントの更新に失敗しました');
                   $this->Session->flash();
               }
               $this->redirect($_SERVER['HTTP_REFERER']);
           }
       } else {
           throw new NotFoundException('このGetは見つかりませんでした。');
       }
       $this->redirect($_SERVER['HTTP_REFERER']); //処理を変更する際に、何も選択せずに変更ボタンを押してしまったときのためのredirect
       $this->redirect($_SERVER['HTTP_REFERER']); 
   }
```
コメントアウトした箇所が問題のところになります。
その他にもこれはこうした方がいいんじゃないかというのがあればぜひご助言お願いいたします。
  • PHP

    36806 questions

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

  • CakePHP

    3145 questions

    CakePHPは、PHPで書かれたWebアプリケーション開発用のフレームワークです。 Ruby on Railsの考え方を多く取り入れており、Railsの高速性とPHPの機動性を兼ね備えています。 MVCやORMなどを「規約優先の考え方」で利用するため、コードを書く手間を省くことができます。 外部のライブラリに依存しないので、単体での利用が可能です。

思考するエンジニアのためのQ&Aサイト「teratail」について詳しく知る