PHP -> SQL Query with Summing

时间:2018-08-15 作者:Parkbum

因此,我试图显示客户帐户的已付款交易总额:

SELECT SUM(`payment_amount`) 
FROM `wp_gf_entry` 
WHERE `created_by` = \'2\' 
AND `form_id` = \'37\' 
AND `payment_status` = \'Paid\' 
它在SQL中运行良好,但我在PHP中缺少了一些东西:

add_filter(\'gform_field_value_user_retainer\', \'gform_populate_user_retainer\');
function gform_populate_user_retainer($value){
$user = wp_get_current_user();
$user_id = $user->ID;
global $wpdb;
$result = $wpdb->get_results("SELECT SUM(payment_amount) as dviews FROM wp_gf_entry WHERE created_by = \'$user_id\' AND form_id = 37 AND payment_status = Paid");
  return $result->dviews;
}
帮助?

1 个回复
最合适的回答,由SO网友:David Sword 整理而成

看看这个,我看到“Paid”,一个字符串,不在引号中。这会导致错误。您可以添加$wpdb->show_errors() and $wpdb->print_error() methods 以及任何其他mysql问题。

在查询数据库时,还应使用$wpdb->prepare() 方法来转义和准备用于查询的变量(是$user->ID 可能无法妥协,但该查询中的未来值可能会被替换,或者该值是否在将来更改为$_REQUEST -- 逃避总是好的)。

我还使用$wpdb->get_var() 而不是$wpdb->get_results() 因为它给了你一个你所追求的单一价值,它会把事情清理干净一点。和使用$wpdb->prefix 而不是wp_ 如果发布此插件/主题,则使插件与其他安装更兼容。

add_filter(\'gform_field_value_user_retainer\', \'gform_populate_user_retainer\');
function gform_populate_user_retainer($value){
    global $wpdb;
    $user = wp_get_current_user();

    // turn on errors
    $wpdb->show_errors();

    // make the query
    $result = $wpdb->get_var( $wpdb->prepare(
        "
                SELECT SUM(`payment_amount`) as `dviews`
                FROM `{$wpdb->prefix}gf_entry` 
                WHERE `created_by` = %d
                AND `form_id` = 37 
                AND `payment_status` = \'Paid\'
        ", 
        $user->ID
    ) );

    // if there was a query error
    if ( $wpdb->last_error !== \'\' ) {
        return " Error: " . $wpdb->print_error();
    }

    return $result;
}
如果这不能完全解决您的问题:

如果你回来了"hello world"123 在里面gform_populate_user_retainer(), 值是否显示在您期望的位置?如果没有,就是gform_field_value_user_retainer 正确的挂钩?

如果你echo "<pre>".$wpdb->prepare("..."); die(); 使用字符串查询而不是运行它,并将其粘贴到MySQL中,是否有效?如果它没有遵循MySQL错误来解决。

如果你echo "<pre>"; print_r($result);die(); 这个$result 你看到了你期望返回的内容,而不是返回它吗?如果没有,请修改查询。

如果你echo "<pre>"; print_r($user);die(); 你看到你期望的了吗?为您自己和其他用户?无用户?

结束