okinawa

勉強メモ

PHPの基本

特徴

HTMLの中に記述できる

<body>
<?php $i = 10 ?>
</body>

インポート

基本的にはrequire_onceでよさそう。

require('test.php');
require_once('test.php');
include('test.php');
include_once('test.php');

PHPファイルのインポート↓ https://it.becrazy.jp/article/php-import

変数

変数名の前に$をつける。

$i = 10;

定数

const $j = 20;

関数

function hoge(hikisuu) {
// 何か処理
return ~ ;
}

引数と戻り値には型指定ができる 引数:string 戻り値:int

function hoge(string hikisuu): int { 
// 何か処理 
return ~ ; 
}

配列

$hoge = array(1, 2, 3); //配列宣言
$hoge[0]; // 配列の取り出し

配列の末尾に要素追加

$hoge = array(1, 2, 3); //配列宣言
$hoge[] = 4; 

配列の上書き

$hoge = array(1, 2, 3); //配列宣言
$hoge[2] = 4; 

連想配列

Javaでいう所のMapみたいなの。

$array = array('apple'=>'りんご', 'peach'=>'もも', 'pear'=>'なし');

appleがキーでりんごが値。

取出し

$array[apple]; // りんご

条件文

if,for,whileはJavaと全部同じ。

foreach文

普通の配列

$hoge = array(1, 2, 3); //配列宣言
foreach($hoge as $num) {
    echo $num;
}

連想配列

$array = array('apple'=>'りんご', 'peach'=>'もも', 'pear'=>'なし');
foreach($hoge as $key => $num) { echo $num;}
foreach($hoge as $num) { echo $num;} //省略バージョン。結果は同じ。

文字列

文字列の結合

ドット「.」でつなぐ

"あういうえお"."かきくけこ";

シングルクォートとダブルクォートの違い

ダブルは変数が展開される  シングルは変数が展開されない

$data1 = "サポートサイト\t「{$title}」へ<br />"; 
$data2 = 'サポートサイト\t「{$title}」へ<br />'; 
print $data1; //サポートサイト 「サーバサイド技術の学び舎 - WINGS」へ
print $data2; //サポートサイト\t「{$title}」へ

var_dump

エラー出た時、変数の中身を見るのに重宝する。

$x = ['a','b','c']; 
var_dump($x);

日付

$today = new DateTime(); 
print($today->format('Y年 m月 d日 (D) G時 i分 s秒')); // 2021年 03月 29日 (Mon) 11時 11分 17秒

クラス

class SampleClass 
{ 
    public function publicFnction() 
    { 
        print('public呼び出し'); 
    } 
} 
$sample_class = new SampleClass();  // newでインスタンス化
$sample_class->publicFnction();// インスタンスメソッド呼び出し

例外処理

Javaと同じ

try { 

} catch (Exception $e) { 

} finally { 

}

DB連携

PDO(PHP Data Object)

DB抽象化レイヤのこと。 これのおかげでどのDBにも似たような記述で接続できる。 PHPに標準装備されている。

DB接続

function getDb() { 
  $dsn = 'mysql:dbname=selfphp; host=127.0.0.1; charset=utf8'; 
  $usr = 'root'; 
  $password = 'password'; 
  
  //DB接続
  $db = new PDO($dsn, $usr, $password); 

  // 例外処理を有効化
  $db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
  return $db;
  }

DB検索処理

function getDb() { 
  $dsn = 'mysql:dbname=selfphp; host=127.0.0.1; charset=utf8'; 
  $usr = 'root'; 
  $password = 'password'; 
   
  //DB接続 
  $db = new PDO($dsn, $usr, $password);  
  // 例外処理を有効化 
  $db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 
  return $db; 
  } 
try { 
  //上記DB接続のgetDbメソッドでDB接続 
  $db = getDb(); 
  // 例外処理を有効化 
  $db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 
  // 検索SQLプレースホルダで準備 
  $stt = $db->prepare("SELECT * FROM book WHERE title LIKE \'%?%\'"); 
  
  // 1個目の?のところにtitleが入る
  $stt->bindValue(1, $_POST['title']); 
  // SELECT命令を実行
  $stt->execute(); 

 //検索結果の取得 PDO::FETCH_ASSOCは連想配列で取得
  while($row = $stt->fetch(PDO::FETCH_ASSOC)) {
    $isbn = $row['isbn']
    $title = $row['title']
    $price = $row['price']
  }
  // 例外が発生したら、エラー表示 
} catch(PDOException $e) { 
  print "エラーメッセージ:{$e->getMessage()}"; 
} finally { 
  $stt = null; 
  $db = null; 
}

DB更新処理

function getDb() { 
  $dsn = 'mysql:dbname=selfphp; host=127.0.0.1; charset=utf8'; 
  $usr = 'root'; 
  $password = 'password'; 
   
  //DB接続 
  $db = new PDO($dsn, $usr, $password);  
  // 例外処理を有効化 
  $db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 
  return $db; 
  }
try { 
  //上記DB接続のgetDbメソッドでDB接続 
  $db = getDb(); 
  // 例外処理を有効化 
  $db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 
   
  // ドランザクションを開始 
  $db->beginTransaction(); 
  // 更新SQLプレースホルダで準備 
  $stt = $db->prepare('INSERT INTO book(isbn, title, price, publish, published) VALUES(:isbn, :title, :price, :publish, :published)'); 
  $stt->bindValue(':isbn', $_POST['isbn']); 
  $stt->bindValue(':title', $_POST['title']); 
  $stt->bindValue(':price', $_POST['price']); 
  $stt->bindValue(':publish', $_POST['publish']); 
  $stt->bindValue(':published', $_POST['published']); 
  // insert命令を実行 
  $stt->execute(); 
  // 全ての処理が完了したらトランザクションをコミット 
  $db->commit(); 
  // 例外発生したら、エラー表示&トランザクションをロールバック 
} catch(PDOException $e) { 
  $db->rollBack(); 
  print "エラーメッセージ:{$e->getMessage()}"; 
} finally { 
  $stt = null; 
  $db = null; 
}

HTML内での色々

phpタグ内でHTML文をつくる

echo or printするとHTML扱いになぜかなる。

<body>
<?php
for($i = 1; $i < 10; $i++) {
echo $i."
";
}
?>
</body>

phpタグ内でHTMLと変数を扱う

'{$変数}'

<?php
$i = abc
echo "<select name='{$i}'></select>";
?>

GET POSTをHTML内で受け取れる

$GET・$POST

//post送信
<form method="post" action="sent.php">
        <input type="text" name="name">
        <input type="submit" value="送信">
</form>
<body>
//post受け取り
<?php echo $_POST['name']; ?>
</body>

セキュリティ

XSS対策

基本的にGETやPOSTで受け取った値には、htmlspecialchars関数を使ってエスケープ処理をする。

例:XSS防止用のeメソッドを定義。

encode.php

<?php 
/** 
 * クロスサイトスクリプティング(XSS)防止用。 
 * ユーザー入力値をHTML表示する時に呼び出す。 
 * $str:エンコード対象の文字列 
 * #charset:エンコードタイプ 
 * ENT_QUOTES | ENT_HTML5:シングル/ダブルクォートを双方エスケープし、HTML5文書として処理。原則はこれ。 
 */  
function e(string $str, string $charset = "UTF-8"): string { 
  return htmlspecialchars($str, ENT_QUOTES | ENT_HTML5, $charset); 
} 

eメソッドを使う

<?php
require_once("./encode.php");

print (e($_GET['name']);
print e($_GET['password']);

セッションID盗聴対策

ログイン後に新しいセッションIDを生成する。

// 新しいセッションIDを生成。セッション情報は保持される。
session_regenerate_id();

IPA安全なウェブサイトの作り方のP17を参照↓ https://www.ipa.go.jp/security/vuln/websecurity.html

パスワードの暗号化・ハッシュ化

1、ハッシュの生成

$password = "1234";
$hash = password_hash($password, PASSWORD_DEFAULT); //ハッシュパスワードの生成

2、ハッシュとパスワードの照合

$password = "1234"; 
$hash = password_hash($password, PASSWORD_DEFAULT);

// password_verifyで照合
if(password_verify($password, $hash)){ 
        print "照合成功"
      }