プログラミング本気1週間 2日目
本日やったこと
- MySQLとPHPを連携させて独自CMSを作る際にも必須となってくる掲示板の作成。
本日の様子
- 1つのカラムだけで作るとできたのだが、2つ以上のカラムで作成する際にエラーが多発して全く進まず(エラー内容に対する調べたことを下に明記します。)
- バインドについて学ぶも、なぜかエラー画で続けてしまった。
今日わかったことを書いていく(自分用)
エスケープ
特殊な文字(プログラミング言語)だったりを無害な言葉に書き換えておくための技。
ちょっとプログラミングを知っている人でもハッキングっぽいことをされないためにやっておくこと。
*エスケープをしたからといって100%色々な物を防げる訳ではなく、最低限やっておくべきことらしい
エスケープをする手段としてPHPではhtmlspecialchars()というのを使われることが多いらしい。
このhtmlspecialchars()というのは
特殊文字をhtmlエンティティに変換することができる。
使い方
<?php print htmlspecialchars($language, ENT_QUOTES,"UTF-8"); ?>
僕が書いたやつはこんな感じ。
基本的に
htmlspecialchars([エスケープする文字列], ENT_QUOTES, "UTF-8");
という風に書くのが一般的っぽい。
*ENT_QUOTESのところはたくさん代用が聞くけど、ENT_QUOTESかENT_HTML5(HTML 5 として処理)が望ましいらしい
MySQLと PHPを連携させる時に気をつけなければならない
mysqlとPHPをつなぐときは
$link = new PDO('mysql:host=localhost;dbname=difficulty;charset=UTF8;',$username, $password);
みたいな形が一番いい。
本にはmysql_~みたいなやり方もあったが、PHP7ではmysqliにしなくてはいけないなどめんどくさいので上記のやり方が一番!
(もちろん$usernameと$passwordには自分のMySQLの情報を格納しておくこと)
PDO
これはPHPのデータ接続クラスです。
array_key_existsについて
これは、MySQLとPHPをつなぐ時に使われるもので
指定したキーまたは、添字が配列に存在するかを調べることができます。
使い方
array_key_exists ( $キー名 , $配列名 )
これで、指定したキーが指定した配列に存在した場合はtrueで返します。(逆はfalse)
だから以下のような使い方ができます。
例えば
if (array_key_exists('language',$_POST)) {
…
}
という風に使えます。
どうしてもうざい$_POST
$_POSTは
- スーパーグローバル変数
- HTTP POSTメソッドで送信した値を取得することができる
- 連想配列として使用する(だから上のarray_key_existsにも入れられた)
- 関数やメソッドの内部で使用するときも前にglobalをつける必要がない
ってこと。
htmlとかで作ったformのmethodをPOSTにした場合。
そこのformで囲ってあるところから取り出すことができる(語彙力)
クエリとは
簡単にいっちゃえば、SQL(文)のことらしいです。
*SQL文とSQLは全く違うから注意!
(SQLは言語でSQL文は文。イメージとしては日本語で「〜しろ」っていう時は、日本語がSQLで「〜しろ」がSQL文)
「クエリを投げる」っていうのは、エンジニアの人がカッコつけて(ごめんなさい)いっているだけで、データベースにSQL文を送信しているという意味だそうです。
プリペアドステートメントとは
僕がPHPとSQLを繋ごうと必死になっていたら、なんか必要だと言われたやつ
これはSQLを使いデータベースに命令する時に値をサニタイズする仕組みだそうです。
といってもサニタイズが分からないのです調べました。
サニタイズとは
なんと一番上で解説したエスケープと同じ意味でしたw
ってことでプリペアドステートメントに戻ります。
プリペアド・ステートメント
っていうのは
プレースホルダ
で
バインド機構
って書いてありました。
訳がわかりません。
要はプリペアド・ステートメント = プレースホルダ = バインド機構だそうです。。。
で、これらは値を挟み込む(バインドっていうらしい)能力を持っている。
例えば
$result = $link->prepare($sql);
上記のような文だと
$sqlにこれから値を入れるから準備しておけよ…。
という意味らしい。。。まだはっきりと意味が分かっていないがこれをすることによって
バインドって言われたら挟み込むっていうのは覚えておいたほうがよさそう…。
これめちゃくちゃわかりやすい⬇︎
https://wa3.i-3-i.info/word12448.html
bindColumn()について(未解決)
これに2時間くらい使ったものの何をいっているのかがいまいち分からなかった。
今現在起きているエラーがおそらくこいつのせいなのだが…。
今の僕のコードをお見せしよう
$result->bindColumn(':language',$_POST['language']);
おそらく$_POST['language']から:languageをバインドするということなのだろうが…。
(inputによってlanguageが変わるから)
このbindColumは2つバインドしたい場合どうすればいいのか?
//こんな感じで$resultを2つ書いてみたのだが…無事エラー。
if (array_key_exists('language',$_POST)) {
// 実行するSQL作成(バインドできるようにしておく)
$sql = 'INSERT INTO programing (language,comment) VALUES(:language,:comment)';
//準備しておく
$result = $link->prepare($sql);
//bindColumn()でそれぞれに代入していく
$result->bindColumn(':language',$_POST['language']);
$result->bindColumn(':comment',$_POST['comment']);
//実行
$result->execute();
//次の周期のために空にしておく
$result = null;
}
これでもエラーが出てしまった。
3日目の記事