Como limpar corretamente as strings sem $ wpdb-prepare?

2

Estou trabalhando em uma pesquisa avançada (que usa consultas sql personalizadas) e a string de consulta é formada usando variáveis. Por exemplo, se a pessoa verificar algumas opções, apenas essas condições serão adicionadas à cláusula WHERE.

Não consigo usar $wpdb->prepare , pois quero adicionar variáveis à minha string de consulta que se pareçam com:

$var = "AND pm.meta_value = '%$_POST['val']%'"; 

Eu olhei para like_escape() , mas a documentação diz:

  

Sanita $ string para uso em uma expressão LIKE de uma consulta SQL. Ainda precisará ser SQL com escape (com uma das funções acima) .

Qual seria uma maneira apropriada de escapar de $ val?

    
por coopersita 26.04.2013 / 18:13

2 respostas

6
  

Não consigo usar o $ wpdb- > prepare, já que quero poder adicionar variáveis   para minha string de consulta que se parece com:

$var = "AND pm.meta_value = '%$_POST['val']%'";

Para obter um literal % para passar por $wpdb->prepare , basta duplicá-lo. Você não precisa evitar $wpdb->prepare .

Prova de conceito:

var_dump($wpdb->prepare('SELECT * FROM {$wpdb->posts} WHERE post_title LIKE "%%%s%%"','Hello'));

Um comentário abaixo sugere que algo um pouco mais complicado pode estar em ordem:

$var[] = 'post_title LIKE "%%%s%%"';
$var_data[] = 'Hello';
$var[] = 'post_name LIKE "%%%s%%"';
$var_data[] = 'Hi';
$var[] = 'post_date LIKE "%%%s%%"';
$var_data[] = 'Howdy';
var_dump($wpdb->prepare('SELECT * FROM {$wpdb->posts} WHERE post_title '.implode(' AND ',$var),$var_data));

É claro que, na prática, você provavelmente criaria $var e $var_data em algum tipo de loop, como:

foreach ($_POST as $k=>$v) {
  if ('abc' == $k) {
    $var[] = 'post_title LIKE "%%%s%%"';
    $var_data[] = $v; // should probably validate a bit
  } elseif(...) {
    // ...
  } else {
    // ...
  }
}

Sempre é possível executar o preparo de cada item:

$var[] = $wpdb->prepare('post_title LIKE "%%%s%%"','Hello');

Mas o método que usa o array parece mais elegante e só executa $wpdb->prepare uma vez, pelo que vale a pena.

    
por s_ha_dum 26.04.2013 / 18:20
5

Use mysqli_real_escape_string() .

O núcleo ainda usa o mysql_real_escape_string() ou add_slashes() preterido em wpdb::_real_escape()

/**
 * Real escape, using mysql_real_escape_string() or addslashes()
 *
 * @see mysql_real_escape_string()
 * @see addslashes()
 * @since 2.8.0
 * @access private
 *
 * @param  string $string to escape
 * @return string escaped
 */
function _real_escape( $string ) {
    if ( $this->dbh && $this->real_escape )
        return mysql_real_escape_string( $string, $this->dbh );
    else
        return addslashes( $string );
}

... mas você não deveria mais usar isso.

    
por fuxia 26.04.2013 / 18:16