teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

4

文章の軽微修正

2017/07/25 11:20

投稿

miyahan
miyahan

スコア3095

answer CHANGED
@@ -6,7 +6,7 @@
6
6
  $SQL = "SELECT * FROM Table Where CompanyID = '{$arrA[0]['CompanyID']}' ";
7
7
  ```
8
8
 
9
- ただこれだと1行が長くなってしまいます。そんなときは [sprintf()](http://php.net/manual/ja/function.sprintf.php) 関数を使うと見通しがよくなります。
9
+ ただこれだと1行が長くなってしまいますし、記号だらけで正直見づらいですよね。そんなときは [sprintf()](http://php.net/manual/ja/function.sprintf.php) 関数を使うと見通しがよくなります。
10
10
 
11
11
  ```php
12
12
  $SQL = sprintf(
@@ -29,6 +29,6 @@
29
29
  $stmt->execute();
30
30
  ```
31
31
 
32
- `?` と書いた部分に、bindValue() 関数によって指定された文字がセットされます。
32
+ `?` と書いた部分に、bindValue() 関数によって指定された文字がセットされます。ちなみに ? をシングルクオートで囲んでいませんが、これは必要なエスケープ処理すべてをPDOが自動で行ってくれるためです。
33
33
 
34
34
  直接変数を埋め込むと、場合によってはSQLインジェクションという脆弱性が出来てしまい、データの破壊・改ざん、個人情報漏洩などの大事故につながりますので気をつけて下さい。

3

波括弧について追記

2017/07/25 11:20

投稿

miyahan
miyahan

スコア3095

answer CHANGED
@@ -1,6 +1,14 @@
1
- まずSQLのことは抜きして一般論を話します。PHPで複雑な表現の変数を文字列の中に展開したい場合、[sprintf()](http://php.net/manual/ja/function.sprintf.php) 関数を使うのが手軽で、かコード見通しも良くなります。
1
+ まずSQLのことは抜きして一般論を話します。PHPで複雑な表現の変数を文字列の中に展開したいとき主に2つの方法があります。
2
2
 
3
+ 1つめは[波括弧構文](http://php.net/manual/ja/language.types.string.php#language.types.string.parsing.complex)を使うことです。変数の表記を波括弧 `{}` で囲むことによって、これは変数名を表しているんだということをPHPに明確に伝えることができます。
4
+
3
5
  ```php
6
+ $SQL = "SELECT * FROM Table Where CompanyID = '{$arrA[0]['CompanyID']}' ";
7
+ ```
8
+
9
+ ただこれだと1行が長くなってしまいます。そんなときは [sprintf()](http://php.net/manual/ja/function.sprintf.php) 関数を使うと見通しがよくなります。
10
+
11
+ ```php
4
12
  $SQL = sprintf(
5
13
  "SELECT * FROM Table Where CompanyID = '%s' ",
6
14
  $arrA[0]['CompanyID']

2

誤字修正

2017/07/25 11:11

投稿

miyahan
miyahan

スコア3095

answer CHANGED
File without changes

1

文章の軽微修正

2017/07/25 10:57

投稿

miyahan
miyahan

スコア3095

answer CHANGED
@@ -1,4 +1,4 @@
1
- まずPHP単体をします。PHPで複雑な変数を文字列の中に展開したい場合は、[sprintf()](http://php.net/manual/ja/function.sprintf.php) 関数を使うのが便利で、かつコードやす書けます。
1
+ まずSQLことは抜きして一般論します。PHPで複雑な表現の変数を文字列の中に展開したい場合は、[sprintf()](http://php.net/manual/ja/function.sprintf.php) 関数を使うのが手軽で、かつコード通しも良なります。
2
2
 
3
3
  ```php
4
4
  $SQL = sprintf(
@@ -11,9 +11,9 @@
11
11
 
12
12
  ---
13
13
 
14
- つづいてこれをSQL文として見た場合、変数をSQL文に直接埋め込むのではなく、**プリペアドステートメント** という方法を使ってセットする方法が推奨されています。
14
+ つづいてこれをSQL文として見た場合、セキュリティの観点から変数をSQL文に直接埋め込むのではなく、**プリペアドステートメント** という方法を使ってセットことを強くおすめします。
15
15
 
16
- PDOというPHP標準のライブラリを使った場合はこんなコードになります:
16
+ 例えばPDOというPHP標準のライブラリを使った場合はこんなコードになります:
17
17
 
18
18
  ```php
19
19
  $stmt = $dbh->prepare("SELECT * FROM Table WHERE CompanyID = ?");
@@ -23,4 +23,4 @@
23
23
 
24
24
  `?` と書いた部分に、bindValue() 関数によって指定された文字がセットされます。
25
25
 
26
- データベース周りはちょっとしたバグ(脆弱性)が大事故につながりますので、ぜひ使って下さい。
26
+ 直接変数を埋め込むと、場合によてはSQLインジェクションいう脆弱性が出来てしまい、データの破壊・改ざん、個人情報漏洩などの大事故につながりますので気をつけて下さい。