Запрос wpdb LIKE показывает все данные базы данных

Вопрос или проблема

Я хотел бы получить список user_nicenames и их ID. Но не все имена пользователей, что я получаю сейчас. Я понимаю, что должен использовать % до и после $name, но ничего, похоже, не работает. Это единственный способ получения какого-либо вывода, который я нашел до сих пор;

global $wpdb; //получить доступ к объекту базы данных WordPress

//получить имена всех пользователей
$name = $wpdb->esc_like(stripslashes($_POST['name'])).'%'; //экранирование для использования в операторе LIKE
$sql = "SELECT user_nicename, ID
FROM $wpdb->users
WHERE user_nicename LIKE %s
";

$sql = $wpdb->prepare($sql, $name);

$results = $wpdb->get_results($sql);

Как мне ограничить вывод только именами пользователей, начинающимися с, то есть $_POST['name'] .'%' в обычном PHP коде.

Можете ли вы проверить, что $_POST[‘name’] получает значение? Я предлагаю вывести его на страницу для отладки (возможно, в комментариях, если сайт в прямом эфире). Если $_POST[‘name’] пустое, то будут возвращены все результаты, потому что запрос будет говорить user_nicename LIKE '%'

На всякий случай, вам следует сделать условную проверку, чтобы увидеть, установлено ли $_POST[‘name’] и не пусто (если вы никогда не хотите, чтобы возвращались все результаты). Если пустое или нулевое, то добавьте дополнительный код соответственно, например, чтобы отобразить сообщение о том, что результатов не найдено и т. д., в зависимости от того, как вы хотите, чтобы ваше приложение работало.

Я предлагаю разделить ваше выражение, чтобы сделать проверку.. то есть:

$name="";

if(isset($_POST['name'])){

  $name = stripslashes($_POST['name']);

}

echo '<!-- name: '.$name.' -->';

if($name==null || $name==''){ 

  //TODO: как вернуть;

}else {

  $name = $wpdb->esc_like($name).'%';

  ....
}

Ваш запрос правильный, параметр like будет

global $wpdb; //получить доступ к объекту базы данных WordPress

//получить имена всех пользователей
$name = $wpdb->esc_like(stripslashes($_POST['name']))."%";
$sql = "SELECT user_nicename, ID
FROM $wpdb->users
WHERE user_nicename LIKE %s
";

$sql = $wpdb->prepare($sql, $name);

$results = $wpdb->get_results($sql);

Ответ или решение

Конечно! Давайте разберемся с вашим запросом и исправим его так, чтобы он корректно фильтровал пользователей по user_nicename, начинающимся с поступившего значения из $_POST['name'].

Как вы правильно отметили, использование оператора LIKE в SQL-запросе может привести к тому, что будут возвращены все записи, если условие будет неправильно сформировано. Чтобы избежать этой проблемы, необходимо убедиться, что переменная $_POST['name'] содержит значение. Если переменная пустая, то запрос вернёт все данные, так как это будет эквивалентно LIKE '%'.

Вот как можно улучшить ваш код:

global $wpdb; // Получаем доступ к объекту базы данных WordPress

// Инициализируем переменную для имени
$name = "";

// Проверяем, установлена ли переменная и не пуста ли она
if (isset($_POST['name']) && !empty(trim($_POST['name']))) {
    $name = stripslashes($_POST['name']);

    // Экранируем символы для использования в операторе LIKE и добавляем символ подчеркивания
    $name = $wpdb->esc_like($name) . '%';

    // Формируем SQL запрос
    $sql = "SELECT user_nicename, ID FROM $wpdb->users WHERE user_nicename LIKE %s";
    $sql = $wpdb->prepare($sql, $name);

    // Выполняем запрос и получаем результаты
    $results = $wpdb->get_results($sql);

    // Проверяем, есть ли результаты
    if (!empty($results)) {
        // Обработка результатов
        foreach ($results as $user) {
            echo 'Username: ' . esc_html($user->user_nicename) . ' - ID: ' . intval($user->ID) . '<br>';
        }
    } else {
        echo 'Пользователи не найдены.';
    }
} else {
    echo '<!-- name: ' . esc_html($name) . ' -->'; // Для отладки
    echo 'Введите имя пользователя для поиска.';
}

Пояснение:

  1. Проверка на пустоту: Мы проверяем, установлена ли переменная $_POST['name'] и не пуста ли она. Также используем trim() для удаления лишних пробелов.

  2. Экранирование и обработка: После получения значения мы экранируем его с помощью $wpdb->esc_like(), добавляя % лишь в конце, чтобы получить результаты, начинающиеся с указанного имени.

  3. SQL Запрос: SQL-запрос формируется с использованием подготовленного выражения, что предотвращает SQL-инъекции.

  4. Обработка результатов: Результаты выводятся если они найдены, и обработка возможных пустых результатов происходит через вывод соответствующего сообщения.

  5. Отладочная информация: Если переменная пустая, выводится сообщение, чтобы пользователь знал, что ввел неправильные данные.

Этот подход является более безопасным и эффективным, и улучшает работу с базой данных.

Оцените материал
Добавить комментарий

Капча загружается...