$wpdb->get_results() в foreach() всегда возвращает слово “Array” в начале списка. Как от этого избавиться?

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

Я извлекаю содержимое полей из простой таблицы в WordPress. Таблица содержит поля, как на скриншоте ниже, и мне нужно извлечь все значения из rul_value для строки, в которой поле rul_type равно “role”

введите описание изображения здесь

Итак, я сделал этот запрос

$rows = $wpdb->get_results($wpdb->prepare("SELECT `rul_value` FROM " . _ROLES_  . " WHERE `rul_type` = %s AND `rul_value` LIKE %s", 'role', '%intera%'));
foreach($rows as $row) {
        $singleParts .= $row->rul_value . "\n";
}

но когда я выводил его с помощью

echo $singleParts;

или с помощью

print_r($singleParts);

я получаю список, но первое слово – “Array”. Всегда. На самом деле это не массив … просто это слово появляется. Что очень раздражает

введите описание изображения здесь

Вот вывод с var_dump($singleParts)

введите описание изображения здесь

Как я могу от этого избавиться? У меня нет понятия, почему это происходит. Где я ошибаюсь?

Я не уверен, почему у вас возникают ошибки, но я могу показать вам, как защитно их находить и реагировать на них.

Это ваш код

$rows = $wpdb->get_results($wpdb->prepare("SELECT `rul_value` FROM " . _ROLES_  . " WHERE `rul_type` = %s AND `rul_value` LIKE %s", 'role', '%intera%'));
foreach($rows as $row) {
    $singleParts .= $row->rul_value . "\n";
}

Давайте внесем несколько изменений.

Есть ли данные внутри $singleParts уже? Если нет, мы можем заставить его быть пустой переменной с помощью $singleParts="";.

Вот так:

$rows = $wpdb->get_results($wpdb->prepare("SELECT `rul_value` FROM " . _ROLES_  . " WHERE `rul_type` = %s AND `rul_value` LIKE %s", 'role', '%intera%'));
$singleParts="";
foreach($rows as $row) {
    $singleParts .= $row->rul_value . "\n";
}

Теперь мы можем исключить это из списка проблем. Далее, вам следует проверить наличие ошибки. (Смотрите этот ответ)

if($wpdb->last_error !== ''){
    echo 'Упс, что-то пошло не так: ';

    $str   = htmlspecialchars( $wpdb->last_result, ENT_QUOTES );
    $query = htmlspecialchars( $wpdb->last_query, ENT_QUOTES );

    print "<div id='error'>
    <p class="wpdberror"><strong>Ошибка базы данных WordPress:</strong> [$str]<br />
    <code>$query</code></p>
    </div>";
}else{
    # ваш код
}

Наконец, мы можем проверить данные, которые вы получили. Мы ожидаем строку, поэтому мы должны убедиться, что получили строку:

if(is_string($row->rul_value)){
    # ваш код
}else{
    echo "Я этого не ожидал. Мы получили: <pre>";
    print_r($row->rul_value);
    echo "</pre>";
}

Собирая все вместе, у нас есть:

$rows = $wpdb->get_results($wpdb->prepare("SELECT `rul_value` FROM " . _ROLES_  . " WHERE `rul_type` = %s AND `rul_value` LIKE %s", 'role', '%intera%'));
$singleParts="";
if($wpdb->last_error !== ''){
    echo 'Упс, что-то пошло не так: ';

    $str   = htmlspecialchars( $wpdb->last_result, ENT_QUOTES );
    $query = htmlspecialchars( $wpdb->last_query, ENT_QUOTES );

    print "<div id='error'>
    <p class="wpdberror"><strong>Ошибка базы данных WordPress:</strong> [$str]<br />
    <code>$query</code></p>
    </div>";
}else{
    # нет ошибки wpdb
    foreach($rows as $row) {
        if(is_string($row->rul_value)){
            # это строка, которую мы искали
            $singleParts .= $row->rul_value . "\n";
        }else{
            # не строка - что мы получили?
            echo "Я этого не ожидал. Мы получили: <pre>";
            print_r($row->rul_value);
            echo "</pre>";
        }   
    }
}

Просто выводить потенциально чувствительные данные не лучшая идея в продакшене, но для вашей разработки это поможет вам найти, откуда появляются ошибки. Я рекомендую всегда предполагать, что ваши данные повреждены, и проверять их перед тем, как что-то с ними делать. Код глуп, и он будет делать именно то, что ему сказали, независимо от наших намерений.

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

Ваш вопрос о том, почему в начале вывода результатов из $wpdb->get_results() появляется слово "Array", кажется, связан с тем, как вы объединяете значения. Давайте попробуем разобраться и упростить код, чтобы решить проблему.

Во-первых, давайте убедимся, что переменная $singleParts инициализирована как пустая строка в начале вашего кода. Это необходимо для того, чтобы исключить возможные сбои из-за наличия в ней случайного значения.

Во-вторых, вы столкнулись с проблемой, когда результатом оказывается "Array". Причина этого может заключаться в ошибочном выводе. Убедимся, что вы выводите именно строковые значения, а не массивы.

Вот предложенный вами код с необходимыми изменениями и проверками:

// Выполнение запроса к базе данных
$rows = $wpdb->get_results($wpdb->prepare("SELECT `rul_value` FROM " . _ROLES_ . " WHERE `rul_type` = %s AND `rul_value` LIKE %s", 'role', '%intera%'));

// Инициализация переменной для хранения результатов
$singleParts = "";

// Проверка на наличие ошибок в запросе
if ($wpdb->last_error !== '') {
    echo 'Произошла ошибка: ';
    $str   = htmlspecialchars($wpdb->last_result, ENT_QUOTES);
    $query = htmlspecialchars($wpdb->last_query, ENT_QUOTES);

    echo "<div id='error'>
            <p class='wpdberror'><strong>Ошибка базы данных WordPress:</strong> [$str]<br />
            <code>$query</code></p>
          </div>";
} else {
    // Перебор результатов
    foreach ($rows as $row) {
        // Проверка, является ли результат строкой
        if (is_string($row->rul_value)) {
            $singleParts .= $row->rul_value . "\n"; // Добавление значения к переменной
        } else {
            // Результат не является строкой, выводим информацию для отладки
            echo "Неожиданный результат. Мы получили: <pre>";
            print_r($row->rul_value); // Вывод массива или объекта
            echo "</pre>";
        }
    }
}

// Выводим результат
echo nl2br($singleParts); // nl2br позволяет вывести переносы строк в HTML

Основные изменения:

  1. Инициализация переменной: Мы инициализируем $singleParts как пустую строку перед началом цикла foreach.
  2. Проверка ошибок: Мы добавили проверку на ошибки после выполнения запроса к базе данных. Если ошибка есть, выводится информация об этом.
  3. Проверка на строку: Внутри цикла foreach мы проверяем, является ли rul_value строкой, и только потом добавляем ее к переменной $singleParts.
  4. Вывод результата: Для вывода результата мы используем nl2br для замены символьных переносов строк на HTML-теги, чтобы они отображались корректно в браузере.

Следуя данным рекомендациям, вы должны избежать появления слова "Array" в вашем выводе. Убедитесь также, что данные в вашей базе данных корректны и соответствуют вашему запросу.

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

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