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

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

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

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

CakePHP

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

Q&A

解決済

1回答

2266閲覧

データのsanitizeをどうしたらよいのか教えてください。

amakusa

総合スコア176

PHP

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

CakePHP

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

0グッド

0クリップ

投稿2015/08/20 03:40

編集2015/08/20 03:42

みなさんお疲れ様です。
現在、データを保存する際のサニタイズを行っているのですが、
remove_htmlをしたところ、正しい挙動でもエラーが発生してしまっていて困っています。
saveするデータが数値でしているので、そのせいだとは思うのですが、どう書いたら正しいかわかりません。
周りに気軽に聞けるcakephpをよく理解している方がいないので、どなたかご教授お願いします。

以下はその部分のコードになります。

View/Details/index.ctp

php

1 2 <div id="status"> 3 <?php 4 echo "●処理状態 : "; 5 if ($reportstatus == 0){ 6 echo "未処理"; 7 } else if($reportstatus == 1){ 8 echo "処理済み"; 9 } else { 10 echo "不明な処理"; 11 } 12 ?> 13 </div> 14 15 <form action="/details/update" method="post"> 16 <input type="radio" name="report_status" value=0><?php echo "未処理" ?> //ここの部分 17 <input type="radio" name="report_status" value=1><?php echo "処理済み" ?> //ここの部分 18 <input type="hidden" name="report_id" value=<?php echo $reportId ?>> 19 <input id="reportstatus_submit" type="submit" value="変更"> 20 </form> 21 22 <div id="status"> 23 <?php 24 echo "●表示状態 : "; 25 if($requeststatus == 9){ 26 echo "非表示処理"; 27 } else { 28 echo "表示"; 29 } 30 ?> 31 </div> 32 33 <form action="/details/update" method="post"> 34 <input type="radio" name="request_status" value=0><?php echo "表示" ?> //ここの部分 35 <input type="radio" name="request_status" value=9><?php echo "非表示" ?> //ここの部分 36 <input type="hidden" name="report_id" value=<?php echo $reportId ?>> 37 <input type="hidden" name="request_id" value=<?php echo $requestId ?>> 38 <input id="requeststatus_submit" type="submit" value="変更"> 39 </form> 40 41 <div id="comment"> 42 <?php echo "●管理側コメント" ?><br /> 43 <?php 44 if (isset($comment)) { 45 echo "$comment"; 46 } else { 47 echo ""; 48 } 49 ?> 50 </div> 51 52 <form action="/details/update" method="post"> 53 <textarea name="report_comment" cols=40 rows=4 maxlength=66></textarea> 54 <input type="hidden" name="report_id" value=<?php echo $reportId ?>> 55 <input id="reportcomment_submit" type="submit" value="更新"><input id="reportcomment_reset" type="reset" value="リセット"> 56 </form> 57

Controller/DetailsController

php

1 public function update(){ 2 3 $this->autoRender = false; 4 //処理状態の更新-------------------------------------------------------------- 5 6 if($this->request->is('post')){ 7 8 if(isset($this->request->data['report_status'])){ 9 $reportId = $this->request->data['report_id']; 10 $report = $this->Report->find('all', array('conditions' => array("id" => $reportId))); 11 $report_obj = $report[0]["Report"]; 12 $report_obj["status"] = $this->request->data['report_status']; 13 $report_obj["modified"] = array('modified' => date('Y-m-d H:i:s')); 14 $data = $report_obj; 15 16 $data = Sanitize::clean($data, array('remove_html' => true)); //このままだとエラーになる 17 18 if($this->Report->save($data)){ 19 //save成功 20 } else { 21 //save失敗エラー画面 22 $this->Session->setFlash('処理状態の更新に失敗しました'); 23 $this->Session->flash(); 24 } 25 26 $this->redirect($_SERVER['HTTP_REFERER']); 27 28 } 29 //表示状態の更新-------------------------------------------------------------- 30 31 if(isset($this->request->data['request_status'])){ 32 $requestId = $this->request->data['request_id']; 33 $request = $this->Request->find('all', array('conditions' => array("id" => $requestId))); 34 $request_obj = $request[0]["Request"]; 35 $request_obj["status"] = $this->request->data['request_status']; 36 $data = $request_obj; 37 38 $data = Sanitize::clean($data, array('remove_html' => true)); //このままだとエラーになる 39 40 if($this->Request->save($data)){ 41 // save成功 この後の処理に続く 42 } else { 43 // save失敗 エラー画面 44 $this->Session->setFlash('表示状態の更新に失敗しました'); 45 $this->Session->flash(); 46 } 47 48 $reportId = $this->request->data['report_id']; 49 $report = $this->Report->find('all', array('conditions' => array("id" => $reportId))); 50 $report_obj = $report[0]["Report"]; 51 $report_obj["modified"] = array('modified' => date('Y-m-d H:i:s')); 52 $data = $report_obj; 53 54 $data = Sanitize::clean($data, array('remove_html' => true)); //このままだとエラーになる 55 56 if($this->Report->save($data)){ 57 //save成功 この後の処理に続く 58 } else { 59 //save失敗エラー画面 60 $this->Session->setFlash('時間の更新に失敗しました'); 61 $this->Session->flash(); 62 } 63 64 $this->redirect($_SERVER['HTTP_REFERER']); 65 66 } 67 //コメントの更新-------------------------------------------------------------- 68 69 if(isset($this->request->data['report_comment'])){ 70 $reportId = $this->request->data['report_id']; 71 $report = $this->Report->find('all', array('conditions' => array("id" => $reportId))); 72 $report_obj = $report[0]["Report"]; 73 $report_obj["comment"] = $this->request->data['report_comment']; 74 $report_obj["modified"] = array('modified' => date('Y-m-d H:i:s')); 75 $data = $report_obj; 76 77 $data = Sanitize::clean($data, array('remove_html' => true)); //このままだとエラーになる 78 79 if($this->Report->save($data)){ 80 // save成功 この後の処理に続く 81 } else { 82 // save失敗 エラー画面表示 83 $this->Session->setFlash('コメントの更新に失敗しました'); 84 $this->Session->flash(); 85 } 86 87 $this->redirect($_SERVER['HTTP_REFERER']); 88 89 } 90 91 } else { 92 throw new NotFoundException('このGetは見つかりませんでした。'); 93 } 94 95 $this->redirect($_SERVER['HTTP_REFERER']); 96 97 }

コメントアウトした箇所が問題のところになります。
その他にもこれはこうした方がいいんじゃないかというのがあればぜひご助言お願いいたします。

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

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

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

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

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

guest

回答1

0

ベストアンサー

エラーメッセージを教えて頂いていいでしょうか?

それと、view(.ctp)のフォームはFormヘルパーを使用しないとCakePHPを使用する意味が半減します。

<form>、<input>の箇所です。

投稿2015/08/20 04:12

rik

総合スコア1151

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

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

amakusa

2015/08/20 04:15

Error: Call to undefined method SessionComponent::flash() とでていました。 $this->Session->flash();の部分でエラーがでています。
rik

2015/08/20 04:29

$this->Session->flash(); は、$this->Session->setFlash();でセットしたメッセージを表示する物ですので、 $this->Session->flash(); はview内に書く必要があります。コントローラ内に書くものではありません。 view内で、 <?php print $this->Session->flash(); ?> です。
amakusa

2015/08/20 04:37

そうだったのですね。勉強不足でした。ありがとうございます。 viewの方に書き直しました。 しかしまた次のようなエラーが出ました。 Notice (1024): non-utf8 string: � [APP/Plugin/Mongodb/Model/Datasource/MongodbSource.php, line 540]
amakusa

2015/08/20 04:46 編集

public function create(Model $Model, $fields = null, $values = null) { if (!$this->isConnected()) { return false; } if ($fields !== null && $values !== null) { $data = array_combine($fields, $values); } else { $data = $Model->data; } if($Model->primaryKey !== '_id' && isset($data[$Model->primaryKey]) && !empty($data[$Model->primaryKey])) { $data['_id'] = $data[$Model->primaryKey]; unset($data[$Model->primaryKey]); } if (!empty($data['_id'])) { $this->_convertId($data['_id']); } $this->_prepareLogQuery($Model); // just sets a timer $table = $this->fullTableName($Model); try{ if ($this->_driverVersion >= '1.3.0') { $return = $this->_db ->selectCollection($table) ->insert($data, array('safe' => true)); } else { $return = $this->_db ->selectCollection($table) ->insert($data, true); } } catch (MongoException $e) { $this->error = $e->getMessage(); trigger_error($this->error); //ここが540行目 } if ($this->fullDebug) { $this->logQuery("db.{$table}.insert( :data , true)", compact('data')); } if (!empty($return) && $return['ok']) { $id = $data['_id']; if($this->config['set_string_id'] && is_object($data['_id'])) { $id = $data['_id']->__toString(); } $Model->setInsertID($id); $Model->id = $id; return true; } return false; } 該当箇所はこちらです
rik

2015/08/20 04:50

http://php.net/manual/ja/class.mongoexception.php こちらを参照ください。 「このエラーが発生するのは、非 utf8 文字列をデータベースに送信しようとしたときです。 データベースに送る文字列はすべて UTF8 でなければなりません。 」 となっていますので、この通りだと思います。
amakusa

2015/08/20 05:06

とすると、どのように対応するのがよいのでしょうか。 ・データベースに送る文字列をutf8に変える(変え方がわかりません) ・エラーが出ないようにする このどちらかでutf8に変えるのがよいと思うのですが、僕の場合だとどのように書き換えたらよいのでしょうか。
rik

2015/08/20 06:51

保存前のデータを mb_convert_encoding() なりを使用してUTF-8に変換すればいいと思います。一部でShiftJISを使用しているなどの場合は全面的にUTF-8に統一されることをお勧めします。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問