エスケープシークエンス:
¥の次の文字を「単なる文字」にする
PDOオブジェクトには、どんなSQLでも実行しますよというのがあるらしい
ほんとは$pdo.queryと書きたいが、ドットも使えないときているので
シングルアローを使う
--->insert_s.php
<?php
//var_dump($_POST);
//print_r($_POST);
//echo $_POST["s_name"];
//-------------------------
//DBへの接続情報
//環境に応じて書き換えてください
//-------------------------
$user = "root";
$pass = "";
$host = "localhost";
$dbname="school";
//-------------------------
$dsn = "mysql:host={$host};dbname={$dbname};charset=utf8";
$pdo= new PDO($dsn, $user, $pass);
$sql="INSERT INTO students(s_name) VALUES (\"hoge\")";
$pdo->query($sql);
?>
この画面を読み込むとhogeがデータベースに追加される
真っ白画面でもf5を押してはいけない
(押した数だけhogeが追加されてしまう)
DBをみてみましょう
追加されている
あとはこのhogeの部分を、
さっきの「連想配列」のs_nameの部分とすればよい
その部分全体は{}でくくる
エスケープが入っているのでややこしくみえるが、
$sql="INSERT INTO students(s_name) VALUES (\"$_POST["s_name"]\")";
CTRL+F5を何度か押してからやってみましょう
しかしこれは大変危険なアプローチらしい
外部由来のデータは信頼してはいけないという格言がある
外部からのデータはDBに直接入れちゃいけない(悪意があったら大変なので)
↓
プレースホルダ
取ってある場所のこと(場所取り)
DBにはめこまずに場所を取るだけにしなさいというもの
コロンを使うとプレースホルダになる
$sql="INSERT INTO students(s_name) VALUES (:hoge)";
:hoge
「ああ、あとからここに何かいれるつもりなんですね」
という書き方
場所確保
データは後で入れる
絶対にSQLインジェクションが起こらなくなるので
これを挟んでから後で入れるようにする
普通は
$sql="INSERT INTO students(s_name) VALUES (:s_name)";
とか列名を書いたりする
そのあと事前に「ぷりこんぱいる」ということをする
プリコンパイル:
事前コンパイルのこと
パンを焼くようなもの
$PDOオブジェクトに対してプリコンパイルを要求する
あとであなぽこ(プレースホルダ)にはめこむ部分をあけておいて、
そのほかの部分を焼いておくみたいなイメージ
$stmt
ステートメントの略でstmtになっってる
bindValue
ばいんどばりゅー
トッピングするようなものらしい
最初のパラメータ:穴ぽこのなまえ
第2:なにをいれるか
第3:文字なのか数字なのか
PDO::PARAM_STRまたはPARAM_INT
ぱらむすとら
という特殊な書き方をする
「静的呼び出し」
意味的には文字(STR)ですよと(数字ならINT)
とりあえず動いた
--->insert_s.php
<?php
//var_dump($_POST);
//print_r($_POST);
//echo $_POST["s_name"];
//-------------------------
//DBへの接続情報
//環境に応じて書き換えてください
//-------------------------
$user = "root";
$pass = "";
$host = "localhost";
$dbname="school";
//-------------------------
$dsn = "mysql:host={$host};dbname={$dbname};charset=utf8";
$pdo= new PDO($dsn, $user, $pass);
$sql="INSERT INTO students(s_name) VALUES (:s_name)";
//$pdo->prepare($sql);//上の一行をプリコンパイルする//穴だけあけて生地を用意した
$stmt = $pdo->prepare($sql);//パン生地を焼いた(コンパイル済みのバイナリデータになっている)
$stmt->bindValue(":s_name",$_POST["s_name"],PDO::PARAM_STR);//(バイナリデータとテキストデータが混じることはないので毒があっても回らない)
//$pdo->query($sql);//これはもう使えないので、
$stmt->execute();//実行
?>
ここに至るまでにエラーが連発
①pdoの前には$が必要
②->はドットと一緒なので前後に半角スペースをいれてはいけないらしい
③ctrl+f5を前画面で連打しておくこと