$wpdb不喜欢存储数组

时间:2014-06-07 作者:Chris

我正在尝试使用示例数组下面的代码将一个类似于下面的数组的数组存储到数据库中的一个单元格中。不幸的是,WordPress似乎不想保存它,并不断抛出一个数据库错误(如底部的错误)。更改数组中数据的顺序会更改错误的位置,该位置与任何特定字符无关。

示例数组(实际数组略有不同):

$data = array();
$data[\'twitter\'] => array( \'key1\' => \'64 digit long string\', \'key2\' => \'63 digits\');
$data[\'facebook\'] => array( \'key1\' => \'64 digit long string\', \'key2\' => \'63 digits\');
应该注意的是,要插入的列被设置为varchar 1000(因此不是数据过长的问题)

样本插入代码:

$serialized_data = maybe_serialize($data);
$fire = $wpdb->query( $wpdb->prepare( "UPDATE $table_name SET oauth = %s WHERE email = %s",  $serialized_data, $email ) );
示例错误:(请注意,出于安全原因,实际有效负载已被替换,但演示数据在解剖学上是正确的。相同的格式,相同的字符类型。只是随机的)

WordPress database error: [You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near \'\'wp_custom_4\' WHERE email = \'[email protected]\' SET tasks = \'a:1:{s:7:\\"twitte\' at line 1]
UPDATE \'wp_custom_4\' WHERE email = \'[email protected]\' SET tasks = \'a:1:{s:7:\\"twitter\\";a:4:{s:11:\\"oauth_token\\";s:50:\\"128310837-uY4xWwegwegmwIUBxWWf7gilcqQWRGWRGWzeV3tU26N\\";s:18:\\"oauth_token_secret\\";s:45:\\"MPfJMJULgjD8JwoyAsZUEHRWRGPXMrqMgzBOyvVFPtm5s\\";s:7:\\"user_id\\";s:9:\\"1282424237\\";s:11:\\"screen_name\\";s:9:\\"sampleuser\\";}}\'
这也不是所采用的序列化方法的结果。我尝试使用serialize()、json\\u encode(),但也没有对其进行序列化

2 个回复
SO网友:Tom J Nowell

不要在数据库中存储序列化的PHP数据!这可能是一个重大的安全风险!

当值的内容被反序列化时,将重新创建任何对象,并运行其构造函数和唤醒方法,这可用于发起攻击。

此外,该数据不能被搜索替换,因为PHP序列化字符串包含的数据长度值不会更改,如果修改,则在反序列化时会产生致命错误

因此,取而代之的是:

考虑使用JSON,将单独的值存储为单独的值、多行、单独的列等

SO网友:Chris

出于某种原因,使用准备好的查询不喜欢的数据似乎可以做到这一点:

$wpdb->update( 
    $table_name, 
    array( 
        \'oauth\' =>  $serialized_data,
    ), 
    array( \'email\' => $email ), 
    array( 
        \'%s\',
    ), 
    array( \'%s\' ) 
);

结束

相关推荐

如何使用带有wpdb UPDATE方法的MySQL IN语句?

我正在使用wpdb更新方法,希望更新在多个id中找不到id的记录。所以如果我想更新每个记录的id为1 例如,我会这样做:$wpdb->update( \'wp_my_tables\', array( \'active\' => 0 ), array( \'id\' => 1 ),