如何防止$wpdb->准备剥离变量值中的前导零?

时间:2015-11-22 作者:alex

我有一个简单的database_read 函数和每个意外事件,我注意到order\\u 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 个回复
最合适的回答,由SO网友:s_ha_dum 整理而成

尝试以下操作:

$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. This is because a leading zero in PHP indicates an octal number. 确切地说,你的零号没有被剥夺。它正在转换为十进制。

实际上,您传递的是一个八进制数,或者您在某处将一个前导为零的字符串转换为整数。我不能确切地说出发生在哪里,但你需要防止它。

真的不是prepare 就是这样。它更像PHP核心。