回答編集履歴
2
混乱回避の為に、追記削除
answer
CHANGED
@@ -1,68 +1,2 @@
|
|
1
1
|
わざわざ新しい処理作らなくても、PDO 使ってれば普通に取り出せる気がします。
|
2
2
|
すでに解決してるみたいですが、参考まで。
|
3
|
-
--追記--
|
4
|
-
元々の質問に対して回答していませんでした^^;
|
5
|
-
一般的には、グローバルスコープの変数に関数の結果を渡したい場合は、return を使用し、関数の中でグローバルスコープの変数を利用したい場合は、引数として引き渡します。
|
6
|
-
|
7
|
-
```php
|
8
|
-
<?php
|
9
|
-
function A(){
|
10
|
-
~ 何かの処理 ~
|
11
|
-
return $row["COUNT(*)"];
|
12
|
-
}
|
13
|
-
$max_record = A();
|
14
|
-
?>
|
15
|
-
<?php
|
16
|
-
function B($max_record){
|
17
|
-
echo $max_record;
|
18
|
-
}
|
19
|
-
B($max_record);
|
20
|
-
```
|
21
|
-
みたいな感じです。
|
22
|
-
|
23
|
-
ちなみに、グローバルスコープの変数を使わないほうが良い理由は、ライブラリ等を複数を呼び出すようなある程度の規模があるプログラムでは管理できなくなるからです。
|
24
|
-
そうでは無いプログラムで忌諱する理由はそれほどありません。
|
25
|
-
|
26
|
-
あと、class 使った方法を PDO で実現するサンプルを作りました。
|
27
|
-
```php
|
28
|
-
<?php
|
29
|
-
function init(){
|
30
|
-
try {
|
31
|
-
$user = 'user';
|
32
|
-
$dbname = 'dbname';
|
33
|
-
$pass = 'pass';
|
34
|
-
$table = 'table';
|
35
|
-
$dbh = new PDO(
|
36
|
-
"mysql:dbname=$dbname;host=localhost;charset=utf8",
|
37
|
-
$user,
|
38
|
-
$pass,
|
39
|
-
[
|
40
|
-
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
|
41
|
-
PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
|
42
|
-
]
|
43
|
-
);
|
44
|
-
$sth = $dbh->query("select * from $table");
|
45
|
-
return $sth;
|
46
|
-
} catch (PDOException $e) {
|
47
|
-
exit($e->getMessage());
|
48
|
-
}
|
49
|
-
}
|
50
|
-
|
51
|
-
function hoge(PDOStatement $sth){
|
52
|
-
echo $sth->rowCount();//直近の SQL ステートメントによって作用した行数を返す
|
53
|
-
}
|
54
|
-
|
55
|
-
function fuga(PDOStatement $sth){
|
56
|
-
foreach($sth->fetchAll() as $row){//全ての結果行の配列をループで取り出す
|
57
|
-
var_dump($row);
|
58
|
-
}
|
59
|
-
}
|
60
|
-
|
61
|
-
$sth = init();
|
62
|
-
hoge($sth);
|
63
|
-
fuga($sth);
|
64
|
-
```
|
65
|
-
$sth は、$dbh->query() を実行した際のいろいろな情報が入ったオブジェクトです。
|
66
|
-
このオブジェクトを hoge() や fuga() に渡すことで $dbh->query() の結果情報を引き出すことが出来ます。$sth には結果のレコード数も含まれているので、新しい処理を作る必要はありません。
|
67
|
-
|
68
|
-
今回、関数間をまたぐサンプルにしたかったので、init() を作りましたが、フレームワークを使用しないページ内の処理程度であれば、関数に閉じ込めず、グローバルスコープに設置しても良いと思います。
|
1
追記
answer
CHANGED
@@ -1,2 +1,68 @@
|
|
1
1
|
わざわざ新しい処理作らなくても、PDO 使ってれば普通に取り出せる気がします。
|
2
|
-
すでに解決してるみたいですが、参考まで。
|
2
|
+
すでに解決してるみたいですが、参考まで。
|
3
|
+
--追記--
|
4
|
+
元々の質問に対して回答していませんでした^^;
|
5
|
+
一般的には、グローバルスコープの変数に関数の結果を渡したい場合は、return を使用し、関数の中でグローバルスコープの変数を利用したい場合は、引数として引き渡します。
|
6
|
+
|
7
|
+
```php
|
8
|
+
<?php
|
9
|
+
function A(){
|
10
|
+
~ 何かの処理 ~
|
11
|
+
return $row["COUNT(*)"];
|
12
|
+
}
|
13
|
+
$max_record = A();
|
14
|
+
?>
|
15
|
+
<?php
|
16
|
+
function B($max_record){
|
17
|
+
echo $max_record;
|
18
|
+
}
|
19
|
+
B($max_record);
|
20
|
+
```
|
21
|
+
みたいな感じです。
|
22
|
+
|
23
|
+
ちなみに、グローバルスコープの変数を使わないほうが良い理由は、ライブラリ等を複数を呼び出すようなある程度の規模があるプログラムでは管理できなくなるからです。
|
24
|
+
そうでは無いプログラムで忌諱する理由はそれほどありません。
|
25
|
+
|
26
|
+
あと、class 使った方法を PDO で実現するサンプルを作りました。
|
27
|
+
```php
|
28
|
+
<?php
|
29
|
+
function init(){
|
30
|
+
try {
|
31
|
+
$user = 'user';
|
32
|
+
$dbname = 'dbname';
|
33
|
+
$pass = 'pass';
|
34
|
+
$table = 'table';
|
35
|
+
$dbh = new PDO(
|
36
|
+
"mysql:dbname=$dbname;host=localhost;charset=utf8",
|
37
|
+
$user,
|
38
|
+
$pass,
|
39
|
+
[
|
40
|
+
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
|
41
|
+
PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
|
42
|
+
]
|
43
|
+
);
|
44
|
+
$sth = $dbh->query("select * from $table");
|
45
|
+
return $sth;
|
46
|
+
} catch (PDOException $e) {
|
47
|
+
exit($e->getMessage());
|
48
|
+
}
|
49
|
+
}
|
50
|
+
|
51
|
+
function hoge(PDOStatement $sth){
|
52
|
+
echo $sth->rowCount();//直近の SQL ステートメントによって作用した行数を返す
|
53
|
+
}
|
54
|
+
|
55
|
+
function fuga(PDOStatement $sth){
|
56
|
+
foreach($sth->fetchAll() as $row){//全ての結果行の配列をループで取り出す
|
57
|
+
var_dump($row);
|
58
|
+
}
|
59
|
+
}
|
60
|
+
|
61
|
+
$sth = init();
|
62
|
+
hoge($sth);
|
63
|
+
fuga($sth);
|
64
|
+
```
|
65
|
+
$sth は、$dbh->query() を実行した際のいろいろな情報が入ったオブジェクトです。
|
66
|
+
このオブジェクトを hoge() や fuga() に渡すことで $dbh->query() の結果情報を引き出すことが出来ます。$sth には結果のレコード数も含まれているので、新しい処理を作る必要はありません。
|
67
|
+
|
68
|
+
今回、関数間をまたぐサンプルにしたかったので、init() を作りましたが、フレームワークを使用しないページ内の処理程度であれば、関数に閉じ込めず、グローバルスコープに設置しても良いと思います。
|