wordpress prepare error

时间:2021-03-03 作者:Andreea Onica

这是我的代码:

$terms = wp_get_post_terms( $listing_id,\'job_listing_category\' );    
     if(!empty($terms)){
         $sql_terms.=" AND (";
         foreach($terms as $term){       
         $sql_terms.="  category LIKE \'%".$term->slug."%\' OR";
         }
          $sql_terms.="  category IS NULL OR category=\'\'";
        $sql_terms.=") ";
     }
$wpdb->get_results( 
                    $wpdb->prepare(     
                "SELECT DISTINCT user_id ,proximity,
                ( %s * IFNULL( acos( cos( radians(lat) ) * cos( radians( %s ) ) * cos( radians( %s ) - radians(lng) ) + sin( radians(lat) ) * sin( radians( %s ) ) ), 0 ) )
                AS distance
                FROM  ".$wpdb->prefix."a_filters  as f
                WHERE
                f.notify=1   AND lat!=\'false\' AND lng!=\'false\' AND listing_type=\'".$listing_type."\' 
                
                ".($sql_terms?$sql_terms:"")."
                
                 HAVING distance < proximity
                        
                ORDER BY distance ASC"
                ,  $earth_radius, $lat, $lng, $lat) 
                );
其中一个$术语是“QUOTE”;“专用”;。

我得到错误wpdb::prepare调用不正确。查询中包含的占位符数量(5)与传递的参数数量(4)不匹配。这是因为它还统计了来自\'%special-purpose%\'的%s。如何使其忽略\'%special-purpose%\'中的%s?

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

使用双百分比符号,如下所示:%%special-purpose%%.

或者您也可以使用占位符,即。LIKE %s 然后设置第6个参数$wpdb->prepare()%special-purpose%, i、 e。

$wpdb->prepare( "your SQL query", $earth_radius, $lat, $lng, $lat, \'%special-purpose%\' )

SO网友:Jacob Peattie

这包括在the documentation:

查询字符串中的文字百分号(%)必须写为%%。百分比通配符(例如,在LIKE语法中使用)必须通过包含完整LIKEstring的替换参数传递,不能直接插入查询字符串中。

以及一个示例:

$wpdb->prepare( "SELECT * FROM table WHERE column = %s AND field = %d OR other_field LIKE %s", array( ‘foo’, 1337, ‘%bar’ ) ); 
所以你应该有这样的东西:

$wpdb->prepare(     
    "SELECT DISTINCT 
        user_id,
        proximity,
        (
            3959 * acos (
                cos( radians( 78.3232 ) )
                * cos( radians( %f ) )
                * cos( radians( %f ) - radians( 65.3234 ) )
                + sin( radians( 78.3232 ) )
                * sin( radians( %f ) )
            )
        ) AS distance
    FROM
        {$wpdb->prefix}a_filters
    WHERE
        notify = 1 AND
        lat != \'false\' AND 
        lng != \'false\' AND 
        listing_type = %s AND
        ( 
            category LIKE %s OR 
            category IS NULL OR 
            category = \'\'
        )
    HAVING
        distance < proximity    
    ORDER BY 
        distance ASC",
    $lat, 
    $lng,
    $lng,
    $listing_type,
    \'%special-purpose%\'
);
注:

  • category LIKE \'%special-purpose%\' 已替换为category LIKE %s, 带通配符的字符串作为参数传递
  • listing_type=\'".$listing_type."\' 已替换为占位符的正确用法

相关推荐

我可以将参数传递给Add_ShortCode()函数吗?

正如标题所述,我需要向add_shortcode() 作用换句话说,我传递的那些参数将在的回调函数中使用add_shortcode(). 我该怎么做?请注意,这些与以下结构无关[shortcode 1 2 3] 哪里1, 2, 和3 是用户传递的参数。在我的情况下,参数仅用于编程目的,不应由用户负责。谢谢