htmlspecialchars()の引数に取るとエラーがでるものリストとh関数[備忘録]

自分の勉強用です。

htmlspecialchars()で引数に取るとエラーが出るものリスト

配列 

エラー内容原文

PHP Warning:  Uncaught TypeError: htmlspecialchars(): Argument #1 ($string) must be of type string, array given in php shell code:1
Stack trace:

エラー内容翻訳

PHP警告。 Uncaught TypeError: htmlspecialchars(): 引数#1 ($string)は文字列型でなければなりません。

NULL

エラー内容原文

PHP Deprecated:  htmlspecialchars(): Passing null to parameter #1 ($string) of type string is deprecated in php shell code on line ○

エラー内容翻訳

非推奨: htmlspecialchars(): ○行目のPHPシェルコードで、文字列型のパラメータ#1 ($string)にnullを渡すことは非推奨です。

オブジェクト

事前に文字列に変換する。

リソース

リソースとは、外部リソース(ファイルやデータベースなど)にアクセスするためのハンドルを表す。

ハンドルとは、プログラム内部に外部リソース(ファイルやデータベースなどに)アクセスするために使用される識別子のこと。

このハンドルを使用することで、外部リソースへのアクセス権を確保したり、リソースへの操作を行ったりすることが出来る。

[番外編]TRUE、FALSEを渡すと

htmlspecialchars関数に渡す2番目の引数は、エンティティ変換の方法を指定するもの。

引数に「true」を渡すと、文字列がHTMLエンティティとしてエスケープされる。引数に「false」を渡すと、文字列がHTMLエンティティとしてエスケープされない場合もある。

第2引数はflags定数という。

h関数

htmlspecialchars()はHTMLの中でechoで出力する場所全てにかけてあげる必要がある。

理由

 

・ユーザーが入力したデータがXSSクロスサイトスクリプティング)である可能性があるため。

 

・現在ユーザーの入力項目じゃない場所も($_GETで渡されたページネーションのリンク番号をechoしている部分とか)将来入力項目に変更される可能性があるため。

 

・htmlspeciachars()はいくら使ったとしても速度が落ちるわけでもないし、将来変更が生じるたびにかけて上げる必要があるくらいなら最初から全てにかけてあげるほうが、保守のコストが少なくて良い。

 

ということでWeb開発では頻繁に使われる組み込み関数であるので、習慣的にユーザー関数として使われがち。

h関数でぐぐると結構いろいろな作り方が出てくるが、今回は、デフォルトの引数を設定する方法での作り方を書いていく。

 

function h($string, $flags = ENT_QUOTES, $encoding = 'UTF-8') {
if (is_string($string) === false) {
$string = '';
}

return htmlspecialchars($string, $flags, $encoding);
}

 

この関数について

・htmlspecialcharsの第2引数のflags定数、第3引数のencodingにデフォルトで使いたい引数をあらかじめセットしておける。この機能はphp5.3.0からサポートされている。違う引数を設定したい場合は、関数呼び出し先で、上書き出来るので便利。

参考↓

関数の引数にデフォルト値を指定 - PHP入門 - Webkaru

 

・htmlspecialcharsの第1引数にstring以外を食わせるとエラーになるので、ユーザの入力でstring以外が渡ってきた場合は全て空文字にする。

is_stringは組み込み関数で、引数に取った値が文字列型かどうか判定する。

文字列型だった場合は「true」を、文字列型以外だった場合は「false」を返す。

この場合、文字列型以外が渡ってきた場合に全て空文字に変換したいので、「!is_string($string) === false」という書き方をしている。

 

・$stringが文字列で渡ってきた場合はそのまま、文字列型以外の場合は空文字になって、最終的にhtmlspecialcharsの第1引数となり、returnされる。