这真让我抓狂。我用代码生成的临时名称调试了一些代码,但它们毫无理由地疯狂地失败了。
在经历了很多痛苦和实验之后,我发现当超过某个密钥长度时,它会失败:
$key = \'1234567890\';
var_dump( get_transient($key) ); // works just fine
var_dump( set_transient( $key, $key, 10) ); // false when not expired
$key = \'1234567890123456789012345678901234567890123456\';
var_dump( get_transient($key) ); // always returns false
var_dump( set_transient( $key, $key, 10) ); // always true
显然option_name
数据库中的字段为varchar(64)
.然而,我绝对不明白为什么这不会产生任何数据库错误,以及设置瞬态工作的所有返回和挂钩都很好。。。但事实上,超时选项并没有被写入,而且都失败得很惨。
我怀疑这个问题add_option()
:
$result = $wpdb->query( $wpdb->prepare( "INSERT INTO `$wpdb->options` (`option_name`, `option_value`, `autoload`) VALUES (%s, %s, %s) ON DUPLICATE KEY UPDATE `option_name` = VALUES(`option_name`), `option_value` = VALUES(`option_value`), `autoload` = VALUES(`autoload`)", $option, $value, $autoload ) );
有人能帮我弄清楚当传递的选项名称太长时它应该怎么做,以及为什么它不会产生错误或任何东西吗?