无法使用DBDelta()设置默认的序列化数组

时间:2015-09-29 作者:Jorge Rivera

我正试图与dbDelta() 其中一列的默认值是一个带有预定义值的序列化数组。这里的问题是dbDelta() 使用分号分解查询以分隔查询。是否有任何解决方法?我用于上述列的字符集是utf8_bin.

$sql ="CREATE TABLE my_table_name (
    Id bigint(20) unsigned NOT NULL AUTO_INCREMENT,
    serialized_data varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL DEFAULT \'a:7:{i:0;b:1;i:1;b:1;i:2;b:1;i:3;b:1;i:4;b:1;i:5;b:1;i:6;b:1;}\',
    PRIMARY KEY  (Id)  );"

dbDelta($sql);
我已经试过使用\\x3B 而不是字符本身,但它在分解之前仍被解析为分号,因此无法工作。

1 个回复
SO网友:Mark

你是对的,这个问题是分号爆炸的结果。我们可以使用dbdelta_queries 过滤以修复它。

在这个解决方案中,我们假设所有查询都以CREATE、INSERT或UPDATE开头。如果您在dbDelta中运行查询,而实际情况并非如此,那么preg_match 线路需要调整,否则不能正常工作。

add_filter( \'dbdelta_queries\', \'my_dbDelta_queries\' );

function my_dbDelta_queries( $queries ) {

    $toJoin = array();
    $start  = array();
    $count  = 0;
        foreach( $queries as $i => $query ) :
                if ( !preg_match( "/CREATE|INSERT|UPDATE( [^ ]*)/", $query ) ) :
                        if( !empty( $start ) ) :
                            $toJoin[$count] = array( $start[key( $start )] );
                            unset( $queries[key( $start )] );
                        endif;
                    $toJoin[$count][] = $query;
                    unset( $queries[$i] );
                    $start = array();
                else :
                    $start = array( $i => $query );
                    $count++;
                endif;
        endforeach;

        if( !empty( $toJoin ) ) :
                foreach( $toJoin as $join ) :
                    $queries[] = implode( \';\', $join );
                endforeach;
        endif;
    return $queries;

}

相关推荐

将MySQL转换为WordPress$WPDB

我正在从3.7升级一个古老的Wordpress网站。它有一些SQL查询请求,在3.9以上版本之后无法运行,您现在必须通过$WPDB连接到DB(https://codex.wordpress.org/Class_Reference/wpdb). 我对此进行了初步尝试,但挂断了mysql\\u fetch\\u array部分的连接,也不清楚我所做的是否正确。mysql\\u fetch\\u数组似乎需要使用get\\u结果(https://developer.wordpress.org/reference/