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

質問編集履歴

8

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

2020/12/17 18:39

投稿

hana_hana
hana_hana

スコア27

title CHANGED
File without changes
body CHANGED
@@ -3,6 +3,7 @@
3
3
 
4
4
  この結果を、最後の行の`$status`で判別したいのですが、もし方法がございましたら教えて頂けませんでしょうか?
5
5
 
6
+ ###該当のソースコード
6
7
  ```php
7
8
  // 初めてのフォローなら INSERT する
8
9
  // 過去にフォロー解除した場合 ( is_deleted=1 の場合 ) は is_deleted=0 に UPDATE して改めてフォロー状態とする
@@ -11,7 +12,7 @@
11
12
  VALUES ( 'フォロー', 10, 20, 0 )
12
13
  ON DUPLICATE KEY UPDATE is_deleted = 0;";
13
14
 
14
- $rows = $wpdb->get_results($query);
15
+ $res = $wpdb->get_results($query);
15
16
 
16
17
  if ( $wpdb->last_error ) {
17
18
  // エラー処理
@@ -20,7 +21,7 @@
20
21
  }
21
22
  ```
22
23
  ###試したこと
23
- `var_dump($rows)`には入っていませんし、`$wpdb->last_error`にも入っていませんでした。
24
+ `var_dump($res)`には入っていませんし、`$wpdb->last_error`にも入っていませんでした。
24
25
  (なので出来なそうではあるのですが、もしご存じの方いらっしゃればと思いまして…)
25
26
 
26
27
 
@@ -29,10 +30,10 @@
29
30
  > 新しい行として挿入された場合は 1、既存の行が更新された場合は 2
30
31
 
31
32
  そして
32
- `$rows = $wpdb->get_results($query);`を
33
+ `$res = $wpdb->get_results($query);`を
33
- `$rows = $wpdb->query($query);`にして実行してみました。
34
+ `$res = $wpdb->query($query);`にして実行してみました。
34
35
 
35
- しかし新規でも既存でも`var_dump($rows)`には`1`しか戻らず判別できませんでした…
36
+ しかし新規でも既存でも`var_dump($res)`には`1`しか戻らず判別できませんでした…
36
37
 
37
38
  ###試したこと(追記2)
38
39
  `$wpdb`を使うから上記リファレンスのように判別できないのかと思い、下記のように自前で書きました。
@@ -46,8 +47,6 @@
46
47
  VALUES ( {$vals} )
47
48
  ON DUPLICATE KEY UPDATE is_deleted = 0;";
48
49
 
49
- $res = '$res初期値';
50
- $stmt = '$stmt初期値';
51
50
  $mysqli = new mysqli(DB_HOST, DB_USER, DB_PASSWORD, DB_NAME);
52
51
  if (mysqli_connect_errno()) {
53
52
  printf("Connect failed: %s\n", mysqli_connect_error());

7

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

2020/12/17 18:39

投稿

hana_hana
hana_hana

スコア27

title CHANGED
File without changes
body CHANGED
@@ -40,6 +40,12 @@
40
40
 
41
41
  ```php
42
42
  $val_arr = [ 'フォロー', 10, 20, 0 ];
43
+ $vals = implode( ',', array_map( function($v){ return '?'; }, $val_arr ) );
44
+ $query = "
45
+ INSERT INTO wp_test ( action_name, user_ID, target_user_ID, is_deleted )
46
+ VALUES ( {$vals} )
47
+ ON DUPLICATE KEY UPDATE is_deleted = 0;";
48
+
43
49
  $res = '$res初期値';
44
50
  $stmt = '$stmt初期値';
45
51
  $mysqli = new mysqli(DB_HOST, DB_USER, DB_PASSWORD, DB_NAME);
@@ -47,7 +53,7 @@
47
53
  printf("Connect failed: %s\n", mysqli_connect_error());
48
54
  die();
49
55
  }else{
50
- if ($stmt = $mysqli->prepare($sql)) {
56
+ if ($stmt = $mysqli->prepare($query)) {
51
57
  $formats = implode('', array_map( function($v){ return is_numeric($v) ? 's' : 'i'; }, $val_arr ) );
52
58
  $stmt->bind_param($formats, ...$val_arr);
53
59
  $stmt->execute();

6

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

2020/12/17 18:36

投稿

hana_hana
hana_hana

スコア27

title CHANGED
File without changes
body CHANGED
@@ -76,7 +76,7 @@
76
76
 
77
77
 
78
78
  ### 条件
79
- とにかく一度の`get_results`のみ判別したいです。
79
+ とにかく一度のクエリで判別したいです。
80
80
  たとえば事前に`SELECT`して既存かどうかを確認するなどはなしでお願い致します。
81
81
 
82
82
  WordPress 5.3.3

5

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

2020/12/17 18:28

投稿

hana_hana
hana_hana

スコア27

title CHANGED
File without changes
body CHANGED
@@ -25,15 +25,59 @@
25
25
 
26
26
 
27
27
  ###試したこと(追記)
28
- [リファレンスマニュアル](https://dev.mysql.com/doc/refman/5.6/ja/insert-on-duplicate.html)を参照すると以下の記載を見つけました。
28
+ [リファレンス](https://dev.mysql.com/doc/refman/5.6/ja/insert-on-duplicate.html)を参照すると以下の記載を見つけまして、どうやら判別はできるみいです
29
29
  > 新しい行として挿入された場合は 1、既存の行が更新された場合は 2
30
30
 
31
31
  そして
32
32
  `$rows = $wpdb->get_results($query);`を
33
33
  `$rows = $wpdb->query($query);`にして実行してみました。
34
34
 
35
- しかし新規でも既存でも`var_dump($rows)`には`1`しか戻ませんでした…
35
+ しかし新規でも既存でも`var_dump($rows)`には`1`しか戻らず判別できませんでした…
36
36
 
37
+ ###試したこと(追記2)
38
+ `$wpdb`を使うから上記リファレンスのように判別できないのかと思い、下記のように自前で書きました。
39
+ クエリ自体は成功しますが、`error_logの結果一覧`というコメントアウトが戻るだけでやはり判別できませんでした。
40
+
41
+ ```php
42
+ $val_arr = [ 'フォロー', 10, 20, 0 ];
43
+ $res = '$res初期値';
44
+ $stmt = '$stmt初期値';
45
+ $mysqli = new mysqli(DB_HOST, DB_USER, DB_PASSWORD, DB_NAME);
46
+ if (mysqli_connect_errno()) {
47
+ printf("Connect failed: %s\n", mysqli_connect_error());
48
+ die();
49
+ }else{
50
+ if ($stmt = $mysqli->prepare($sql)) {
51
+ $formats = implode('', array_map( function($v){ return is_numeric($v) ? 's' : 'i'; }, $val_arr ) );
52
+ $stmt->bind_param($formats, ...$val_arr);
53
+ $stmt->execute();
54
+ $res1 = $stmt->affected_rows;
55
+ $res2 = $stmt->get_result();
56
+ $res3 = $stmt->fetch();
57
+ $stmt->free_result();
58
+ $stmt->close();
59
+ }
60
+ error_log('$res1 = ' . $res1);
61
+ error_log('$res2 = ' . $res2);
62
+ error_log('$res3 = ' . $res3);
63
+ error_log('$stmt = ' . json_encode($stmt));
64
+ $status = 'INSERTされたかUPDATEされたかを判別したい';
65
+ }
66
+
67
+ /*
68
+ error_logの結果一覧
69
+
70
+ $res1 = 1
71
+ $res3 =
72
+ $res2 =
73
+ $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}
74
+ */
75
+ ```
76
+
77
+
37
78
  ### 条件
38
79
  とにかく一度の`get_results`でのみ判別したいです。
39
- たとえば事前に`SELECT`して既存かどうかを確認するなどはなしでお願い致します。
80
+ たとえば事前に`SELECT`して既存かどうかを確認するなどはなしでお願い致します。
81
+
82
+ WordPress 5.3.3
83
+ PHP 7.2.13

4

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

2020/12/17 18:26

投稿

hana_hana
hana_hana

スコア27

title CHANGED
File without changes
body CHANGED
@@ -23,6 +23,17 @@
23
23
  `var_dump($rows)`には入っていませんし、`$wpdb->last_error`にも入っていませんでした。
24
24
  (なので出来なそうではあるのですが、もしご存じの方いらっしゃればと思いまして…)
25
25
 
26
+
27
+ ###試したこと(追記)
28
+ [リファレンスマニュアル](https://dev.mysql.com/doc/refman/5.6/ja/insert-on-duplicate.html)を参照すると、以下の記載を見つけました。
29
+ > 新しい行として挿入された場合は 1、既存の行が更新された場合は 2
30
+
31
+ そして
32
+ `$rows = $wpdb->get_results($query);`を
33
+ `$rows = $wpdb->query($query);`にして実行してみました。
34
+
35
+ しかし新規でも既存でも`var_dump($rows)`には`1`しか戻りませんでした…
36
+
26
37
  ### 条件
27
38
  とにかく一度の`get_results`でのみ判別したいです。
28
39
  たとえば事前に`SELECT`して既存かどうかを確認するなどはなしでお願い致します。

3

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

2020/12/17 17:11

投稿

hana_hana
hana_hana

スコア27

title CHANGED
File without changes
body CHANGED
@@ -4,18 +4,18 @@
4
4
  この結果を、最後の行の`$status`で判別したいのですが、もし方法がございましたら教えて頂けませんでしょうか?
5
5
 
6
6
  ```php
7
- $is_flag = 0;
7
+ // 初めてのフォローなら INSERT する
8
-
8
+ // 過去にフォロー解除した場合 ( is_deleted=1 の場合 ) は is_deleted=0 に UPDATE して改めてフォロー状態とする
9
9
  $query = "
10
- INSERT INTO wp_test ( is_flag )
10
+ INSERT INTO wp_test ( action_name, user_ID, target_user_ID, is_deleted )
11
- VALUES ( {$is_flag} )
11
+ VALUES ( 'フォロー', 10, 20, 0 )
12
- ON DUPLICATE KEY UPDATE is_flag = 1;";
12
+ ON DUPLICATE KEY UPDATE is_deleted = 0;";
13
13
 
14
14
  $rows = $wpdb->get_results($query);
15
15
 
16
- if( $wpdb->last_error ){
16
+ if ( $wpdb->last_error ) {
17
17
  // エラー処理
18
- }else{
18
+ } else {
19
19
  $status = 'INSERTされたかUPDATEされたかを判別したい';
20
20
  }
21
21
  ```
@@ -24,7 +24,5 @@
24
24
  (なので出来なそうではあるのですが、もしご存じの方いらっしゃればと思いまして…)
25
25
 
26
26
  ### 条件
27
- なお、上のPHPですともう一度`SELECT`のクエリを発行して、「`is_flag`の値が`1`なら`UPDATE`されたのだ」と判別できますが、そのようにクエリを新たに発行しない方向でお願いできましたらと思います。(必ずしも`UPDATE`された場合に`1`になるとは限らないため。)
28
-
29
- すみませんさらに追加で、事前に`SELECT`して既存かどうかを確認するというのもなしでお願い致します。
30
- とにかく一度の`get_results`でのみ判別したいです。
27
+ とにかく一度の`get_results`でのみ判別したいです。
28
+ たとえば事前に`SELECT`して既存かどうかを確認するなどはなしでお願い致します。

2

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

2020/12/17 16:56

投稿

hana_hana
hana_hana

スコア27

title CHANGED
File without changes
body CHANGED
@@ -24,4 +24,7 @@
24
24
  (なので出来なそうではあるのですが、もしご存じの方いらっしゃればと思いまして…)
25
25
 
26
26
  ### 条件
27
- なお、上のPHPですともう一度`SELECT`のクエリを発行して、「`is_flag`の値が`1`なら`UPDATE`されたのだ」と判別できますが、そのようにクエリを新たに発行しない方向でお願いできましたらと思います。(必ずしも`UPDATE`された場合に`1`になるとは限らないため。)
27
+ なお、上のPHPですともう一度`SELECT`のクエリを発行して、「`is_flag`の値が`1`なら`UPDATE`されたのだ」と判別できますが、そのようにクエリを新たに発行しない方向でお願いできましたらと思います。(必ずしも`UPDATE`された場合に`1`になるとは限らないため。)
28
+
29
+ すみませんさらに追加で、事前に`SELECT`して既存かどうかを確認するというのもなしでお願い致します。
30
+ とにかく一度の`get_results`でのみ判別したいです。

1

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

2020/12/17 16:42

投稿

hana_hana
hana_hana

スコア27

title CHANGED
File without changes
body CHANGED
@@ -1,13 +1,15 @@
1
1
  ###前提・実現したいこと
2
2
  以下`$query`にございますように、`ON DUPLICATE KEY UPDATE`によって、あれば`INSERT`、なければ`UPDATEP`という処理を実装しました。
3
3
 
4
- この結果を、最後の行の`$status`で判したいのですが、もし方法がございましたら教えて頂けませんでしょうか?
4
+ この結果を、最後の行の`$status`で判したいのですが、もし方法がございましたら教えて頂けませんでしょうか?
5
5
 
6
6
  ```php
7
+ $is_flag = 0;
8
+
7
9
  $query = "
8
- INSERT INTO wp_test ( col )
10
+ INSERT INTO wp_test ( is_flag )
9
- VALUES ( 'INSERTしました' )
11
+ VALUES ( {$is_flag} )
10
- ON DUPLICATE KEY UPDATE col = 'UPDATEしました';";
12
+ ON DUPLICATE KEY UPDATE is_flag = 1;";
11
13
 
12
14
  $rows = $wpdb->get_results($query);
13
15
 
@@ -19,4 +21,7 @@
19
21
  ```
20
22
  ###試したこと
21
23
  `var_dump($rows)`には入っていませんし、`$wpdb->last_error`にも入っていませんでした。
22
- (なので出来なそうではあるのですが、もしご存じの方いらっしゃればと思いまして…)
24
+ (なので出来なそうではあるのですが、もしご存じの方いらっしゃればと思いまして…)
25
+
26
+ ### 条件
27
+ なお、上のPHPですともう一度`SELECT`のクエリを発行して、「`is_flag`の値が`1`なら`UPDATE`されたのだ」と判別できますが、そのようにクエリを新たに発行しない方向でお願いできましたらと思います。(必ずしも`UPDATE`された場合に`1`になるとは限らないため。)