Массив в строку ошибки

У меня проблемы с отображением .$app->reactieDoor($topic['id']);, он покажет мне ошибку, и я понятия не имею, почему он это делает! пожалуйста, помогите мне.

Ps Я новичок, поэтому, если мне что-то не хватает в коде, скажите мне.

Строка с ошибкой:

 echo ' laatste reactie: ' .$app->tijd_reactie($topic['id']) . ' door ' .$app->reactieDoor($topic['id']);

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

.$app->reactieDoor($topic['id']);

Код функций:

function reactieDoor($topicid) {
        $this->database->query("SELECT klanten.voornaam, klanten.achternaam FROM reacties 
        LEFT JOIN klanten ON klanten.id=reacties.klant_id
        WHERE reacties.topic_id=:topic_id ORDER BY create_time DESC LIMIT 1"); 

        $this->database->bind(":topic_id", $topicid);    
        $reactie = $this->database->single();

        return $reactie;

    }

Я получаю ошибку

Массив в строку ошибки

Вы изучали использование PDO? php.net/manual/en/book.pdo.php

B3none 13.04.2018 11:39

@ B3none Я все еще не смог найти проблему

thattommm 13.04.2018 11:40

Я предполагаю, что $this->database->single(); возвращает массив (содержащий имя и фамилию), поэтому, когда вы return $reactie;, вы возвращаете массив ... поэтому вы пытаетесь интерполировать массив в ...' door ' .$app->reactieDoor($topic['id']);

CD001 13.04.2018 11:43

Понятно, я использовал var_dump и теперь вижу, есть какие-нибудь советы, как это сделать правильно? @ CD001

thattommm 13.04.2018 11:51
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
1
4
50
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

 .$app->reactieDoor($topic['id']);

эта строка кода дает вам массив вместо одного результата. попробуйте var_dump результат.

 var_dump( $app->reactieDoor($topic['id']) );

и вы увидите, что это массив

Понятно, но как мне тогда это сделать?

thattommm 13.04.2018 11:50
Ответ принят как подходящий

Я предполагаю, что $this->database->single(); возвращает массив (содержащий имя и фамилию), поэтому, когда вы return $reactie; из функции, это массив, который вы пытаетесь интерполировать в строку ... отсюда и ошибка.

Поскольку этот массив должен содержать имя и фамилию, попробуйте сначала присвоить это переменной $name и использовать вместо этого.

Что-то вроде:

$name = "Mysterious Stranger";
if ($n = $app->reactieDoor($topic['id'])) {
    $name = "{$n['voornaam']} {$n['achternaam']}";
}

echo " laatste reactie: "
    . $app->tijd_reactie($topic['id'])
    . " door {$name}";

Возможно, лучше сделать это в функции если, эта функция всегда должна возвращать строку, содержащую имя.

В этом случае вы можете вместо этого изменить функцию на это:

function reactieDoor($topicid) {
    $this->database->query("SELECT klanten.voornaam, klanten.achternaam FROM reacties 
        LEFT JOIN klanten ON klanten.id=reacties.klant_id
        WHERE reacties.topic_id=:topic_id ORDER BY create_time DESC LIMIT 1"); 

    $this->database->bind(":topic_id", $topicid);    
    $reactie = $this->database->single();

    return $reactie ? 
        "{$reactie['voornaam']} {$reactie['achternaam']}" :
        "Mysterious Stranger";
}

Да, он должен всегда показывать 2 вещи, но не могу ли я просто использовать этот код ?: echo ' laatste reactie: ' .$app->tijd_reactie($topic['id']) . ' door ' .implode($app->reactieDoor($topic['id']) );

thattommm 13.04.2018 12:00

^ должен работать до тех пор, пока id, переданный функции, действителен - я бы опасался передавать недопустимый идентификатор в функцию и возвращать что-то вроде false, что сломало бы implode(), и все. @thattommm

CD001 13.04.2018 12:01

Я использовал функцию, которую вы описали, и хорошо работал, подскажите, какую из них мне следует использовать? implode() или ваша функция? плюсы и минусы?

thattommm 13.04.2018 12:10

Преимущество использования модифицированной функции состоит в том, что она имеет встроенную ловушку ошибок - если по какой-то причине $reactie = $this->database->single(); выйдет из строя и выдает что-то фальшивый, тогда функция вернет Таинственная незнакомка - вы всегда получите строку обратно, чтобы вы всегда знали, что вы имея дело с. Однако, если вы уверены, что исходная функция всегда вернет массив, тогда мощь будет более гибким, чтобы оставить его и использовать implode() в вашем выводе (дает возможность извлечь имя или фамилию по мере необходимости, как в моем первом примере).

CD001 13.04.2018 12:12

Другие вопросы по теме