Вопрос или проблема
Я хотел бы получить список 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 'Введите имя пользователя для поиска.';
}
Пояснение:
-
Проверка на пустоту: Мы проверяем, установлена ли переменная
$_POST['name']
и не пуста ли она. Также используемtrim()
для удаления лишних пробелов. -
Экранирование и обработка: После получения значения мы экранируем его с помощью
$wpdb->esc_like()
, добавляя%
лишь в конце, чтобы получить результаты, начинающиеся с указанного имени. -
SQL Запрос: SQL-запрос формируется с использованием подготовленного выражения, что предотвращает SQL-инъекции.
-
Обработка результатов: Результаты выводятся если они найдены, и обработка возможных пустых результатов происходит через вывод соответствующего сообщения.
-
Отладочная информация: Если переменная пустая, выводится сообщение, чтобы пользователь знал, что ввел неправильные данные.
Этот подход является более безопасным и эффективным, и улучшает работу с базой данных.