如何在不使用$wpdb->Prepare的情况下正确清理字符串?

时间:2013-04-26 作者:coopersita

我正在进行高级搜索(使用自定义sql查询),查询字符串是使用变量形成的。例如,如果此人选中一些选项,则只有这些条件才会添加到WHERE子句中。

我不能使用$wpdb->prepare, 因为我希望能够向查询字符串中添加如下所示的变量:

$var = "AND pm.meta_value = \'%$_POST[\'val\']%\'"; 
我看着like_escape(), 但文件上说:

清理$字符串,以便在SQL查询的类似表达式中使用。Will still need to be SQL escaped (with one of the above functions).

逃离$val的合适方法是什么?

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

我无法使用$wpdb->prepare,因为我希望能够向查询字符串中添加如下所示的变量:

$var = "AND pm.meta_value = \'%$_POST[\'val\']%\'";
获取文字% 通过$wpdb->prepare 只要加倍。你不需要回避$wpdb->prepare.

概念验证:

var_dump($wpdb->prepare(\'SELECT * FROM {$wpdb->posts} WHERE post_title LIKE "%%%s%%"\',\'Hello\'));
下面的一条评论表明,可能需要一些更复杂的东西:

$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));
当然,在实践中,您可能会创建$var$var_data 在某种循环中,例如:

foreach ($_POST as $k=>$v) {
  if (\'abc\' == $k) {
    $var[] = \'post_title LIKE "%%%s%%"\';
    $var_data[] = $v; // should probably validate a bit
  } elseif(...) {
    // ...
  } else {
    // ...
  }
}
始终可以对每个项目运行prepare:

$var[] = $wpdb->prepare(\'post_title LIKE "%%%s%%"\',\'Hello\');
但我觉得使用数组的方法更加优雅,只会运行$wpdb->prepare 一次,为了它的价值。

SO网友:fuxia

使用mysqli_real_escape_string().

core仍使用弃用的mysql_real_escape_string()add_slashes() 在里面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 );
}
…但你不应该再使用它了。

结束

相关推荐

是否将默认WordPress格式添加到外部SQL表中的数据?

我有许多外部SQL表,它们以我想要的方式包含数据,我想使用它们用短代码填充各种wordpress帖子。问题是我不明白wordpress如何在get\\u content()中“过滤”文本,以便添加正确的和。IOW:我有一个合适的WP贴子,我会在一个页面上显示内容,它会自动神奇地包含标签。如果我将该文本复制到外部表中,然后使用$result = $wpdb->get_col( \"SELECT my_text FROM my_songs WHERE id = \'\" . $song_id . \"\