###前提・実現したいこと
以下$query
にございますように、ON DUPLICATE KEY UPDATE
によって、あればINSERT
、なければUPDATEP
という処理を実装しました。
この結果を、最後の行の$status
で判別したいのですが、もし方法がございましたら教えて頂けませんでしょうか?
###該当のソースコード
php
1// 初めてのフォローなら INSERT する 2// 過去にフォロー解除した場合 ( is_deleted=1 の場合 ) は is_deleted=0 に UPDATE して改めてフォロー状態とする 3$query = " 4INSERT INTO wp_test ( action_name, user_ID, target_user_ID, is_deleted ) 5VALUES ( 'フォロー', 10, 20, 0 ) 6ON DUPLICATE KEY UPDATE is_deleted = 0;"; 7 8$res = $wpdb->get_results($query); 9 10if ( $wpdb->last_error ) { 11 // エラー処理 12} else { 13 $status = 'INSERTされたかUPDATEされたかを判別したい'; 14}
###試したこと
var_dump($res)
には入っていませんし、$wpdb->last_error
にも入っていませんでした。
(なので出来なそうではあるのですが、もしご存じの方いらっしゃればと思いまして…)
###試したこと(追記)
リファレンスを参照すると以下の記載を見つけまして、どうやら判別はできるみたいです。
新しい行として挿入された場合は 1、既存の行が更新された場合は 2
そして
$res = $wpdb->get_results($query);
を
$res = $wpdb->query($query);
にして実行してみました。
しかし新規でも既存でもvar_dump($res)
には1
しか戻らず判別できませんでした…
###試したこと(追記2)
$wpdb
を使うから上記リファレンスのように判別できないのかと思い、下記のように自前で書きました。
クエリ自体は成功しますが、error_logの結果一覧
というコメントアウトが戻るだけでやはり判別できませんでした。
php
1$val_arr = [ 'フォロー', 10, 20, 0 ]; 2$vals = implode( ',', array_map( function($v){ return '?'; }, $val_arr ) ); 3$query = " 4INSERT INTO wp_test ( action_name, user_ID, target_user_ID, is_deleted ) 5VALUES ( {$vals} ) 6ON DUPLICATE KEY UPDATE is_deleted = 0;"; 7 8$mysqli = new mysqli(DB_HOST, DB_USER, DB_PASSWORD, DB_NAME); 9if (mysqli_connect_errno()) { 10 printf("Connect failed: %s\n", mysqli_connect_error()); 11 die(); 12}else{ 13 if ($stmt = $mysqli->prepare($query)) { 14 $formats = implode('', array_map( function($v){ return is_numeric($v) ? 's' : 'i'; }, $val_arr ) ); 15 $stmt->bind_param($formats, ...$val_arr); 16 $stmt->execute(); 17 $res1 = $stmt->affected_rows; 18 $res2 = $stmt->get_result(); 19 $res3 = $stmt->fetch(); 20 $stmt->free_result(); 21 $stmt->close(); 22 } 23 error_log('$res1 = ' . $res1); 24 error_log('$res2 = ' . $res2); 25 error_log('$res3 = ' . $res3); 26 error_log('$stmt = ' . json_encode($stmt)); 27 $status = 'INSERTされたかUPDATEされたかを判別したい'; 28} 29 30/* 31error_logの結果一覧 32 33$res1 = 1 34$res3 = 35$res2 = 36$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} 37*/
条件
とにかく一度のクエリで判別したいです。
たとえば事前にSELECT
して既存かどうかを確認するなどはなしでお願い致します。
WordPress 5.3.3
PHP 7.2.13