###知りたいこと
SQL文の発行にあたって以下プリペアドステートメントを用いますが、この際に各値が不定数であるときの方法を知りたいです。
PHP
1$sql = $wpdb->prepare(‘query’,$vaule1,$vaule2…)
つまり下記該当のソースコートの$data
のような不定数な配列から、正常な$sql
を作りたいということになります。
###該当のソースコード
不定数の値とは下記$data
でして、これがなんであろうと正常な$sql
を作りたいのですが、以下でvar_dump($sql)
がstring(0) ""
となる事態に遭遇しました。
php
1<?php 2global $wpdb; 3 4// 不定数の値 5$data = ['data_int'=>1,'data_str'=>'a']; 6 7// $sqlに用いる値 8$format = my_get_format($data); // var_dump($format); => string(5) "%d,%s" 9$data_keys = rtrim(implode(",",array_keys($data))); 10$data_vals = rtrim(implode(",",$data)); 11 12// SQL文発行 13$sql = $wpdb->prepare("INSERT INTO wp_yasai_table ( $data_keys ) values ( $formats )", $data_vals ); 14var_dump($sql); // => string(0) "" 15 16// $dataから、$sqlに渡すデータ型を取得 17function my_get_format( $arr ){ 18 $format = []; 19 foreach ( $arr as $v ) { 20 $type = gettype( $v ); 21 if ( $type == 'string' ) { 22 $format[] = '%s'; 23 } elseif ( $type == 'integer' ) { 24 $format[] = '%d'; 25 } 26 } 27 return rtrim(implode(",",$format)); 28} 29
###試したこと
まず上のコードの確認ですが、var_dump($sql)
がstring(0) ""
となります。
PHP
1$sql = $wpdb->prepare("INSERT INTO wp_yasai_table ( $data_keys ) values ( $formats )", $data_vals ); 2var_dump($sql); // => string(0) ""
そしてprepare()
の第二引数$data_vals
を、$data[0]
と$data[1]
のように与えるとこうなりました。最後のvalues
がおかしいです。
php
1$sql = $wpdb->prepare("INSERT INTO wp_yasai_table ( $data_keys ) values ( $formats )", $data[0], $data[1] ); 2var_dump($sql); // => string(64) "INSERT INTO wp_yasai_table ( data_int,data_str ) values ( 0,'' )"
さらに$data_vals
を、変数$val1
と$val2
のように与えるとこうなりまして、無事正常な$sql
となりました。
php
1$val1 = 1; 2$val2 = 'a'; 3$sql = $wpdb->prepare("INSERT INTO wp_yasai_table ( $data_keys ) values ( $formats )", $val1, $val2 ); 4var_dump($sql); // => string(65) "INSERT INTO wp_yasai_table ( data_int,data_str ) values ( 1,'a' )"
###わかったこと
以上のことから、WordPressのprepare()
の第二引数は、変数を与えれば問題ないが、配列を与えると機能しないということがわかりました。
なので変数を与えれば済む話ですが、今回知りたいことは、$data
のような不定数な配列から$sql
を作ることにあります。変数がいくつになるか不定なので、$val1, $val2
のように変数を与えることができないのです。
どうすればprepare()
の第二引数に、不定数の値を与えることができるか…、宜しくお願い致します。
回答1件
あなたの回答
tips
プレビュー