Вопрос или проблема
Я извлекаю содержимое полей из простой таблицы в 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
Основные изменения:
- Инициализация переменной: Мы инициализируем
$singleParts
как пустую строку перед началом циклаforeach
. - Проверка ошибок: Мы добавили проверку на ошибки после выполнения запроса к базе данных. Если ошибка есть, выводится информация об этом.
- Проверка на строку: Внутри цикла
foreach
мы проверяем, является лиrul_value
строкой, и только потом добавляем ее к переменной$singleParts
. - Вывод результата: Для вывода результата мы используем
nl2br
для замены символьных переносов строк на HTML-теги, чтобы они отображались корректно в браузере.
Следуя данным рекомендациям, вы должны избежать появления слова "Array" в вашем выводе. Убедитесь также, что данные в вашей базе данных корректны и соответствуют вашему запросу.