忍者ブログ

からすまる日誌 mySQL

授業ノートのまとめ

応用(7) プリコンパイル

×

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

応用(7) プリコンパイル

では
健全な形に直していきましょう(md5は良くないんだが一応それは残す感じで)
 
auth.phpをauth2.phpにリネーム
index2.phpの呼び出し先もauth2.phpに変更 
 

 
またエラーが出た
 
Parse error: syntax error, unexpected ')', expecting ']' in C:\xampp\htdocs\php\makino\auth\auth2.php on line 15
 
→ かっこの最初か最後がない
 
$pass = md5($_POST["pass"]);
ここが違った
 

ここまで
 
--->index2.php
 
<!DOCTYPE html>
<html lang="ja">
 <head>
  <meta charset="UTF-8">
  <title>ログイン認証</title>
  <link rel="stylesheet" href="auth.css">
  
 </head>
 <body>
  <div id="container">
   <form method="post" action="auth2.php">
    <table>
      <tr>
      <th><label for="u_id">ユーザー名</th>
     <td><input type="text" name="u_id" id="u_id"></td>
     </tr>
     <tr>
      <th><label for="pass">パスワード</label></th>
      <td><input type="password" name="pass" id="pass"></td>
     </tr>
    </table>
    <p><button type="submit">認証</button></p>
   </form>
  </div>
  
 </body>
</html>
 
--->auth2.php
 
<?php
session_start();
//いつもの
$user="root";
$dbpass="";
$host="localhost";
$dbname="auth";
$dsn="mysql:host={$host};dbname={$dbname};charset=utf8";
$pdo=new PDO($dsn, $user, $dbpass);
//指定したニックネームと一致するu_idとpassをもってこいや
$sql="SELECT nickname FROM users WHERE u_id=:u_id AND pass=:pass";
$pass = md5($_POST["pass"]);//あらかじめハッシュしておく
//プリコンパイル(構文はコンパイル済み)
$stmt = $pdo->prepare($sql);
//バインド
$stmt->bindValue(":u_id",$_POST["u_id"],PDO::PARAM_STR);
$stmt->bindValue("pass",$pass,PDO::PARAM_STR);//さっきハッシュしておいたので
//実行
$stmt->execute();
//とりだし
$row = $stmt->fetch(PDO::FETCH_ASSOC);//hitするdataは1けんだけのはずなので
if($row["nickname"]){
 $_SESSION["login"]=true;
 $_SESSION["name"]=$row["nickname"];
 header("Location: mypage.php");
}else{
 header("Location: index2.php");
}
?>
プリコンパイルされるっていうのは、フランス語に翻訳するようなもの。
あとから英語(の文法込み)を混ぜ込んでも、
フランス語と英語がまじって翻訳(解釈)されることはないという感じ。
 
「私はクエが大好き」と解釈させたいとする。
「私は○○が大好き」とフランス語で翻訳しておく(プリコンパイル)
あとから「クエ」をはめこむ。
「私はクエが大好き」
 
わるいひとが、あとから「クエOR '1'='1'」をかまして翻訳させようとしても、
フランス語(機械語)に翻訳された後に条件文は解釈(実行)されないという感じ。


ではテストのための復習(30分クッキング)
 
あたらしいDBをつくりましょう
db名: goods
table名: dogs カラム2
 
d_id
d_name
 

さて以前作ったlunchテーブル
SQLで取り出す
すべてのfoodsテーブルのデータ
メニュー名と値段とカテゴリ名を
 
SELECT 列名 FROM テーブル
複数あるときはカンマ区切り
同じ名前のカラムが存在するなら
テーブル名 ドット カラム名でないとできない
複数テーブルを参照するときは、WHERE必須
 
SELECT menu,price,cat FROM foods,cats WHERE foods.c_id=cats.c_id;
 
文法
SELECT 取り出すものカンマ区切りで全部 FROM テーブル名カンマ区切りで全部
WHERE どこテーブルの.なにかどこテーブルの.なにか
 
ORDER BY price(昇順)
ORDER BY price DESC (ですく)(降順)

dogsの構造を変えたい
固定長アルファベット7桁
 
ばーちゃーは可変長文字列
CHAR 文字列固定長
 

SELECT menu,price,cat FROM foods,cats WHERE foods.c_id=cats.c_id ORDER BY price DESC;
 
 

ダンプを取るときはデータベースで取る(テーブルでとらない)
エクスポート

DBには厳しい3つの制約: 
主キーがせっていすると同じ値を持つ主キーは設定できない:
一意制約
 
外部キーは参照できる値でないといけない:
参照制約
 
プライマリキーとかnullではだめですよとか指定したところは:
Not Null制約
 
SELECT menu,price,cat FROM foods,cats WHERE foods.c_id=cats.c_id ORDER BY price DESC;
一意制約
参照制約
Not Null制約
 

CHAR
 
SELECT menu,price,cat FROM foods,cats WHERE foods.c_id=cats.c_id ORDER BY price DESC;
PR

コメント

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

プロフィール

HN:
karasumaru
性別:
非公開

P R