Ajax通信部分の続き
第一ブロックのdataについては
1つでもオブジェクトとして記述する
4つのプロパティと値を記述
値の後は必ずカンマで区切る
オブジェクトなので(配列じゃないので)最終項目にもカンマを付けて大丈夫
mail.jsのon ('click'の中
//Ajax通信
$.ajax({
url:'api/get_mail_data.php',
type:'get',
data:{'i':obj.id},
dataType:'json',
})
.done(function(d){
console.log(d);
})
.fail(function(){
});
データをjsonにする
jsonエンコードしたものをエコーする
このページ(get_mail_data.php)は表示されないが、バックグラウンドで見に行っている
表現された文字列をコンソールに書き出してみましょう
書き出すべき場所にtextメソッドで書き出す
get_mail_data.phpのセレクト文がちょっとまずかったので書き換え
$sql = "SELECT subject,m_name,sendtime,content FROM mails,members WHERE mails.id=:id AND m_from=members.id";
mail.jsの.doneの部分はこうなる
.done(function(d){
//console.log(d);
$('#subject').text("件名:"+d.subject);
$('#m_name').text("送信者:"+d.m_name);
$('#sendtime').text("送信日時:"+d.sendtime);
$('#content').text(d.content);
})
自分あてのメールじゃなくてもidが分かれば見れてしまうらしい。現状だと。
get_mail_data.phpを修正
<?php
session_start();
if(empty($_GET["i"]) || empty($_SESSION["login"])){
exit();//なにもしません
}
これでログインしていないユーザは排除できた
自分あてのメールしか読んじゃいけなくする
m_toと自分のログインのidが一致してないといけなくする
これはauth.phpで発行されてたからね
$_SESSION["id"]=$row["id"];
ここですね
get_mail_data.phpを修正
$sql = "SELECT subject,m_name,sendtime,content FROM mails,members WHERE mails.id=:id AND m_from=members.id AND m_to=:m_to";
bindValueにも追加
$stmt->bindValue(":m_to",$_SESSION["id"],PDO::PARAM_INT);
確認
外からの攻撃はみなさん気を付けるけど、
ログインしたユーザ間の防御も忘れずに
メールの本文の改行の対応
名前や件名や日時には改行はないが、本文はあり得る
<br>を入れれば改行するはず
改行コードはデータに入っているので、それを<br>に変換する必要がある
そういう関数がある
get_mail_data.phpでフェッチしてるけど
contentだけはhtmlにしておいて吐き出させたい
$row["content"] = nl2br($row["content"]);
これでhtml化される
nl2br:
nl to brの意味
エヌエルツーブレイクと読む
ここも変える必要がある
ここをhtmlタグにすると。
今度はサニタイズの必要が出てきた
get_mail_data.phpにもどって
「サニタイズしたやつ」を、nl2brにかける
$row["content"] = nl2br(htmlspecialchars($row["content"]));
内側から実行されるから、改行コードはのこってサニタイズ
→ラインブレークこみの本文がhtmlメソッドで吐きだされる
改行が反映された