質問編集履歴
8
追記2に合わせて該当のソースコードの変数名を訂正しました
test
CHANGED
File without changes
|
test
CHANGED
@@ -7,6 +7,8 @@
|
|
7
7
|
この結果を、最後の行の`$status`で判別したいのですが、もし方法がございましたら教えて頂けませんでしょうか?
|
8
8
|
|
9
9
|
|
10
|
+
|
11
|
+
###該当のソースコード
|
10
12
|
|
11
13
|
```php
|
12
14
|
|
@@ -24,7 +26,7 @@
|
|
24
26
|
|
25
27
|
|
26
28
|
|
27
|
-
$r
|
29
|
+
$res = $wpdb->get_results($query);
|
28
30
|
|
29
31
|
|
30
32
|
|
@@ -42,7 +44,7 @@
|
|
42
44
|
|
43
45
|
###試したこと
|
44
46
|
|
45
|
-
`var_dump($r
|
47
|
+
`var_dump($res)`には入っていませんし、`$wpdb->last_error`にも入っていませんでした。
|
46
48
|
|
47
49
|
(なので出来なそうではあるのですが、もしご存じの方いらっしゃればと思いまして…)
|
48
50
|
|
@@ -60,13 +62,13 @@
|
|
60
62
|
|
61
63
|
そして
|
62
64
|
|
63
|
-
`$r
|
65
|
+
`$res = $wpdb->get_results($query);`を
|
64
66
|
|
65
|
-
`$r
|
67
|
+
`$res = $wpdb->query($query);`にして実行してみました。
|
66
68
|
|
67
69
|
|
68
70
|
|
69
|
-
しかし新規でも既存でも`var_dump($r
|
71
|
+
しかし新規でも既存でも`var_dump($res)`には`1`しか戻らず判別できませんでした…
|
70
72
|
|
71
73
|
|
72
74
|
|
@@ -93,10 +95,6 @@
|
|
93
95
|
ON DUPLICATE KEY UPDATE is_deleted = 0;";
|
94
96
|
|
95
97
|
|
96
|
-
|
97
|
-
$res = '$res初期値';
|
98
|
-
|
99
|
-
$stmt = '$stmt初期値';
|
100
98
|
|
101
99
|
$mysqli = new mysqli(DB_HOST, DB_USER, DB_PASSWORD, DB_NAME);
|
102
100
|
|
7
コードの不備を訂正しました
test
CHANGED
File without changes
|
test
CHANGED
@@ -82,6 +82,18 @@
|
|
82
82
|
|
83
83
|
$val_arr = [ 'フォロー', 10, 20, 0 ];
|
84
84
|
|
85
|
+
$vals = implode( ',', array_map( function($v){ return '?'; }, $val_arr ) );
|
86
|
+
|
87
|
+
$query = "
|
88
|
+
|
89
|
+
INSERT INTO wp_test ( action_name, user_ID, target_user_ID, is_deleted )
|
90
|
+
|
91
|
+
VALUES ( {$vals} )
|
92
|
+
|
93
|
+
ON DUPLICATE KEY UPDATE is_deleted = 0;";
|
94
|
+
|
95
|
+
|
96
|
+
|
85
97
|
$res = '$res初期値';
|
86
98
|
|
87
99
|
$stmt = '$stmt初期値';
|
@@ -96,7 +108,7 @@
|
|
96
108
|
|
97
109
|
}else{
|
98
110
|
|
99
|
-
if ($stmt = $mysqli->prepare($
|
111
|
+
if ($stmt = $mysqli->prepare($query)) {
|
100
112
|
|
101
113
|
$formats = implode('', array_map( function($v){ return is_numeric($v) ? 's' : 'i'; }, $val_arr ) );
|
102
114
|
|
6
追記に合わせて条件を訂正しました
test
CHANGED
File without changes
|
test
CHANGED
@@ -154,7 +154,7 @@
|
|
154
154
|
|
155
155
|
### 条件
|
156
156
|
|
157
|
-
とにかく一度の
|
157
|
+
とにかく一度のクエリで判別したいです。
|
158
158
|
|
159
159
|
たとえば事前に`SELECT`して既存かどうかを確認するなどはなしでお願い致します。
|
160
160
|
|
5
試したこと(追記2)を追加しました
test
CHANGED
File without changes
|
test
CHANGED
@@ -52,7 +52,7 @@
|
|
52
52
|
|
53
53
|
###試したこと(追記)
|
54
54
|
|
55
|
-
[リファレンス
|
55
|
+
[リファレンス](https://dev.mysql.com/doc/refman/5.6/ja/insert-on-duplicate.html)を参照すると以下の記載を見つけまして、どうやら判別はできるみたいです。
|
56
56
|
|
57
57
|
> 新しい行として挿入された場合は 1、既存の行が更新された場合は 2
|
58
58
|
|
@@ -66,7 +66,89 @@
|
|
66
66
|
|
67
67
|
|
68
68
|
|
69
|
-
しかし新規でも既存でも`var_dump($rows)`には`1`しか戻
|
69
|
+
しかし新規でも既存でも`var_dump($rows)`には`1`しか戻らず判別できませんでした…
|
70
|
+
|
71
|
+
|
72
|
+
|
73
|
+
###試したこと(追記2)
|
74
|
+
|
75
|
+
`$wpdb`を使うから上記リファレンスのように判別できないのかと思い、下記のように自前で書きました。
|
76
|
+
|
77
|
+
クエリ自体は成功しますが、`error_logの結果一覧`というコメントアウトが戻るだけでやはり判別できませんでした。
|
78
|
+
|
79
|
+
|
80
|
+
|
81
|
+
```php
|
82
|
+
|
83
|
+
$val_arr = [ 'フォロー', 10, 20, 0 ];
|
84
|
+
|
85
|
+
$res = '$res初期値';
|
86
|
+
|
87
|
+
$stmt = '$stmt初期値';
|
88
|
+
|
89
|
+
$mysqli = new mysqli(DB_HOST, DB_USER, DB_PASSWORD, DB_NAME);
|
90
|
+
|
91
|
+
if (mysqli_connect_errno()) {
|
92
|
+
|
93
|
+
printf("Connect failed: %s\n", mysqli_connect_error());
|
94
|
+
|
95
|
+
die();
|
96
|
+
|
97
|
+
}else{
|
98
|
+
|
99
|
+
if ($stmt = $mysqli->prepare($sql)) {
|
100
|
+
|
101
|
+
$formats = implode('', array_map( function($v){ return is_numeric($v) ? 's' : 'i'; }, $val_arr ) );
|
102
|
+
|
103
|
+
$stmt->bind_param($formats, ...$val_arr);
|
104
|
+
|
105
|
+
$stmt->execute();
|
106
|
+
|
107
|
+
$res1 = $stmt->affected_rows;
|
108
|
+
|
109
|
+
$res2 = $stmt->get_result();
|
110
|
+
|
111
|
+
$res3 = $stmt->fetch();
|
112
|
+
|
113
|
+
$stmt->free_result();
|
114
|
+
|
115
|
+
$stmt->close();
|
116
|
+
|
117
|
+
}
|
118
|
+
|
119
|
+
error_log('$res1 = ' . $res1);
|
120
|
+
|
121
|
+
error_log('$res2 = ' . $res2);
|
122
|
+
|
123
|
+
error_log('$res3 = ' . $res3);
|
124
|
+
|
125
|
+
error_log('$stmt = ' . json_encode($stmt));
|
126
|
+
|
127
|
+
$status = 'INSERTされたかUPDATEされたかを判別したい';
|
128
|
+
|
129
|
+
}
|
130
|
+
|
131
|
+
|
132
|
+
|
133
|
+
/*
|
134
|
+
|
135
|
+
error_logの結果一覧
|
136
|
+
|
137
|
+
|
138
|
+
|
139
|
+
$res1 = 1
|
140
|
+
|
141
|
+
$res3 =
|
142
|
+
|
143
|
+
$res2 =
|
144
|
+
|
145
|
+
$stmt = {"affected_rows":null,"insert_id":null,"num_rows":null,"param_count":null,"field_count":null,"errno":null,"error":null,"error_list":null,"sqlstate":null,"id":null}
|
146
|
+
|
147
|
+
*/
|
148
|
+
|
149
|
+
```
|
150
|
+
|
151
|
+
|
70
152
|
|
71
153
|
|
72
154
|
|
@@ -75,3 +157,9 @@
|
|
75
157
|
とにかく一度の`get_results`でのみ判別したいです。
|
76
158
|
|
77
159
|
たとえば事前に`SELECT`して既存かどうかを確認するなどはなしでお願い致します。
|
160
|
+
|
161
|
+
|
162
|
+
|
163
|
+
WordPress 5.3.3
|
164
|
+
|
165
|
+
PHP 7.2.13
|
4
試したこと(追記)を追加しました
test
CHANGED
File without changes
|
test
CHANGED
@@ -48,6 +48,28 @@
|
|
48
48
|
|
49
49
|
|
50
50
|
|
51
|
+
|
52
|
+
|
53
|
+
###試したこと(追記)
|
54
|
+
|
55
|
+
[リファレンスマニュアル](https://dev.mysql.com/doc/refman/5.6/ja/insert-on-duplicate.html)を参照すると、以下の記載を見つけました。
|
56
|
+
|
57
|
+
> 新しい行として挿入された場合は 1、既存の行が更新された場合は 2
|
58
|
+
|
59
|
+
|
60
|
+
|
61
|
+
そして
|
62
|
+
|
63
|
+
`$rows = $wpdb->get_results($query);`を
|
64
|
+
|
65
|
+
`$rows = $wpdb->query($query);`にして実行してみました。
|
66
|
+
|
67
|
+
|
68
|
+
|
69
|
+
しかし新規でも既存でも`var_dump($rows)`には`1`しか戻りませんでした…
|
70
|
+
|
71
|
+
|
72
|
+
|
51
73
|
### 条件
|
52
74
|
|
53
75
|
とにかく一度の`get_results`でのみ判別したいです。
|
3
条件を修正し、コードを実際のケースに沿ったものに変更しました
test
CHANGED
File without changes
|
test
CHANGED
@@ -10,17 +10,17 @@
|
|
10
10
|
|
11
11
|
```php
|
12
12
|
|
13
|
-
|
13
|
+
// 初めてのフォローなら INSERT する
|
14
14
|
|
15
|
-
|
15
|
+
// 過去にフォロー解除した場合 ( is_deleted=1 の場合 ) は is_deleted=0 に UPDATE して改めてフォロー状態とする
|
16
16
|
|
17
17
|
$query = "
|
18
18
|
|
19
|
-
INSERT INTO wp_test ( is_
|
19
|
+
INSERT INTO wp_test ( action_name, user_ID, target_user_ID, is_deleted )
|
20
20
|
|
21
|
-
VALUES (
|
21
|
+
VALUES ( 'フォロー', 10, 20, 0 )
|
22
22
|
|
23
|
-
ON DUPLICATE KEY UPDATE is_
|
23
|
+
ON DUPLICATE KEY UPDATE is_deleted = 0;";
|
24
24
|
|
25
25
|
|
26
26
|
|
@@ -28,11 +28,11 @@
|
|
28
28
|
|
29
29
|
|
30
30
|
|
31
|
-
if( $wpdb->last_error ){
|
31
|
+
if ( $wpdb->last_error ) {
|
32
32
|
|
33
33
|
// エラー処理
|
34
34
|
|
35
|
-
}else{
|
35
|
+
} else {
|
36
36
|
|
37
37
|
$status = 'INSERTされたかUPDATEされたかを判別したい';
|
38
38
|
|
@@ -50,10 +50,6 @@
|
|
50
50
|
|
51
51
|
### 条件
|
52
52
|
|
53
|
-
|
53
|
+
とにかく一度の`get_results`でのみ判別したいです。
|
54
54
|
|
55
|
-
|
56
|
-
|
57
|
-
|
55
|
+
たとえば事前に`SELECT`して既存かどうかを確認するなどはなしでお願い致します。
|
58
|
-
|
59
|
-
とにかく一度の`get_results`でのみ判別したいです。
|
2
条件をさらに追加しました
test
CHANGED
File without changes
|
test
CHANGED
@@ -51,3 +51,9 @@
|
|
51
51
|
### 条件
|
52
52
|
|
53
53
|
なお、上のPHPですともう一度`SELECT`のクエリを発行して、「`is_flag`の値が`1`なら`UPDATE`されたのだ」と判別できますが、そのようにクエリを新たに発行しない方向でお願いできましたらと思います。(必ずしも`UPDATE`された場合に`1`になるとは限らないため。)
|
54
|
+
|
55
|
+
|
56
|
+
|
57
|
+
すみませんさらに追加で、事前に`SELECT`して既存かどうかを確認するというのもなしでお願い致します。
|
58
|
+
|
59
|
+
とにかく一度の`get_results`でのみ判別したいです。
|
1
条件を追加させて頂きました
test
CHANGED
File without changes
|
test
CHANGED
@@ -4,19 +4,23 @@
|
|
4
4
|
|
5
5
|
|
6
6
|
|
7
|
-
この結果を、最後の行の`$status`で判
|
7
|
+
この結果を、最後の行の`$status`で判別したいのですが、もし方法がございましたら教えて頂けませんでしょうか?
|
8
8
|
|
9
9
|
|
10
10
|
|
11
11
|
```php
|
12
12
|
|
13
|
+
$is_flag = 0;
|
14
|
+
|
15
|
+
|
16
|
+
|
13
17
|
$query = "
|
14
18
|
|
15
|
-
INSERT INTO wp_test (
|
19
|
+
INSERT INTO wp_test ( is_flag )
|
16
20
|
|
17
|
-
VALUES (
|
21
|
+
VALUES ( {$is_flag} )
|
18
22
|
|
19
|
-
ON DUPLICATE KEY UPDATE
|
23
|
+
ON DUPLICATE KEY UPDATE is_flag = 1;";
|
20
24
|
|
21
25
|
|
22
26
|
|
@@ -41,3 +45,9 @@
|
|
41
45
|
`var_dump($rows)`には入っていませんし、`$wpdb->last_error`にも入っていませんでした。
|
42
46
|
|
43
47
|
(なので出来なそうではあるのですが、もしご存じの方いらっしゃればと思いまして…)
|
48
|
+
|
49
|
+
|
50
|
+
|
51
|
+
### 条件
|
52
|
+
|
53
|
+
なお、上のPHPですともう一度`SELECT`のクエリを発行して、「`is_flag`の値が`1`なら`UPDATE`されたのだ」と判別できますが、そのようにクエリを新たに発行しない方向でお願いできましたらと思います。(必ずしも`UPDATE`された場合に`1`になるとは限らないため。)
|