###実現したいこと
以下my_update_yasai()
という関数で、$updates
の値を保存したいです。
###発生している問題
保存が実行されません。
$sql
の変数が原因ではないか?と、
これから書くような根拠から推察していますが、
その解決策がわからない状況です。
宜しくお願い致します。
###該当のソースコード
まず以下$updates
が保存する情報でして、
これをループしてmy_update_yasai()
を実行していく流れです。
php
1 2// 保存を実行 3$updates = [ 4 ['yasai_name'=>'野菜A','yasai_count'=>64,'yasai_data'=>'野菜Aはとても甘い'], 5 ['yasai_name'=>'野菜B','yasai_count'=>45,'yasai_data'=>'野菜Bはとても辛い'], 6 ['yasai_name'=>'野菜C','yasai_count'=>78,'yasai_data'=>'野菜Cはとても苦い'], 7]; 8foreach( $updates as $update ) { 9 my_update_yasai( 'insert', $update ); 10}
保存の関数がこちらですが、実現できない状況です。
php
1// 保存の関数 2function my_update_yasai( $type, $update, $targets=null ) { 3 4 global $wpdb; 5 6 // 更新する情報 7 $table = $wpdb->yasai_table; 8 $yasai_time = $update['yasai_time'] ?? 0000; 9 $yasai_name = $update['yasai_name'] ?? 'nothing'; 10 $yasai_count= $update['yasai_count'] ?? 0000; 11 $yasai_data = $update['yasai_data'] ?? 'nothing'; 12 13 // 更新する値 14 $data = []; 15 if ( isset($yasai_time) ) { 16 $data['yasai_time'] = $yasai_time; 17 } 18 if ( isset($yasai_name) ) { 19 $data['yasai_name'] = $yasai_name; 20 } 21 if ( isset($yasai_count) ) { 22 $data['yasai_count'] = $yasai_count; 23 } 24 if ( isset($yasai_data) ) { 25 $data['yasai_data'] = $yasai_data; 26 } 27 28 // $data の値の書式 29 $format = []; 30 if ( isset($yasai_time) ) { 31 $format[] = '%d'; 32 } 33 if ( isset($yasai_name) ) { 34 $format[] = '%s'; 35 } 36 if ( isset($yasai_count) ) { 37 $format[] = '%d'; 38 } 39 if ( isset($yasai_data) ) { 40 $format[] = '%s'; 41 } 42 43 if ( $type == 'insert' ) { 44 45 // $updateで指定した情報を保存する処理 46 $data_keys = rtrim(implode(",",array_keys($data))); 47 $data_vals = rtrim(implode(",",$data)); 48 $formats = rtrim(implode(",",$format)); 49 $sql = $wpdb->prepare("INSERT INTO $wpdb->yasai_table ( $data_keys ) values ( $formats )", $data_vals); 50 var_dump($sql); // 【 ← 追記その1 】 51 $wpdb->query($sql); 52 53 }elseif ( $type == 'update' ) { 54 55 // $targetsで指定した行に対して、$updateで指定した情報を上書きする処理 56 57 } 58} 59
###試したこと
my_update_yasai()
で、以下$sql
部分の変数が
正しく展開できていないのではないかと考えています。
php
1$sql = $wpdb->prepare("INSERT INTO $wpdb->yasai_table ( $data_keys ) values ( $formats )", $data_vals);
そこで$data_keys
,$formats
,$data_vals
の各変数を
var_dump
したところ以下の結果を得ました。
php
1string(44) "yasai_time,yasai_name,yasai_count,yasai_data" 2string(11) "%d,%s,%d,%s" 3string(49) "1,野菜テスト,111,野菜テストのデータ"
上の値をvar_dumpするコードは次の通りで、
これは該当のソースコードのループをやめたものとなっています。
php
1<?php 2$yasai_time = 1; 3$yasai_name = '野菜テスト'; 4$yasai_count = 111; 5$yasai_data = '野菜テストのデータ'; 6 7// 更新する値 8$data = []; 9if ( isset($yasai_time) ) { 10 $data['yasai_time'] = $yasai_time; 11} 12if ( isset($yasai_name) ) { 13 $data['yasai_name'] = $yasai_name; 14} 15if ( isset($yasai_count) ) { 16 $data['yasai_count'] = $yasai_count; 17} 18if ( isset($yasai_data) ) { 19 $data['yasai_data'] = $yasai_data; 20} 21 22// $data の値の書式 23$format = []; 24if ( isset($yasai_time) ) { 25 $format[] = '%d'; 26} 27if ( isset($yasai_name) ) { 28 $format[] = '%s'; 29} 30if ( isset($yasai_count) ) { 31 $format[] = '%d'; 32} 33if ( isset($yasai_data) ) { 34 $format[] = '%s'; 35} 36 37$data_keys = rtrim(implode(",",array_keys($data))); 38$formats = rtrim(implode(",",$format)); 39$data_vals = rtrim(implode(",",$data)); 40var_dump( $data_keys ); 41var_dump( $formats ); 42var_dump( $data_vals );
さて上のvar_dump
を確認できたのでその値を使い、
my_update_yasai()
の変数をやめたバージョンとして次の
my_update_yasai_test()
のように直接入れた関数を作ってみますと、
保存が実現できました。
php
1// 新規保存テスト 2function my_update_yasai_test( $yasai_name, $yasai_count, $yasai_data ) { 3 global $wpdb; 4 $sql = $wpdb->prepare("INSERT INTO $wpdb->yasai_table (yasai_name, yasai_count, yasai_data) values (%s, %d, %s)", $yasai_name, $yasai_count, $yasai_data); 5 var_dump($sql); // 【 ← 追記その2 】 6 $wpdb->query($sql); 7} 8my_update_yasai_test( '野菜Z', 77, '野菜Zはかなりレア' );
以上のことから推察するに、
該当のソースコードの$sql
の変数が原因ではないか?と考えています。
しかし、my_update_yasai()
でできず、その変数部分を直接書いたmy_update_yasai_test()
でできて、かといってmy_update_yasai()
の変数をvar_dump
するとmy_update_yasai_test()
に直接書いた値と同じですから、これ以上なにをすればいいのかと行き詰ってしまいました。
アドバイス頂けましたら幸いです。
宜しくお願い致します。
###追記
上のそれぞれの関数で
var_dump($sql); // 【 ← 追記その1 】
var_dump($sql); // 【 ← 追記その2 】
というvar_dump
を追記しました。
その結果は以下です。
↓うまくいってる場合のmy_update_yasai_test()
でvar_dump($sql)
string(126) "INSERT INTO wp_yasai_table (yasai_name, yasai_count, yasa_data) values ('野菜テスト', 111, '野菜テストのデータ')"
↓ダメな場合のmy_update_yasai()
でvar_dump($sql)
string(0) ""
string(0) ""
string(0) ""
後者でなぜ空になるのか…かなり戸惑っています。