mysql - 使用 wpdb 安全地准备 "where"收集 "join"子句数组

标签 mysql wordpress prepared-statement sql-injection

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

这是我的一些代码..是否足够安全,或者它可能会导致 SQL 注入(inject)?

附言我尝试在最后一个 get_row 函数中制作另一个 $wpdb->prepare 但是 join 函数在 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 );

最佳答案

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

$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 );

关于mysql - 使用 wpdb 安全地准备 "where"收集 "join"子句数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54382863/

相关文章:

Python 字典 : Creating a prepared statement

java - Oracle 在 Java 中的 RETURNING INTO 用法(JDBC,Prepared Statement)

java - 如何在 Hibernate 注解中创建 Tinyint Field

mysql - 给定表的棘手 SQL 查询

php - 查询 functions.php 中的函数?

javascript - 如何使用 jQuery 在页面加载时找到选定的单选按钮?

php - mysqli_fetch_assoc()需要参数/调用成员函数bind_param()错误。如何获取并修复实际的mysql错误?

php - 如何在没有任何Where条件的情况下在mysql中删除特定行

php - 从md5切换到password_hash

javascript - 仅当存在另一个类时才添加类