質問編集履歴
8
追記2に合わせて該当のソースコードの変数名を訂正しました
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
|
-
$
|
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($
|
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
|
-
`$
|
33
|
+
`$res = $wpdb->get_results($query);`を
|
33
|
-
`$
|
34
|
+
`$res = $wpdb->query($query);`にして実行してみました。
|
34
35
|
|
35
|
-
しかし新規でも既存でも`var_dump($
|
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
コードの不備を訂正しました
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($
|
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
追記に合わせて条件を訂正しました
title
CHANGED
File without changes
|
body
CHANGED
@@ -76,7 +76,7 @@
|
|
76
76
|
|
77
77
|
|
78
78
|
### 条件
|
79
|
-
とにかく一度の
|
79
|
+
とにかく一度のクエリで判別したいです。
|
80
80
|
たとえば事前に`SELECT`して既存かどうかを確認するなどはなしでお願い致します。
|
81
81
|
|
82
82
|
WordPress 5.3.3
|
5
試したこと(追記2)を追加しました
title
CHANGED
File without changes
|
body
CHANGED
@@ -25,15 +25,59 @@
|
|
25
25
|
|
26
26
|
|
27
27
|
###試したこと(追記)
|
28
|
-
[リファレンス
|
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
試したこと(追記)を追加しました
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
条件を修正し、コードを実際のケースに沿ったものに変更しました
title
CHANGED
File without changes
|
body
CHANGED
@@ -4,18 +4,18 @@
|
|
4
4
|
この結果を、最後の行の`$status`で判別したいのですが、もし方法がございましたら教えて頂けませんでしょうか?
|
5
5
|
|
6
6
|
```php
|
7
|
-
|
7
|
+
// 初めてのフォローなら INSERT する
|
8
|
-
|
8
|
+
// 過去にフォロー解除した場合 ( is_deleted=1 の場合 ) は is_deleted=0 に UPDATE して改めてフォロー状態とする
|
9
9
|
$query = "
|
10
|
-
INSERT INTO wp_test (
|
10
|
+
INSERT INTO wp_test ( action_name, user_ID, target_user_ID, is_deleted )
|
11
|
-
VALUES (
|
11
|
+
VALUES ( 'フォロー', 10, 20, 0 )
|
12
|
-
ON DUPLICATE KEY UPDATE
|
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
条件をさらに追加しました
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
条件を追加させて頂きました
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 (
|
10
|
+
INSERT INTO wp_test ( is_flag )
|
9
|
-
VALUES (
|
11
|
+
VALUES ( {$is_flag} )
|
10
|
-
ON DUPLICATE KEY 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`になるとは限らないため。)
|