回答編集履歴
2
追記
test
CHANGED
@@ -1,7 +1,69 @@
|
|
1
1
|
追記
|
2
2
|
---
|
3
|
-
最初の回答では大文字小文字の問題と解答しましたが、スコープの問題で
|
3
|
+
最初の回答では大文字小文字の問題と解答しましたが、スコープの問題でした。
|
4
|
+
関数の中で定義された変数は関数の外では使えません。
|
5
|
+
|
6
|
+
現状の実装を拝見するに、自作関数そのもの(特に引数と戻り値の扱い)についての理解が追い付いていない様に見受けられますので、
|
7
|
+
まずは、
|
8
|
+
https://www.php.net/manual/ja/functions.user-defined.php
|
9
|
+
でごく簡単なサンプルから順に確認して理解を深めることをお勧めします。
|
10
|
+
|
11
|
+
今回のケースだと、model.phpをインクルードしているのですが、実質的に以下の様に書いているのと同じことになります。
|
12
|
+
|
13
|
+
```PHP
|
14
|
+
//ここから関数
|
15
|
+
function getDeviceData($params){
|
16
|
+
//DBの接続情報
|
17
|
+
include_once('config/database.php');
|
18
|
+
|
19
|
+
//DBコネクタを生成
|
20
|
+
$Mysqli = new mysqli('localhost', 'root', '', 'deviceswithinventory');
|
21
|
+
if ($Mysqli->connect_error) {
|
22
|
+
error_log($Mysqli_connect_error);
|
23
|
+
exit;
|
24
|
+
}
|
25
|
+
}
|
26
|
+
//ここまで関数
|
27
|
+
|
28
|
+
$sql = "SELECT * from devices where device_name = ? and serial_number = ? and manufacturer = ? and model = ? and os = ?";
|
29
|
+
// SQL文を$stmt オブジェクトに紐付ける
|
30
|
+
//関数の外で関数内で定義した変数は使えないので、$mysqliは存在せず、エラーになる
|
31
|
+
if ($stmt = $mysqli->prepare($sql)) { //$mysqliが同じスコープ内で定義されていない
|
32
|
+
//以下略
|
33
|
+
```
|
34
|
+
|
4
|
-
|
35
|
+
これを修正しようとした場合
|
36
|
+
|
37
|
+
```PHP
|
38
|
+
function getDeviceData(){
|
39
|
+
//引数とDB接続情報は使っていないので削除。理解が進んだら追加してみてください。
|
40
|
+
//DBコネクタを生成
|
41
|
+
$Mysqli = new mysqli('localhost', 'root', '', 'deviceswithinventory');
|
42
|
+
if ($Mysqli->connect_error) {
|
43
|
+
error_log($Mysqli_connect_error);
|
44
|
+
exit;
|
45
|
+
}
|
46
|
+
//戻り値として$Mysqiを呼び出し元に返す
|
47
|
+
return $Mysqli;
|
48
|
+
}
|
49
|
+
```
|
50
|
+
として(関数名からすると不思議な動きですので、関数名自体をdb_connect()とかに変える方がいいとは思いますが、ここでは無視します)
|
51
|
+
|
52
|
+
devices.phpを
|
53
|
+
```PHP
|
54
|
+
<?php
|
55
|
+
//①データ取得ロジックを呼び出す
|
56
|
+
include_once('model.php');
|
57
|
+
$mysqli = getDeviceData();
|
58
|
+
|
59
|
+
// ここでSQL文を作成する
|
60
|
+
$sql = "SELECT * from devices where device_name = ? and serial_number = ? and manufacturer = ? and model = ? and os = ?";
|
61
|
+
// SQL文を$stmt オブジェクトに紐付ける
|
62
|
+
if ($stmt = $mysqli->prepare($sql)) {
|
63
|
+
```
|
64
|
+
|
65
|
+
という感じにすればgetDeviceData()内でnewされたmysqiオブジェクトを関数外で使用することが可能になります。
|
66
|
+
|
5
67
|
|
6
68
|
最初の回答
|
7
69
|
---
|
1
修正中
test
CHANGED
@@ -1,3 +1,12 @@
|
|
1
|
+
追記
|
2
|
+
---
|
3
|
+
最初の回答では大文字小文字の問題と解答しましたが、スコープの問題ですね。
|
4
|
+
現在回答修正中です。
|
5
|
+
|
6
|
+
最初の回答
|
7
|
+
---
|
8
|
+
|
9
|
+
|
1
10
|
PHPの変数は大文字と小文字が区別されるので、
|
2
11
|
model.php
|
3
12
|
```PHP
|