在一个查询中更新多行

时间:2016-10-24 作者:wassereimer

我想使用wpdb->update在一个查询中更新多行。我在debug.log 但仅更新最后一行。

$my_update = $wpdb->update( $wpdb->prefix . \'my_settings\',
            array( \'value\' => $tmp_mail_smtp,
                   \'value\' => $tmp_mail_smtp_host,
                   \'value\' => $tmp_mail_smtp_auth ),
            array( \'name\' => \'mail-smtp\',
                   \'name\' => \'mail-smtp-host\',
                   \'name\' => \'mail-smtp-auth\' ) );
表格结构为(eg):

id - name - value
1 - mail-smtp - yes
2 - mail-smtp-host - smtp.domain.tld
3 - mail-smtp-auth - yes
我想更新valuename. 我做错什么了吗?

Update:

具有$wpdb->last_query; 我明白了UPDATE settings SET value = 0 WHERE name = mail-smtp-auth 他似乎连另一个都认不出来。$wpdb->last_result$wpdb->last_error 都是空的。

2 个回复
最合适的回答,由SO网友:wassereimer 整理而成

过去几天我在google上搜索了很多次,有几次我看到一些帖子说$wpdb->update 函数不支持多个更新,并且没有很好的文档记录。->对不起,我没有链接了。。。

我认为这是真的,因为我无法让它工作,我发现没有一个女巫是这样工作的。所以我现在使用这种方法来更新多行,并且仍然能够处理错误。

功能:

function update_queries( $queries ) {
    global $wpdb;

    // set array
    $error = array();

    // run update commands
    foreach( $queries as $query ) {
        $query = str_replace( \'[wp-prefix]\', $wpdb->prefix, $query );
        $last_error = $wpdb->last_error;
        $wpdb->query( $query );

        // fill array when we have an error
        if( (empty( $wpdb->result ) || !$wpdb->result ) && !empty( $wpdb->last_error ) && $last_error != $wpdb->last_error ) {
                $error[]= $wpdb->last_error." ($query)";
        }
    }

    // when we have an error
    if( $error ) {
        return $error;

    // when everything is fine
    }else{
        return false;
    }
}
如果我们想更新一些内容:

// update database
$queries = array();
$queries[] = "UPDATE `[wp-prefix]table` SET `value` = \'$value\'  WHERE `name` = \'name\';";
$queries[] = "UPDATE `[wp-prefix]table` SET `value` = \'$value2\'  WHERE `name` = \'name2\';";
$error = update_queries( $queries );

// if we have an error
if( !empty( $error ) ) {
    .....

// when everything is fine
}else{
    .....
}

SO网友:cowgill

您的语法看起来不错。我猜你的前两个变量是空的。

尝试对值进行硬编码,以查看这些值是否保存。

$tmp_mail_smtp      = \'Test Mail SMTP\';
$tmp_mail_smtp_host = \'Test Mail SMTP Host\';
$tmp_mail_smtp_auth = \'Test Mail SMTP Auth\';

$my_update = $wpdb->update( $wpdb->prefix . \'my_settings\',
    array( \'value\' => $tmp_mail_smtp,
           \'value\' => $tmp_mail_smtp_host,
           \'value\' => $tmp_mail_smtp_auth,
    ),
    array( \'name\' => \'mail-smtp\',
           \'name\' => \'mail-smtp-host\',
           \'name\' => \'mail-smtp-auth\',
    )
);

Update #1

由于上述方法不适用于您,请删除$wpdb->update 分别编写代码并尝试更新每个选项,看看是否有效。

if ( $settings_message == \'0\' ) {
  update_option( \'role\', $tmp_role );
  update_option( \'mail-smtp\', $tmp_mail_smtp );
  update_option( \'mail-smtp-host\', $tmp_mail_smtp_host );
  update_option( \'mail-smtp-auth\', $tmp_mail_smtp_auth );
}
另外,由于这是一个wp管理页面,我会阅读更多关于Settings API 它提供了一种更结构化的方式来添加/管理选项页面。

相关推荐

$wpdb->get_row返回什么?

由于插件中的调试和错误查找,我有一个简短的问题。$wpdb->;如果没有结果,返回get\\u row()?文件说明:(array|object|null|void) Database query result in format specified by $output or null on failure. 但当查看源代码时,它似乎返回了;null“;。。。如果您能快速提供帮助,我将不胜感激,我一直认为它会返回一个空数组,但我可能弄错了!