忍者ブログ

からすまる日誌 mySQL

授業ノートのまとめ

序章(18) エスケープシークエンスとプレースホルダ

×

[PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。

序章(18) エスケープシークエンスとプレースホルダ

エスケープシークエンス:
¥の次の文字を「単なる文字」にする
 
 

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を前画面で連打しておくこと
PR

コメント

ただいまコメントを受けつけておりません。

プロフィール

HN:
karasumaru
性別:
非公開

P R