PHP7技術者認定初級試験を受けるにあたって勉強したところを備忘録として残しておきます。
自分用のメモのようなものなので、もし間違っている箇所等ありましたらご指摘いただけますと幸いです。
エイリアス(別名)
独自につけるニックネームと覚えれば良い。
クラスや関数に別名をつけることでコードの効率化、簡略化を図ることができる。
クロスサイトスクリプティング(XSS)
悪意あるユーザがフォームから悪いデータを送信することで、サーバに意図しない動作をさせること。
■防止策
1. データをそのまま送信できなくさせる。文字からHTMLタグを取り除くstrip_tags()関数を使用
2. 特殊なHTML文字(例 & < > “)を変換させるhtmlentities()関数を使用
$_SERVER(サーバー変数)
ヘッダ情報、パス情報、スクリプトの位置のような情報を提供する。
例
① $_SERVER['PHP_SELF'];
(例) http://example.com/test.php/foo.php というアドレスの場合
$_SERVER['PHP_SELF']
/test.php/foo.php
② $_SERVER['SCRIPT_FILENAME']
現在のスクリプトの絶対パス
③ $_SERVER['SCRIPT_NAME'];
現在のスクリプトのパス。 スクリプト自身のページを指定するのに有用です。
④ $_SERVER['REQUEST_TIME_FLOAT']";
リクエスト開始時のタイムスタンプ (マイクロ秒までの精度)。
⑤ $_SERVER['REQUEST_TIME'];
リクエスト開始時のタイムスタンプ。
⑥ $_SERVER['QUERY_STRING'];
ページにアクセスした際、もし検索引数があればそれが格納される。
例
⑦ その他
$_SERVER['HTTP_CONNECTION'];
$_SERVER['HTTP_HOST'];
$_SERVER['HTTP_ACCEPT’];
など…
いずれも、「ヘッダの内容」を返す。
⑧補足
あるいは、var_dump($_SERVER);とすれば全部のserver情報を出力できる。
▼ 参考
❶PHP $_SERVER(サーバー変数)のすべて!【初心者向け基本】
❷[PHP] $_SERVER の PHP_SELF / SCRIPT_NAME / REQUEST_URI の違い
スーパーグローバル変数
- $GLOBALS ※これだけ「_」がない
- $_SERVER
- $_GET
- $_POST
- $_FILES (ファイル変数) HTTP postでアップされた値を取得する
- $_COOKIE
- $_SESSION
- $_REQUEST
- $_ENV (環境変数)
execメソッドとexecuteメソッド
メソッド名が似ているが、両方とも存在する。
■execメソッド
正しくは「PDO::exec()」と記述する。
発行したSQL文によって更新もしくは削除された「行数」を返す。1行も作用しなかった場合、PDO::exec() は「0」を返す。
DELETE文によって削除された行数をカウントします。
<?php
// DBへの接続
$dbh = new PDO('mysql:host=localhost;dbname=test', $user, $pass);
// FRUIT テーブルからcolour = 'red'に該当する全ての行を削除
$count = $dbh->exec("DELETE FROM fruit WHERE colour = 'red'");
// 削除された行数を返す
print("Deleted $count rows.\n");
?>
Deleted 1 rows.
■executeメソッド
プレースホルダーに代入すべき値を指定し、プリペアドステートメントを実行する。
prepare()とセットと覚えること。
■prepare()メソッド
クエリのパース(=SQL文の準備)を行う。
<?php
// 値の配列を渡してプリペアドステートメントを実行する
$sql = 'SELECT name, colour, calories
FROM fruit
WHERE calories < :calories AND colour = :colour';
$sth = $dbh->prepare($sql, array(PDO::ATTR_CURSOR => PDO::CURSOR_FWDONLY));
$sth->execute(array('calories' => 150, 'colour' => 'red'));
$red = $sth->fetchAll();
// 配列のキーの前にも、コロン ":" を付けることができます(オプション)
$sth->execute(array(':calories' => 175, ':colour' => 'yellow'));
$yellow = $sth->fetchAll();
?>
SQLインジェクションとプレースホルダー
SQLインジェクションとは攻撃手法の一つで、開発者が想定していないSQL文を悪意あるユーザが注入(injection)してしまうこと。
そこで登場するのがプレースホルダー。
変動する箇所を「値」として処理することで攻撃から守ることができる。
値が変動する箇所(変数)→プレースホルダ→DBに登録
例
$sql = 'SELECT * FROM users where username = :username';
このように、先頭に「:」を入れるか、もしくは「?」を入れることでプレースホルダー化できる。
fopen関数とfgets関数
fopen関数でファイルポインタをオープンし,fgets関数で「一行だけ」読み取る。
モードの例
rb 読み込み
wb 書き込み(上書き)
ab(追記)
詳細は※こちらに記載しました。
ストリームコンテキスト(ストリーム環境)
stream
連続したデータの流れの意味
context
状況、環境の意味
CSVを1行ずつ読み込んで、DBに保存したりするイメージ。
file_get_contentsだと全データを一括で取得するため、何十メガバイトもあるような大きいファイルを読み込むとPHPのメモリが足りなくなってエラーが起きたりする。
そこでこの「ストリーム」という機能がある。
file_get_contents
- ファイルの全データを読み込む
- ストリームコンテキストを使用したHTTPヘッダを送信する
- 外部サイトにアクセスする
- スクリーンスクレイピングを行うことができる
スクリーンスクレイピング
Webサイトから画面情報を抽出して利用する技術のこと。
feof関数
ファイルが最後まで読み込まれたか確認するための関数。
fgetcsv関数
CSVファイルのデータを「配列」として読み込むための関数。
cURL
HTTPリクエストにより外部サイトにアクセスするための関数。
「file_get_contents」でも外部サイトにアクセスはできるが、リクエスト方法をカスタマイズしたい時などにはcURL関数を利用する方がいいでしょう。
以下❶〜❹を記述していくことで外部サイトへアクセスできる。
❶curl_init関数 ※引数に「http_build_query()関数」を入れることでURLを作成
❷curl_setopt関数
❸curl_exec関数
❹curl_close関数
// リクエストヘッダー 設定
$headers = array(
"Content-Type: application/json",
);
/* curlセッションを初期化する */
$ch = curl_init();
/* curlオプションを設定する */
curl_setopt($ch, CURLOPT_URL, "http://www.google.com/");
/* curlを実行する */
curl_exec($ch);
/* curlセッションを終了する */
curl_close($ch);
外部サイトにアクセスするための関数は2つある
- file_get_contents
- cURL(色々カスタマイズできる)
Composer PHPunit PHAR
【Composer】
Rubyで言うところのBundlerと同じで、パッケージ管理ツール。
バージョンの依存関係を管理したりする。
依存するライブラリを設定ファイルに書いてコマンドを叩けば、ライブラリのインストールと利用準備が整う。
【PHPUnit】
ユニットテスト用のツール。
ユニットテスト=単体テスト。
単体テストとは、クラスや関数などの小さな単位で動作を確認するテストのことである。
【PHPunitのメリット】
手動では面倒なテスト手順を「自動化」して繰り返し実行できるようになること
【PHAR】
Java の JAR アーカイブと似た概念のもの。
parse_ini_fileとiniファイル
iniファイルを読み込んで、設定値として利用する関数。
実行すると連想配列として値を得ることができる。
iniファイルとは、設定ファイルのこと。
テキスト形式のシンプルなフォーマット。
プロファイラ
コンピュータプログラムが実行される様子を監視・記録し、プログラム中の各箇所の動作順や実行時間などを集計・解析するプログラム。
■プロファイラを使うメリット
・レスポンスタイムなど、パフォーマンスを改善することができる
Swift Mailer
- メールライブラリ。
- 簡単便利にメール送信ができる。
- Composerでのインストールがおすすめ。
Velocity
問題文に出てきたが、これはJavaのフレームワークなのでPHPには一切関係なし。
各PHPフレームワークのテンプレートエンジン
【Laravel】
Blade
【Symfony】
Twig
【Zend Framework】
PHP
ドキュメントルート
Webアプリに表示させるファイルを置くディレクトリのこと。
ドキュメントルート配下にコードを書かないと、Webサーバを実行してもブラウザに表示されないため注意。
PHP REPL
php -a コマンドで対話型のPHPコードの実行
mb_detect_encording
第一引数に渡した文字列の文字コードを判定
<?php
$str = "あいうえお";
echo mb_detect_encoding($str);
?>
UTF-8
mb_internal_encording
php.iniの設定値の1つ。
「内部文字エンコーディング」と呼ばれる。
■内部文字エンコーディング
マルチバイト文字列、mbstring関数(mb_***の関数)におけるデフォルトの文字エンコーディングのことを指している。
PHPの場合は「UTF-8」である。
<?php
/* 内部文字エンコーディングをUTF-8に設定 */
mb_internal_encoding("UTF-8");
/* 現在の内部文字エンコーディングを表示 */
echo mb_internal_encoding();
?>
内部文字エンコーディングに設定できる文字コード
- SJIS
- SJIS-win
- ISO-2022-JP
- JIS
- UTF-8
- EUC-JP
mb_convert_encording
mb_convert_encording関数では、文字エンコーディング(符号化)を変換(convert)することができる。
引数は、①変換する文字列, ②変換後の文字コード(to), ③変換前の文字コード(from)の順番なので気を付ける。
$str_utf8 = "あいうえお"; // UTF-8のあいうえお
$str_sjis = mb_convert_encoding($str_utf8, "SJIS", "UTF-8"); // UTF-8→SJISに変換
ヒアドキュメント
長い文字列を変数に格納するために使う。
自動的にprint出力されるから便利。
<?php
echo <<<EOF
出力する
ながーーーーい文字列を
記述します。
EOF;
?>
出力する
ながーーーーい文字列を
記述します。
printfメソッド
Fはformatのfで、ログ出力など、出力形式を統一したい場合に重宝する関数(他にもsprintfやvprintfなんかもあったりする)。
「%」は、エスケープするためのもの。
printf("%05d", '123');
00123
<?php
printf ('%s %s %s<br/>', 'Hellow', 'World', '!!');
printf('今日は %d年%d月%d日です。<br/>', date('Y'),date('m'),date('d'));
?>
Hellow World !!
今日は 2018年12月7日です。
<?php
$num = 5;
$location = '木';
$format = 'あの%sに%d匹の猿がいます。';
printf($format, $location, $num);
?>
あの木に5匹の猿がいます。
<?php
$double1 = round(0.12,2);
$double2 = round(2.28,2);
$double3 = round($double1*$double2,4);
$format = '%f×%fは%fです。';
printf($format, $double1, $double2, $double3);
?>
0.120000×2.280000は0.273600です。
0が4つなのは、round($double1*$double2,4)というように、小数点第4位まで表示すると指定しているから。
④についてはround()関数も関わってくる。
round()関数
2つ目の引数に、小数点何桁まで表示する(何桁より下の桁で四捨五入する)ということを指定できる。
■指定可能な型
b:引数を整数として扱い、2進数として表現します。
c:引数を整数として扱い、ASCII値の文字として表現します。
d:引数を整数として扱い、10進数として表現します。
e:引数を科学記法として扱います(例:1.2e+2)。精度の指定子は、PHP5.2.1以降では小数点以下の桁数を表します。それより前のバージョンでは、有効数字の桁数(ひとつ小さい値)を意味していました。
E:%eと同じですが、大文字を使います(例:1.2E+2)。
f:引数をdoubleとして扱い、浮動小数点数として表現します。
F:引数をfloatとして扱い、浮動小数点数として表現します(ロケールに依存しません)。PHP5.0.3以降で使用可能です。
g:%eおよび%fの短縮形。
G:%Eおよび%fの短縮形。
o:引数を整数として扱い、8進数として表現します。
s:引数を文字列として扱い、表現します。
u:引数を整数として扱い、符号無しの10進数として表現します。
x:引数を整数として扱い、16進数として(小文字で)表現します。
X:引数を整数として扱い、16進数として(大文字で)表現します。
trueになる条件
問題に「"php" > "perl”」の結果がtrueになるというのがあったが、理由は分からないまま……
falseになる条件(間違えたところのみ厳選)
<!-- サンプルコード -->
<?php
if('') echo 'TRUEと見なされます。';else echo 'FALSEと見なされます。';
?>
<!-- サンプルコード -->
<?php
$ary = array();
if($ary) echo 'TRUEと見なされます。';else echo 'FALSEと見なされます。';
?>
strcmp関数(cmpは、compareの略)
strcmp(文字列1, 文字列2)
文字列1と文字列2が同じ場合、0を返します。
文字列1が文字列2よりも大きければ、プラスの数値を返します。
文字列1が文字列2よりも小さければ、マイナスの数値を返します。
静的プロパティ、静的メソッド、this、self
JavaでいうところのStatic変数とStaticメソッド。
Staticメソッドに関しては「クラス変数」ともいうように、Class名.変数でも表すことができる。つまり抽象的である。
下図の覚え方
「self」 と 「$this」だけ覚えちゃえばOK。
あとはプロパティはそれぞれ「$」がついていない方につければいい。
■静的プロパティの使い方
self::$stNum += $plus;
// 静的プロパティの宣言は、Javaと同じようにメンバにstaticをつけるだけでOK
■静的メソッドの使い方
Product::calculateTotalPrice($product1, $product2, $product3);
同値演算子(===)
■等値演算子(==)と違うところ
同値演算子(===)は、値に加え、「データ型」まで含めた完全一致かを判定するということ。
ブルートフォース攻撃(総当たり攻撃, 力任せ攻撃)
暗号解読方法のひとつで、可能な組合せを全て試すやり方。
DoS/DDoS攻撃
DoS
1台のパソコンでターゲットに大量のアクセスやデータを送り、負荷をかけること
DDoS
大量のパソコンにDoS攻撃を行うこと
SQL文の基礎
CREATE TABLE flowers (flower_id INTEGER PRIMARY KEY, flower_name VARCHAR(255),price DECIMAL(6,2));
VARCHARもCHARも文字列型だが(だから名前も似ている)、VARCHARは可変長文字列という特徴がある。
VARCHAR(255)とは、最大文字数が255文字ですよ、ということ。
DECIMALは固定少数点数型と言って、正確な(=固定された)データを格納するときに使う。(金銭データなど)
create table numtest(num1 decimal(5, 2));
小数点以下が2桁、全体で5桁の数値を格納することができるので、格納できる値は、-999.99 から 999.99 の範囲になります。
DECIMAL(6,2)だと、小数点以下が2桁で全体で6桁だから、-9999.99〜9999.99の範囲という意味
SELECT * FROM flowers2 where price > 350 ORDER BY price DESC, flower_name
この場合、レコードはまず左側の「price DESC」によって「価格の降順」に並べられ、価格が同じレコードが複数存在する場合に限って、右側の「flower_name」に従って並べ替えます。
この時、「flower_name」はデフォルトでaskであることに注意!!(無指定時つまりデフォルトではaskとなる)
setcookie関数
setcookie("abc", 789, time()+60*60*24*3);
第1引数 クッキー名
第2引数 クッキーの値
第3引数 クッキーの有効期限
第4引数 クッキーを保存するパス
第5引数 クッキーが有効なドメイン
第6引数 trueと書いておいた方がいい。trueと書いておけば、https(セキュア)の時だけcookieを作る。httpの時はクッキーが作られない。
第7引数 trueと書いておいた方がいい。HTTPを通してのみクッキーにアクセスできるようになる。つまり、JavaScriptのようなスクリプト言語からはアクセスできなくなるということを意味する。XSS攻撃を防ぐことができる。
str_replaceメソッド 引数が3つ以上あるとき
1が2に置き換わると覚えればOK。
<?php
$sample = 'hello, everyone!!!!';
$good_morning = str_replace('hello', 'Good morning!',$sample);
var_dump($good_morning);
$good_afternoon = str_replace('hello', 'Good afternoon!',$sample);
var_dump($good_afternoon);
$good_evening = str_replace('hello', 'Good evening!', $sample);
var_dump($good_evening);
?>
string(27) "Good morning!, everyone!!!!"
string(29) "Good afternoon!, everyone!!!!"
string(27) "Good evening!, everyone!!!!"
file_put_contents関数
指定したファイルに文字を書き込むための関数。
<?php
$file = "foge.php";
$contents = "これは書き込みたい内容です";
file_put_contents($file, $contents);
var_dump($file);
?>
// foge.php ファイルにちゃんと書き込まれている!
これは書き込みたい内容です
session.gc_maxlifetime構成ディレクティブ(gcはガベージコレクション)
- サーバに保存されているセッションファイルを保護する有効期限(=セッションの寿命)。
- デフォルトは24分(1440秒)。
- iniファイルに書く。
session.cookie_lifetime
- Cookieの有効期限。
- デフォルトは0で"ブラウザを閉じるまで"という意味。
- iniファイルに書く。
print_r()関数とprintの違い
そもそもprintは関数ではない。print 'Hello world’;とすると「1」が返ってくる。
そのためprintは配列を扱えないが、print_rは配列も文字列もなんでも扱える。
例
<?php
$array = ['りんご', 'メロン', 'みかん'];
print_r($array);
?>
Array
(
[0] => りんご
[1] => メロン
[2] => みかん
)
$_SERVER['argv'][1]
Javaの「public static void main(String[] args)」のargsと同じ!!
つまり、以下を実行した場合「これはテストです」は$argvという配列の中に格納されることを意味する。
php sample.php これはテストです
$_SERVER['argv’][1]とすると、配列の1個目の要素を取ってくる
※[0]じゃなくて[1]と書く!!!!
argc(cはcountのc)
コマンドライン引数の数をカウントする。
そのため$argcには引数の数が格納される。
php sample.php いちご メロン スイカ
この場合 $argcは「3」となる。
array_splice関数
配列の「任意の場所」に要素を追加したり、既存の要素を置き換えたり、削除したりといった処理を行う。
includeとrequireの違い
どちらも関数を利用するときに使うもので、
外部ファイルに定義された関数を利用する際に記述する。
■存在しないファイルを宣言した場合の挙動
requireは致命的なエラーとしてプログラムを終了する
includeは警告文は出すけどプログラム自体は続行するため不適切な処理が行われる可能性あり。
アロー演算子とダブルアロー演算子
❶アロー演算子「->」
プロパティやメソッドにアクセスするときに使う
<?php
class User {
public $name; // 名前
public $age; // 年齢
public $haveFever; // 健康状態(true:悪い、false:良好)
function __construct(string $name, int $age, bool $haveFever)
{
// アロー演算子を使ってプロパティにアクセス
$this->name = $name;
$this->age = $age;
$this->haveFever = $haveFever;
}
}
$sample_user = new User("Sato Takashi", 25, false);
?>
補足:アロー演算子を複数回続けることもできる
echo $sample_user->products[$i]->name;
❷ダブルアロー演算子「=>」
連想配列を取り扱うとき、アロー関数を実装するときに使う。
$fluit_price = [
// 「キー => 値」 の形で記述する
"Apple" => 100,
"Orange" => 200,
"Grape" => 300
];
名前空間のエイリアスの作成方法
名前空間とは、文字通り名前の空間のことで、ここからここまでのコードが○○という空間に属していると定めることができる。
空間が違えば、同じ関数名を定義して使うことができる。
use My\Full\Classname as Another;
プリペアドステートメント機能(実行したい SQLをコンパイルしたテンプレート)
■メリット
-
クエリのパース (準備) が必要なのは最初の一回だけで、 同じパラメータを指定して何度でもクエリを実行することができる点
-
使用するリソースが少ないため高速に動作する点
■PHPでプリペアドステートメントを使用する方法
prepare()関数を使用する。
<?php
$userName = 'mysql';
$password = 'mysql';
// PDOオブジェクトの生成(データベース接続)
$pdo = new PDO('mysql:dbname=test;host=localhost', $userName, $password);
// プリペアドステートメントで SQLをあらかじめ用意しておく
$stmt = $pdo->prepare('select * from user where id = ? and name = ?');
※「?」は「疑問符プレースホルダー」
※「:id」など名前で使用するのは「名前付きプレースホルダー」
エミュレート機能
エミュレート機能を有効にすると、DBのプリペアドステートメント機能を使わずに、PHP側でプリペアドステートメント機能を実現できる。
エミュレート機能を使うことで不要なDBアクセスを減らすことができるので処理速度の向上が期待できます。
PDO::ATTR_EMULATE_PREPARES 属性の値に false を指定することで、PDOのエミュレート機能を無効にできる。
$pdo->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);
クエリ
SQL文のことをエンジニア界隈ではクエリと呼ぶ。
「SQL文を書く」=「クエリを投げる」=「DBへ送信(通信)する」
SELECT * FROM users WHERE name = 'ウェブカツ太郎';
サニタイズ(無害化する、置き換える)
ユーザが入力した文字データを受け取る際に、コンピュータが読めるように、一定の規則に従って別の表記に置き換えること。
引数の順番について
メソッドによって、第一引数が第二引数に変換されるものとその逆のパターンとあるため、順番に注意すること。
mb_convert_encording()メソッド
$str_sjis = mb_convert_encoding($str_utf8, "SJIS", "UTF-8");
UTF-8からSJISに変換
str_replace()メソッド
$good_morning = str_replace('hello', 'Good morning!',$sample);
helloからGood morning!に変換
file_put_contents()メソッド
file_put_contents($file, $contents);
指定したファイル($file)へ内容($contents)を書き込み
PSR (PHP Standard Recommendation)
- PHP標準勧告。
- PHPの仕様が書かれており、PHPでのプログラミング概念の標準化に役立つ。
エラーメッセージの種類
■プログラムの動作を停止させるエラー
ParseとFatalのみ!!