私は単純なdatabase_read
関数を持っていますが、偶然にも、order_idが先行ゼロで始まっていても期待した結果が得られないことに気付きました。
$wpdb->prepare
を使うことで先行ゼロを取り除きます。どうすればこれを防ぎ、それでもprepare
メソッドを使用できますか?
これが関数です:
function database_read($order_id)
{
// $order_id = intval($order_id);//this will also strip leading zero
// echo $order_id;
// exit();
global $wpdb;
// This doesn't work:
// $sql = $wpdb->prepare("SELECT payStatus FROM test_table WHERE ref = %s",$order_id);
// This works:
$sql = "SELECT payStatus FROM test_table WHERE ref = {$order_id}";
$res = $wpdb->get_results($sql, ARRAY_A);
return $res;
}
これを試して:
$order_id = 012345;
$sql = $wpdb->prepare("SELECT payStatus FROM test_table WHERE ref = %s",$order_id);//<-- this doesn't work
var_dump($sql);
echo '<br/>';
$sql = $wpdb->prepare("SELECT payStatus FROM test_table WHERE ref = %d",$order_id);//<-- this doesn't work
var_dump($sql);
echo '<br/>';
$sql = $wpdb->prepare("SELECT payStatus FROM test_table WHERE ref = %f",$order_id);//<-- this doesn't work
var_dump($sql);
echo '<br/>';
$sql = $wpdb->prepare("SELECT payStatus FROM test_table WHERE ref = %s",(string)$order_id);//<-- this doesn't work
var_dump($sql);
echo '<br/>';
$order_id = '012345';
$sql = $wpdb->prepare("SELECT payStatus FROM test_table WHERE ref = %s",$order_id);//<-- this doesn't work
var_dump($sql);
echo '<br/>';
最後のものを除いて、すべてが5349
に変換されることがわかります。 これはPHPの先頭のゼロが8進数を表すからです。 あなたのゼロは正確に取り除かれていません。それは10進数に変換されています。
実際には、8進数を渡しているか、先行ゼロを含む文字列をどこかに整数に変換しています。それがどこで起こるのか正確にはわかりませんが、それを防ぐ必要があります。
実際、これを行っているのはprepare
ではありません。もっとPHPコアです。