Как избежать предупреждения PHP о неопределенном смещении в wp-db.php использование foreach

#php #wordpress

Вопрос:

Я пытаюсь установить файл cookie, содержащий идентификатор записи, но только в том случае, если текущий идентификатор записи отсутствует в таблице. Код работает, но я получаю предупреждение PHP «Неопределенное смещение: 0» от wp-includes/wp-db.php и мне интересно, что я сделал не так.

 function getFromDatabase() {
    global $wpdb;
    $sql = $wpdb->prepare( "SELECT page_id FROM foo WHERE page_id IS NOT NULL" );
    $result = $wpdb->get_results( $sql );
    $resultsArray = array();
    foreach ( $result as $row ) {
        $resultsArray[] = $row->page_id;
    }
    return $resultsArray;
}

...

$currentPID = get_the_id();
$ignoredPIDs = getFromDatabase();
if ( !in_array($currentPID, $ignoredPIDs) ) {
    // Set a cookie to post ID
}
 

Я должен упомянуть, что запрос к БД всегда будет возвращать по крайней мере один результат. Любые мысли по этому поводу были бы весьма признательны.

Обновление — Обнаружена проблема, это был вызов $wpdb->prepare . Это всего лишь предположение, но ничего не требовало подготовки, все жестко закодировано, и, возможно, он жаловался на это.

Комментарии:

1. Ошибка также должна содержать номер строки. Похоже, в предоставленном вами коде нет никаких проблем. Но где-то вы пытаетесь получить доступ к 0-му элементу пустого массива (может быть, результат getFromDatabase() , если он пустой?

Ответ №1:

Не имея возможности увидеть, что находится в базе данных getFromDatabase:

Я знаю, вы сказали, что запрос к БД всегда будет возвращать хотя бы один результат, но, черт возьми, попробуйте проверить наличие пустого. Если это работает, то ваша проблема, очевидно, в функции getFromDatabase.

 $currentPID = get_the_id();
$ignoredPIDs = getFromDatabase();
if(!empty($ignoredPIDs)) {
  if ( !in_array($currentPID, $ignoredPIDs) ) {
      // Set a cookie to post ID
  }
}
 

Комментарии:

1. Хм, это не исправило ситуацию, но проблема определенно кроется в функции getFromDatabase. Функция возвращает массив, и если вместо выполнения SQL-запроса я просто определяю массив и возвращаю его, я не получаю предупреждения. Это определенно как-то связано с тем, как я запрашиваю базу данных и упорядочиваю результаты для возврата, но я не уверен, как я все испортил.

2. Возможно, вам захочется опубликовать код для функции getFromDatabase, если вам нужна дополнительная помощь от знающих людей в стеке.