Wpdb准备:将可变数量的字段作为第二个参数传递

时间:2014-03-13 作者:Mariano

由于我想管理数据库中的空字段,wordpress函数不允许这样做,因此我需要根据情况动态生成查询。问题是我不知道如何传递可变数量的字段作为第二个参数!这就是我所做的tr,但它返回一个“空查询”错误:

if ($a == \'\') {
    $fields = \'b, c\';
    $placeholders = "\'%s\', \'%s\'";
    $vars = $b . \', \' . c;
} else {
    $fields = \'a, b, c\';
    $placeholders = "\'%s\', \'%s\', \'%s\'";
    $vars = $a . \', \' .$b . \', \' . c;
}
global $wpdb;
$wpdb->show_errors();
$query = \'INSERT INTO table (\' . $fields . \') VALUES (\' . $placeholders . \')\';
$wpdb->query($wpdb->prepare($query, $vars));
有没有办法做到这一点(甚至使用$wpdb->insert)?

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

您必须为$vars, 所以更换

$vars = $a . \', \' .$b . \', \' . c;
使用

$vars = array( $a, $b, $c );
但我建议您使用$wpdb->insert( $table, $data, $format ) 方法那么您的代码示例可以如下所示:

$data   = array( \'a\' => $a, \'b\' => $b, \'c\' => $c );
$format = array( \'%s\', \'%s\', \'%s\' );

if( empty( $a ) )
{
    $data   = array_slice( $data,   1, 2 );
    $format = array_slice( $format, 1, 2 ); 
} 

$wpdb->insert( $table, $data, $format );

SO网友:s_ha_dum

您正在尝试(几乎)构造整个查询,然后将其传递给prepare. 这是不对的。

  1. prepare 更像sprintf.或vsprintf $s. 那行不通prepare 可以是一个数组,这就是我在这里要使用的
试试这个:

$a = $b = $c = "abc";
if ($a == \'\') {
    $fields = \'b, c\';
    $placeholders = "\'%s\', \'%s\'";
    $vars = $b . \', \' . c;
} else {
    $fields = \'a, b, c\';
    $placeholders = "%s, %s, %s";
    $vars = array($a,$b,$c);
}
$query = \'INSERT INTO table (\' . $fields . \') VALUES (\' . $placeholders . \')\';
var_dump($query);
var_dump($wpdb->prepare($query, $vars));

结束

相关推荐

为什么$wpdb返回MySQL整数值的字符串?

我发现Wordpress db接口的默认行为是转换所有整数(和float?)类型转换为字符串。e、 g级$wp_posts = $wpdb->get_results(\'SELECT * from wp_posts\'); $unexpected_type = gettype($wp_posts[0]->ID) == \'string\'; 请确认我的怀疑,这样做是为了支持PHP不支持的非常大(容量巨大)的整数类型,或者提供另一种解释,解释为什么会选择将整数转换为字符串。我