質問編集履歴

8

追記2に合わせて該当のソースコードの変数名を訂正しました

2020/12/17 18:39

投稿

hana_hana
hana_hana

スコア27

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
- $rows = $wpdb->get_results($query);
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($rows)`には入っていませんし、`$wpdb->last_error`にも入っていませんでした。
47
+ `var_dump($res)`には入っていませんし、`$wpdb->last_error`にも入っていませんでした。
46
48
 
47
49
  (なので出来なそうではあるのですが、もしご存じの方いらっしゃればと思いまして…)
48
50
 
@@ -60,13 +62,13 @@
60
62
 
61
63
  そして
62
64
 
63
- `$rows = $wpdb->get_results($query);`を
65
+ `$res = $wpdb->get_results($query);`を
64
66
 
65
- `$rows = $wpdb->query($query);`にして実行してみました。
67
+ `$res = $wpdb->query($query);`にして実行してみました。
66
68
 
67
69
 
68
70
 
69
- しかし新規でも既存でも`var_dump($rows)`には`1`しか戻らず判別できませんでした…
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

コードの不備を訂正しました

2020/12/17 18:39

投稿

hana_hana
hana_hana

スコア27

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($sql)) {
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

追記に合わせて条件を訂正しました

2020/12/17 18:36

投稿

hana_hana
hana_hana

スコア27

test CHANGED
File without changes
test CHANGED
@@ -154,7 +154,7 @@
154
154
 
155
155
  ### 条件
156
156
 
157
- とにかく一度の`get_results`のみ判別したいです。
157
+ とにかく一度のクエリで判別したいです。
158
158
 
159
159
  たとえば事前に`SELECT`して既存かどうかを確認するなどはなしでお願い致します。
160
160
 

5

試したこと(追記2)を追加しました

2020/12/17 18:28

投稿

hana_hana
hana_hana

スコア27

test CHANGED
File without changes
test CHANGED
@@ -52,7 +52,7 @@
52
52
 
53
53
  ###試したこと(追記)
54
54
 
55
- [リファレンスマニュアル](https://dev.mysql.com/doc/refman/5.6/ja/insert-on-duplicate.html)を参照すると以下の記載を見つけました。
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

試したこと(追記)を追加しました

2020/12/17 18:26

投稿

hana_hana
hana_hana

スコア27

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

条件を修正し、コードを実際のケースに沿ったものに変更しました

2020/12/17 17:11

投稿

hana_hana
hana_hana

スコア27

test CHANGED
File without changes
test CHANGED
@@ -10,17 +10,17 @@
10
10
 
11
11
  ```php
12
12
 
13
- $is_flag = 0;
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_flag )
19
+ INSERT INTO wp_test ( action_name, user_ID, target_user_ID, is_deleted )
20
20
 
21
- VALUES ( {$is_flag} )
21
+ VALUES ( 'フォロー', 10, 20, 0 )
22
22
 
23
- ON DUPLICATE KEY UPDATE is_flag = 1;";
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
- なお、上のPHPですもう一度`SELECT`クエリを発行して、「`is_flag`の値が`1`なら`UPDATE`されたのだ」と判別できますが、そのようにクエリを新に発行しな方向お願いできましたらと思います。(必ずしも`UPDATE`された場合に`1`になるとは限らないため。)
53
+ にかく一度の`get_results`判別たいです。
54
54
 
55
-
56
-
57
- すみませんさらに追加で、事前に`SELECT`して既存かどうかを確認するというのもなしでお願い致します。
55
+ たとえば事前に`SELECT`して既存かどうかを確認するなどはなしでお願い致します。
58
-
59
- とにかく一度の`get_results`でのみ判別したいです。

2

条件をさらに追加しました

2020/12/17 16:56

投稿

hana_hana
hana_hana

スコア27

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

条件を追加させて頂きました

2020/12/17 16:42

投稿

hana_hana
hana_hana

スコア27

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 ( col )
19
+ INSERT INTO wp_test ( is_flag )
16
20
 
17
- VALUES ( 'INSERTしました' )
21
+ VALUES ( {$is_flag} )
18
22
 
19
- ON DUPLICATE KEY UPDATE col = '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`になるとは限らないため。)