Оператор SQL в Wordpress

Я пытаюсь запустить оператор SQL на странице Wordpress. Я уже проверил это в phpmyadmin, и это работает:

SELECT post_id FROM wp_postmeta WHERE meta_value = "9bf2c7f9760393fa83e65ad455e00243"

Результатом этого является post_id 20

Это мой код в шаблоне Wordpress:

<?php
    global $wpdb;
    $uniqueId = $_GET['id'];

    $getPostId = $wpdb->get_var(
        $wpdb->prepare("SELECT post_id FROM " . $wpdb->prefix . "wp_postmeta WHERE meta_value = %d", $uniqueId)
    );
    

    echo $getPostId;
?>

Он должен отображать значение 20, но ничего не делает. Я также проверил, установлена ​​ли переменная $uniqueId, и это так.


person Dennis    schedule 06.11.2020    source источник


Ответы (2)


Есть две проблемы с вашим кодом.

1. В вашем запросе опечатка:

"SELECT post_id FROM " . $wpdb->prefix . "wp_postmeta WHERE meta_value = %d"

Должно быть:

"SELECT post_id FROM " . $wpdb->prefix . "postmeta WHERE meta_value = %d"

Вы повторяете префикс wp_ дважды:

... $wpdb->prefix . "wp_postmeta WHERE ...

2. Как указал Майк, %d ожидает целое число. Ваш код предполагает, что это должна быть строка, поэтому вместо этого вы должны использовать %s:

$getPostId = $wpdb->get_var(
    $wpdb->prepare(
        "SELECT post_id FROM " . $wpdb->prefix . "postmeta WHERE meta_value = %s",
        $uniqueId
    )
);

Обновленный код:

<?php
global $wpdb;
$uniqueId = $_GET['id'];

$getPostId = $wpdb->get_var(
    $wpdb->prepare(
        "SELECT post_id FROM " . $wpdb->prefix . "postmeta WHERE meta_value = %s",
        $uniqueId
    )
);

echo $getPostId;
?>
person cabrerahector    schedule 06.11.2020
comment
Большое спасибо, это работает! Глупая ошибка с моей стороны. - person Dennis; 06.11.2020
comment
Не беспокойтесь об этом. Даже самый опытный разработчик делает ошибки каждый божий день :P Удачного кодирования! - person cabrerahector; 06.11.2020

Заполнитель %d в операторе подготовки ожидает целое число. Но вы назначаете строку. Поэтому в этом случае вы должны использовать заполнитель строки, который является %s.

Новый код:

<?php
    global $wpdb;
    $uniqueId = $_GET['id'];

    $getPostId = $wpdb->get_var(
        $wpdb->prepare("SELECT post_id FROM " . $wpdb->prefix . "wp_postmeta WHERE meta_value = %s", $uniqueId)
    );
    

    echo $getPostId;
?>
person Mike    schedule 06.11.2020
comment
Спасибо за ответ, но результата пока нет. - person Dennis; 06.11.2020
comment
Пробовали с get_row? А затем эхо $getPostId-›post_id - person Mike; 06.11.2020