Confused by $wpdb->prepare

时间:2014-01-10 作者:fightstarr20

我试图使用$wpdb->准备抵御SQL注入攻击,但我丢失了。下面有一段代码,它检查h\\U transactions表中的事务id。如果找不到id,则会将其添加到表中。。。

<?
global $wpdb;
$table_name = $wpdb->prefix . "h_transactions";
$registered = $wpdb->get_var( "SELECT COUNT(*) FROM $table_name WHERE transactionid = \'{$transactionid}\'" );

if ($registered == 0) {
  $wpdb->insert( $table_name, array( \'transactionid\' => $transactionid ), array(\'%s\')  );
}
else
?>
我是否需要在SQL查询和SQL插入上使用$wpdb->prepare?

1 个回复
SO网友:kaiser

第一prepare() 允许您指定两种不同类型的数据:

  • %s 对于字符串类型%d 对于整数/数字类型,原因很简单:MySQL只知道两种(半)数据类型:字符串和数字(以及日期/时间)。

    因此,通过这种方式,您可以指定它是什么类型,并确保只有该类型才能通过。

    不过,通过正确清理输入,消除数据中可能存在的恶意部分仍然很重要:esc_*() functions.

    以下是您的示例:

    global $wpdb;
    
    // The actual statement - in a readable way
    $SQL = <<<SQL
        SELECT COUNT(*)
        FROM {$wpdb->prefix}h_transactions
        WHERE transactionid = %d
    SQL;
    
    $preparedSQL = $wpdb->prepare( $SQL, esc_attr( $_POST[\'transactionID\'] ) );
    // Let\'s run it
    $registered = $wpdb->get_var( $preparedSQL );
    
    注意:一定要用真名。为了便于阅读,我改了一些

结束

相关推荐

修复wpdb::Prepare的插件

以前的一位开发人员为我管理的网站创建了一个插件,除了我得到错误“缺少wpdb::prepare()的参数2”之外,一切似乎都正常。我理解需要添加参数,但我不清楚如何将它们添加到这个特定代码中,或者在这种情况下添加什么参数。代码如下所示。任何指点都会很神奇。错误出现在第四个结束的花括号之后,在“$judgets=”之前。看起来查询现在应该是$wpdb->prepare,但在这个例子中,我不清楚如何在代码中实现它。更新时间:抱歉,我是个大傻瓜。下面的代码是插件的真实代码。我之前看过错误的代码行。$cat