Предупреждение: указан недопустимый аргумент для foreach() в C:\wamp\www\social\includes\class-query.php в строке 145.

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

   public function do_inbox($user_id) {
                    $message_objects = $this->get_message_objects($user_id);

            Line 145 -------->  foreach ( $message_objects as $message ) {?>
                        <div class="status_item">
                            <?php $user = $this->load_user_object($message->message_sender_id); ?>
                            <h3>From: <a href="/social/profile-view.php?uid=<?php echo $user->ID; ?>"><?php echo $user->user_nicename; ?></a></h3>
                            <p><?php echo $message->message_subject; ?></p>
                            <p><?php echo $message->message_content; ?></p>
                        </div>

Вот мой полный код:

<?php
       //class-query.php
    require_once('class-db.php');

    if ( !class_exists('QUERY') ) {
        class QUERY {
            public function load_user_object($user_id) {
                global $db;

                $table = 's_users';

                $query = "
                                SELECT * FROM $table
                                WHERE ID = $user_id
                            ";

                $obj = $db->select($query);

                if ( !$obj ) {
                    return "No user found";
                }

                return $obj[0];
            }

            public function load_all_user_objects() {
                global $db;

                $table = 's_users';

                $query = "
                                SELECT * FROM $table
                            ";

                $obj = $db->select($query);

                if ( !$obj ) {
                    return "No user found";
                }

                return $obj;
            }

            public function get_friends($user_id) {
                global $db;

                $table = 's_friends';

                $query = "
                                SELECT ID, friend_id FROM $table
                                WHERE user_id = '$user_id'
                            ";

                $friends = $db->select($query);

                foreach ( $friends as $friend ) {
                    $friend_ids[] = $friend->friend_id;
                }

                return $friend_ids;
            }

            public function get_status_objects($user_id) {
                global $db;

                $table = 's_status';

                $friend_ids = $this->get_friends($user_id);

                if ( !empty ( $friend_ids ) ) {
                    array_push($friend_ids, $user_id);
                } else {
                    $friend_ids = array($user_id);
                }

                $accepted_ids = implode(', ', $friend_ids);

                $query = "
                                SELECT * FROM $table
                                WHERE user_id IN ($accepted_ids)
                                ORDER BY status_time DESC
                            ";

                $status_objects = $db->select($query);

                return $status_objects;
            }

            public function get_message_objects($user_id) {
                global $db;

                $table = 's_messages';

                $query = "
                                SELECT * FROM $table
                                WHERE message_recipient_id = '$user_id'
                            ";

                $messages = $db->select($query);

                return $messages;
            }

            public function do_user_directory() {
                $users = $this->load_all_user_objects();

                foreach ( $users as $user ) { ?>
                    <div class="directory_item">
                        <h3><a href="/social/profile-view.php?uid=<?php echo $user->ID; ?>"><?php echo $user->user_nicename; ?></a></h3>
                        <p><?php echo $user->user_email; ?></p>
                    </div>
                <?php
                }
            }

            public function do_friends_list($friends_array) {
                foreach ( $friends_array as $friend_id ) {
                    $users[] = $this->load_user_object($friend_id);
                }

                foreach ( $users as $user ) { ?>
                    <div class="directory_item">
                        <h3><a href="/social/profile-view.php?uid=<?php echo $user->ID; ?>"><?php echo $user->user_nicename; ?></a></h3>
                        <p><?php echo $user->user_email; ?></p>
                    </div>
                <?php
                }
            }

            public function do_news_feed($user_id) {
                $status_objects = $this->get_status_objects($user_id);

                foreach ( $status_objects as $status ) {?>
                    <div class="status_item">
                        <?php $user = $this->load_user_object($status->user_ID);  ?>
                        <h3><a href="/social/profile-view.php?uid=<?php echo $user->ID; ?>"><?php echo $user->user_nicename; ?></a></h3>
                        <p><?php echo $status->status_content; ?></p>
                    </div>
                <?php
                }
            }

            public function do_inbox($user_id) {
                $message_objects = $this->get_message_objects($user_id);

                foreach ( $message_objects as $message ) {?>
                    <div class="status_item">
                        <?php $user = $this->load_user_object($message->message_sender_id); ?>
                        <h3>From: <a href="/social/profile-view.php?uid=<?php echo $user->ID; ?>"><?php echo $user->user_nicename; ?></a></h3>
                        <p><?php echo $message->message_subject; ?></p>
                        <p><?php echo $message->message_content; ?></p>
                    </div>
                <?php
                }
            }
        }
    }

    $query = new QUERY;
?>

Вот моя страница вставки php, которая выполняет большинство моих запросов:

<?php
    //class-insert php page
    require_once('class-db.php');


    if ( !class_exists('INSERT') ) {
        class INSERT {
            public function update_user($user_id, $postdata) {
                global $db;

                $table = 's_users';

                $query = "
                                UPDATE $table
                                SET user_email='$postdata[user_email]', user_pass='$postdata[user_pass]', user_nicename='$postdata[user_nicename]'
                                WHERE ID=$user_id
                            ";

                return $db->update($query);
            }


            public function add_friend($user_id, $friend_id) {
                global $db;

                $table = 's_friends';

                $query = "
                                INSERT INTO $table (user_id, friend_id)
                                VALUES ('$user_id', '$friend_id')
                            ";

                return $db->insert($query);
            }

            public function remove_friend($user_id, $friend_id) {
                global $db;

                $table = 's_friends';

                $query = "
                                DELETE FROM $table 
                                WHERE user_id = '$user_id'
                                AND friend_id = '$friend_id'
                            ";

                return $db->insert($query);

            }

            public function add_status($user_id, $_my_post) {
                global $db;

                $table = 's_status';

                $query = "
                                INSERT INTO $table (user_id, status_time, status_content)
                                VALUES ($user_id, '$_my_post[status_time]', '$_my_post[status_content]')
                            ";

                return $db->insert($query);

            }

            public function send_message($_my_post) {
                global $db;

                $table = 's_messages';

                $query = "
                                INSERT INTO $table (message_time, message_sender_id, message_recipient_id, message_subject, message_content)
                                VALUES ('$_my_post[message_time]', '$_my_post[message_sender_id]', '$_my_post[message_recipient_id]', '$_my_post[message_subject]', '$_my_post[message_content]')
                            ";

                return $db->insert($query);
            }
        }
    }


    $insert = new INSERT;
?>

Я также получаю уведомление: Неопределенная переменная: приводит к C:\wamp\www\social\includes\class-db.php в строке 38. Это на моей странице class-db. Вот код:

<?php
     //class-db.php
    if ( !class_exists ('DB') ) {
        class DB {
            public function __construct() {
                $mysqli = new mysqli('localhost', 'root', 'test123', 'social');

                if ($mysqli->connect_errno) {
                    printf("Connect failed %s\n", $mysqli->connect_error);
                    exit();
                }

                $this->connection =  $mysqli;
            }

            public function insert($query) {                
                $result = $this->connection->query($query);

                return $result;
            }

            public function update($query) {
                $result = $this->connection->query($query);

                return $result;
            }

            public function select($query) {                            
                $result = $this->connection->query($query);

                if ( !$result ) {
                    return false;
                }

                while ( $obj = $result->fetch_object() ) {
                    $results[] = $obj;
                }

    Line 38 ----------------->  return $results;
            }
        }
    }

    $db = new DB;
?>

Любая помощь будет оценена по достоинству. Я пытаюсь воспроизвести этот урок на YouTube: https://www.youtube.com/watch?v=Wgbmgf84ZOo


person user3533983    schedule 15.04.2014    source источник
comment
Я настоятельно рекомендую вам избавиться от привычки формировать глобальную переменную :), поместить вашу БД в свой собственный класс, кроме этого - $message_objects = $this->get_message_objects($user_id); -- эта строка, вы должны проверить, что именно она возвращает, используйте var_dump или журналы. кажется, что метод не возвращает то, что вы думаете.   -  person Patrick    schedule 15.04.2014
comment
Я бы немедленно прекратил следовать этому руководству   -  person Phil    schedule 15.04.2014
comment
$message_objects = $this->get_message_objects($user_id); Ваш $message_objects не является массивом. Попробуйте var_dump($message_objects), это может быть false/null.   -  person Andy Librian    schedule 15.04.2014
comment
@AndyLibrian это null, так как лучше всего это исправить?   -  person user3533983    schedule 15.04.2014
comment
@AndyLibrian $message_objects должен возвращать сообщение в мою базу данных.   -  person user3533983    schedule 15.04.2014
comment
Глобалки, SQL-инъекции и, возможно, что-то похуже. Это действительно дымящаяся какашка учебника   -  person Phil    schedule 15.04.2014
comment
@Фил, это для школьного проекта, а не для производства. Мне просто нужно, чтобы он работал, чтобы продемонстрировать логику кода. Я продезинфицирую код в свое время.   -  person user3533983    schedule 15.04.2014
comment
Тогда $user_id тоже может быть пустым. Попробуйте var_dump($user_id);   -  person Andy Librian    schedule 15.04.2014
comment
@user3533983 user3533983 Тогда вы не узнаете ничего, кроме вредных привычек. Найдите лучший учебник   -  person Phil    schedule 15.04.2014
comment
@Phil Это сочетание промедления и плохого обучения нашего нынешнего профессора .... но не стесняйтесь вносить любые предложения.   -  person user3533983    schedule 15.04.2014
comment
@user3533983 user3533983 Я бы просто следовал руководству Laravel quick start или чему-то подобному .   -  person Phil    schedule 15.04.2014


Ответы (2)


Вы должны изменить свою функцию выбора в class-db.php следующим образом:

public function select($query) {                            
  $result = $this->connection->query($query);

  if ( !$result->fetch_object()) {
    $obj = $result->fetch_object();
    $results = array();
    do {
      array_push($results, array($obj));
    while($obj = $result->fetch_object());              
  }
  return $results;
}
person train_fox    schedule 15.04.2014
comment
Я попробовал этот вариант, но он говорит мне, что у меня синтаксическая ошибка. Какие-либо предложения? - person user3533983; 15.04.2014
comment
в нем говорится, что есть синтаксическая ошибка для возврата $results - person user3533983; 15.04.2014

Это потому, что $user_id имеет значение null. Не могли бы вы сказать, где находится строка вашего кода, которая вызывает do_inbox($user_id)?

person Andy Librian    schedule 15.04.2014
comment
Мне может понадобиться объединить мои запросы. Что скажешь? - person user3533983; 15.04.2014
comment
не могли бы вы попробовать var_dump($user_id); каково значение $user_id? - person Andy Librian; 15.04.2014
comment
Хорошо, тогда это проблема. - person Andy Librian; 15.04.2014
comment
do_inbox($user_id) находится в строке 135 class-query - person user3533983; 15.04.2014
comment
Не декларация. Я имею в виду исполнительный. - person Andy Librian; 15.04.2014
comment
публичная функция load_user_object($user_id) - person user3533983; 15.04.2014