使用 wpdb prepare 安全地收集带有“join”的“where”子句数组

Posted

技术标签:

【中文标题】使用 wpdb prepare 安全地收集带有“join”的“where”子句数组【英文标题】:Collect "where" clause array with "join" using wpdb prepare safely 【发布时间】:2019-06-20 07:50:09 【问题描述】:

我需要确保一个大型 SQL 语句在其 WHERE 子句中有很多条件,所以我使用 $wpdb->prepare 为 WHERE 子句创建了一个数组,但是在最后将该数组作为字符串连接在一起时发生了错误声明。

这是我的一些代码.. 是否足够安全,否则可能会导致 SQL 注入?

附:我尝试在最后一个 get_row 函数中创建另一个 $wpdb->preparejoin 函数在 WHERE 子句之前和之后加上引号,因此语句产生错误。

foreach( $args as $field => $field_value ) 
    if( ! is_null( $field_value ) )             
        switch( $field ) 
            case 'id': 
                if( is_numeric( $field_value ) && ( intval( $field_value ) > 0 ) ) 
                    $where[] = $wpdb->prepare( 'tbl_names.id = %d', $field_value );
                
             break;                    
            case 'name': 
                $where[] = $wpdb->prepare( 'tbl_names.name = %s', $field_value );
             break;                  
        
    


// NOT Working
return $wpdb->get_row( $wpdb->prepare( "SELECT * FROM $tbl_names tbl_names WHERE %s", join( ' AND ', $where ) ), ARRAY_A );

// Working Good .. BUT Is it Safe??
return $wpdb->get_row( ( "SELECT * FROM $tbl_names tbl_names WHERE " . join( ' AND ', $where ) ), ARRAY_A );

【问题讨论】:

【参考方案1】:

不幸的是,我认为这将是一段时间内唯一的答案。

$count = 0;
$query = "SELECT * FROM $tbl_names tbl_names";

foreach( $args as $field => $field_value ) 
  if( ! is_null( $field_value ) ) 

    $count++;
    $query .= ( 1 == $count ) ? ' WHERE ' : ' AND ';

    switch( $field ) 
            case 'id': 
                $query .= $wpdb->prepare( 'tbl_names.id = %d', $field_value );
             break;                    
            case 'name': 
                $query .= $wpdb->prepare( 'tbl_names.name = %s', $field_value );
             break;                  
        
    


return $wpdb->get_row( $query, ARRAY_A );

【讨论】:

以上是关于使用 wpdb prepare 安全地收集带有“join”的“where”子句数组的主要内容,如果未能解决你的问题,请参考以下文章

wpdb::prepare() 错误缺少参数 2

如何将 prepare() 与动态列名一起使用?

Wordpress“prepare”函数用于插入数据库

wpdb 查询返回错误结果

Wordpress $wpdb 在外部 sql 数据库上准备

使用 PHI 信息进行 SQL 调用时,WordPress $wpdb 对象是不是安全?