web-dev-qa-db-ja.com

$ wpdb-> prepareが変数値の先頭のゼロを削除するのを防ぐにはどうすればいいですか?

私は単純な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;
}
1
alex

これを試して:

$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コアです。

3
s_ha_dum