php - wpdb::prepare() 的查询参数必须有一个占位符

标签 php mysql wordpress

我正在尝试更新一些旧代码以在 Wordpress 插件中使用。

它正在做的是接受客户订单并检查他们之前是否已经购买过该 Woocommerce 产品。如果有,它将获得最后购买日期。它实际上工作正常,但查询已过时。我想更新它以使用 Wordpress 4.5。

我目前收到警告消息(3 次):

wpdb::prepare() 的查询参数必须有一个占位符

$orders = get_posts( array(
        'meta_key'    => '_customer_user',
            'meta_value'  => get_current_user_id(),
            'post_type'   => 'shop_order',
            'post_status' => array( 'wc-processing', 'wc-completed' )
    ) );

$orders_id=wp_list_pluck( $orders, 'ID' ); //List of all order IDs

$product_id = $post->ID; // Get current product ID

$order_list='('.join(',', $orders_id).')';

global $wpdb;

$query_select_order_items = "SELECT order_item_id as id FROM {$wpdb->prefix}woocommerce_order_items WHERE order_id IN {$order_list}";

$query_select_product_ids = "SELECT meta_value as product_id FROM {$wpdb->prefix}woocommerce_order_itemmeta WHERE meta_key=%s AND order_item_id IN ( $query_select_order_items )";

$query_single_order_ids = "SELECT order_item_id FROM {$wpdb->prefix}woocommerce_order_itemmeta WHERE meta_key=%s AND meta_value=$product_id";

$products = $wpdb->get_col( $wpdb->prepare ( $query_select_product_ids,'_product_id' ) );

$order_item_id = $wpdb->get_col( $wpdb->prepare ( $query_single_order_ids, '_product_id' ) );

$hg_abb_li1 = $wpdb->get_col( $wpdb->prepare ( $query_select_order_items, '_product_id' ) );

$hg_abb_list1 = '('.join(',', $hg_abb_li1).')';
$hg_abb_list2 = '('.join(',', $order_item_id).')';

$query_select_hgabb_items = "SELECT order_id FROM {$wpdb->prefix}woocommerce_order_items WHERE order_item_id IN {$hg_abb_list1} AND order_item_id IN {$hg_abb_list2}";
$hg_abb_orderid = $wpdb->get_col( $wpdb->prepare ( $query_select_hgabb_items, '_order_item_id' ) );

$hg_abb_dateorderid = end($hg_abb_orderid);

$query_select_hgabb_date = "SELECT post_date FROM {$wpdb->prefix}posts WHERE ID = {$hg_abb_dateorderid}";
$l_order_date=$wpdb->get_col( $wpdb->prepare ( $query_select_hgabb_date, '_order_date' ) );

$last_order_date = (($l_order_date[0]));

编辑:那么它应该是这样的吗?

$products = $wpdb->get_col( $wpdb->prepare ( "SELECT meta_value as product_id FROM ".$wpdb->prefix."woocommerce_order_itemmeta WHERE meta_key='_product_id' AND order_item_id IN ( SELECT order_item_id as id FROM ".$wpdb->prefix."woocommerce_order_items WHERE order_id IN (%s) )",$order_list ) );

$hg_abb_orderid = $wpdb->get_col( $wpdb->prepare ( 'SELECT order_id FROM '.$wpdb->prefix.'woocommerce_order_items WHERE order_item_id IN %s AND order_item_id IN %s', $hg_abb_list1, $hg_abb_list2 ) );

%s(字符串?)是否仍可用于数组,还是行不通?

最佳答案

当您使用$wpdb->prepare 时,您必须将变量传递给查询。例如

    $min_id = 5
    $status = 'active'
    $wpdb->prepare( 
"SELECT id FROM wp_posts WHERE id > %d AND `post_status` = %s", $min_id, $status 
)

关于php - wpdb::prepare() 的查询参数必须有一个占位符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37583916/

相关文章:

javascript - php jquery克隆输入字段插入到数据库的同一列中

php - PHP 中的 SQL 问题

php - Laravel 构建 Eloquent 查询以使用过滤器获取数据

mysql - 按与纬度和经度的接近程度对 WordPress 帖子进行排序

php - 使用 nginx 设置常量 SERVER_NAME

PHP:以 html 形式与 'selected values' 交互

mysql - 使用 MySQL 从字符串中分离电子邮件地址

php - 通过关系抓取数据。 1 个大查询或几个小查询

javascript - Div 不会关闭

css - 媒体查询不适用于 iPhone 6/6S