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

回答編集履歴

3

誤字の訂正

2017/08/01 06:40

投稿

退会済みユーザー
answer CHANGED
@@ -60,7 +60,7 @@
60
60
 
61
61
  こういうやり方において、戻る必要性があるかと言えばないのですが、
62
62
  進むことも出来るから戻ることも出来る、くらいに捉えておけば問題ないかと思います。
63
- (直前のレコードの値を参照するのに、わざわざDBカーソルを戻さずとも、直前のレコードの値を変数に保持するようにすればむ場合もありますし。)
63
+ (直前のレコードの値を参照するのに、わざわざDBカーソルを戻さずとも、直前のレコードの値を変数に保持するようにすればむ場合もありますし。)
64
64
 
65
65
  あと、PDOにおける定数は、いろんな動作の切り替えや指定をするために
66
66
  大量に定義されているため、
@@ -71,7 +71,7 @@
71
71
 
72
72
  余談ですが、
73
73
  [PHP: PDOStatement::bindValue - Manual](http://php.net/manual/ja/pdostatement.bindvalue.php)
74
- プレースホルダー(個人的には虫食いって読んでるけど参道は特に求めてないです)の指定方法が2種類あって、
74
+ プレースホルダー(個人的には虫食いって読んでるけど賛同は特に求めてないです)の指定方法が2種類あって、
75
75
  単に「?」を使うケースと、可読性の高い名前付けを使うケースが有り、
76
76
  名前付けプレースホルダーを使うときには「:」をつけるという仕様です。
77
77
  「?」指定は簡単そうですが、クエリーを書き換えて

2

加筆修正

2017/08/01 06:40

投稿

退会済みユーザー
answer CHANGED
@@ -14,6 +14,50 @@
14
14
  一行処理したら「次のレコード」に移動する処理を起こして、
15
15
  「もうないよ」となるまで繰り返します。
16
16
 
17
+ [PHP: PDOStatement::fetch - Manual](http://php.net/manual/ja/pdostatement.fetch.php)
18
+ ```
19
+
20
+ <?php
21
+ function readDataForwards($dbh) {
22
+ $sql = 'SELECT hand, won, bet FROM mynumbers ORDER BY BET';
23
+ try {
24
+ $stmt = $dbh->prepare($sql, array(PDO::ATTR_CURSOR => PDO::CURSOR_SCROLL));
25
+ $stmt->execute();
26
+ while ($row = $stmt->fetch(PDO::FETCH_NUM, PDO::FETCH_ORI_NEXT)) {
27
+ $data = $row[0] . "\t" . $row[1] . "\t" . $row[2] . "\n";
28
+ print $data;
29
+ }
30
+ $stmt = null;
31
+ }
32
+ catch (PDOException $e) {
33
+ print $e->getMessage();
34
+ }
35
+ }
36
+ function readDataBackwards($dbh) {
37
+ $sql = 'SELECT hand, won, bet FROM mynumbers ORDER BY bet';
38
+ try {
39
+ $stmt = $dbh->prepare($sql, array(PDO::ATTR_CURSOR => PDO::CURSOR_SCROLL));
40
+ $stmt->execute();
41
+ $row = $stmt->fetch(PDO::FETCH_NUM, PDO::FETCH_ORI_LAST);
42
+ do {
43
+ $data = $row[0] . "\t" . $row[1] . "\t" . $row[2] . "\n";
44
+ print $data;
45
+ } while ($row = $stmt->fetch(PDO::FETCH_NUM, PDO::FETCH_ORI_PRIOR));
46
+ $stmt = null;
47
+ }
48
+ catch (PDOException $e) {
49
+ print $e->getMessage();
50
+ }
51
+ }
52
+
53
+ print "Reading forwards:\n";
54
+ readDataForwards($conn);
55
+
56
+ print "Reading backwards:\n";
57
+ readDataBackwards($conn);
58
+ ?>
59
+ ```
60
+
17
61
  こういうやり方において、戻る必要性があるかと言えばないのですが、
18
62
  進むことも出来るから戻ることも出来る、くらいに捉えておけば問題ないかと思います。
19
63
  (直前のレコードの値を参照するのに、わざわざDBカーソルを戻さずとも、直前のレコードの値を変数に保持するようにすれば住む場合もありますし。)

1

加筆修正

2017/08/01 04:01

投稿

退会済みユーザー
answer CHANGED
@@ -23,4 +23,27 @@
23
23
  数字で直接書いてしまうと可読性が下がってわかりにくいため、
24
24
  [PHP: 定義済み定数 - Manual](http://php.net/manual/ja/pdo.constants.php)
25
25
  にあるように読みやすさを考えて定義されています。
26
- 「PDO::ATTR_CURSOR」は、PDOクラスが定義するATTR_CURSORという定数って意味です。
26
+ 「PDO::ATTR_CURSOR」は、PDOクラスが定義するATTR_CURSORという定数って意味です。
27
+
28
+ 余談ですが、
29
+ [PHP: PDOStatement::bindValue - Manual](http://php.net/manual/ja/pdostatement.bindvalue.php)
30
+ プレースホルダー(個人的には虫食いって読んでるけど参道は特に求めてないです)の指定方法が2種類あって、
31
+ 単に「?」を使うケースと、可読性の高い名前付けを使うケースが有り、
32
+ 名前付けプレースホルダーを使うときには「:」をつけるという仕様です。
33
+ 「?」指定は簡単そうですが、クエリーを書き換えて
34
+ 例えば?が2つだったところに途中で3つ目の?が加わると厄介になるため、
35
+ 面倒でも名前付けプレースホルダーを活用すると良いです。
36
+ ```
37
+
38
+ <?php
39
+ /* バインドされた PHP 変数によってプリペアドステートメントを実行する */
40
+ $calories = 150;
41
+ $colour = 'red';
42
+ $sth = $dbh->prepare('SELECT name, colour, calories
43
+ FROM fruit
44
+ WHERE calories < :calories AND colour = :colour');
45
+ $sth->bindValue(':calories', $calories, PDO::PARAM_INT);
46
+ $sth->bindValue(':colour', $colour, PDO::PARAM_STR);
47
+ $sth->execute();
48
+ ?>
49
+ ```