【问题标题】:Better iteration to display Object properties PHP更好的迭代以显示对象属性 PHP
【发布时间】:2016-08-31 07:01:50
【问题描述】:

我正在寻找一种更好的方法来遍历对象并显示其内容。
表单控制器:

 公共函数 run(){

        $tabteacher='';

        if(!empty($_SESSION['apply']) && !empty($_SESSION['application'])){

            $tabteachers = DB::getInstance()->select_teacher_id($_SESSION['login']);
        }
        require_once(VIEW_PATH.'formdeux.php');
    }

Db.class 函数():

公共函数 select_teacher_id($login){
        $query = '从教师、实习生、学生那里选择 * 教师.email_teacher = 实习生.email_responsible_internship 和学生.registry_number_student = 实习生.registry_student_internship 和实习生.registry_student_internship = '。 $this->_db->quote ( $login );
        $result = $this->_db->query ( $query );
        if ($result->rowcount () != 0) {
            while ( $row = $result->fetch () ) {
                $teacher[]= 新教师 ($row->email_teacher,$row->firstname_teacher,$row->lastname_teacher,$row->responsible_internship_teacher,NULL);
            }
            返回$老师;
        }
    }

表单视图:

    <table>
        <thead>
            <tr>
                <th width="20%" class="decoration">contact</th>
            </tr>
        </thead>
            <tbody>
            <?php foreach ($tabteachers as $teacher) { ?>
                <tr>
                    <td>Lastname: <td>
                    <input type="text" name="lastnamepro" value="<?php echo $teacher->lastname_teacher() ?>" size="100px">
                </tr>
                <tr>
                    <td>Firstname: <td>
                    <input type="text" name="firstnamepro" value="<?php echo $teacher->firstname_teacher() ?>" size="100px">
                </tr>
                <tr>
                    <td>Email address: <td>
                    <input type="text" name="emailpro" value="<?php echo $teacher->email_teacher() ?>" size="100px">
                </tr>
                <tr>
                    <td>Service: <td>
                    <input type="text" name="servicepro" value="null" size="100px">
                </tr>
                <tr>
                    <td>mobile number: <td>
                    <input type="text" name="phonenumberpro" value="aucun numero" size="100px">
                </tr>
            <?php } ?>
            </tbody>
    </table><br>

数据库连接:

私有静态 $instance = null;
    私人 $_db;

    私有函数 __construct() {

        尝试 {
            $this->_db = new PDO ('mysql:host=localhost;dbname=ProjectWeb;charset=utf8', 'root', '' );
            $this->_db->setAttribute (PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
            $this->_db->setAttribute ( PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_OBJ );

        } 捕捉(PDOException $e){
            die ('Erreur de connexion à la base de donnée :' . $e->getMessage () );
        }
    }

    // 模式单例
    公共静态函数 getInstance() {
        if (is_null ( self::$instance )) {
            self::$instance = new Db ();
        }
        返回自我::$实例;
    }

提前感谢您的帮助!

【问题讨论】:

  • 谁能帮帮我?
  • 当前设置有什么问题?你面临任何错误吗?或者你想优化它?
  • @Vincent 我收到一条错误消息,提示 警告:为 foreach() 提供的参数无效它来自我实现的 foreach。
  • 好的,您是否在 Db 类中使用 PDO 包装器?
  • 查看下面的答案,如果您仍然看到 foreach 的参数无效错误,请在您的控制器中检查方法 select_teacher_id() 是否返回任何数据,使用 print_r() 或 var_dump() 进行调试

标签: php object foreach


【解决方案1】:

我看到您已将默认获取模式设置为 FETCH_OBJ ,在这种特殊情况下,尽管我认为您可以使用 PDO 的 fetchAll 方法将整个结果集作为数组获取,然后对其进行迭代,

 public function select_teacher_id($login){
   $query = 'SELECT * FROM teachers,internships,students WHERE
   teachers.email_teacher = internships.email_responsible_internship
  AND students.registry_number_student = internships.registry_student_internship
  AND internships.registry_student_internship = '. $this->_db->quote ( $login );


   $result = $this->_db->query ( $query );
       if ($result->rowcount () != 0) {
         //fetch the entire result set as a multi-dimensional assoc array
         $teachers_result = $result->fetchAll(PDO::FETCH_ASSOC); 
         return $teachers_result;
       }
 }

//查看

<table>
    <thead>
        <tr>
            <th width="20%" class="decoration">contact</th>
        </tr>
    </thead>
        <tbody>
        <?php foreach ($tabteachers as $teacher) { ?>
            <tr>
                <td>Lastname: <td>
                <input type="text" name="lastnamepro" value="<?php echo $teacher['lastname_teacher'] ?>" size="100px">
            </tr>
            <tr>
                <td>Firstname: <td>
                <input type="text" name="firstnamepro" value="<?php echo $teacher['firstname_teacher'] ?>" size="100px">
            </tr>
            <tr>
                <td>Email address: <td>
                <input type="text" name="emailpro" value="<?php echo $teacher['email_teacher'] ?>" size="100px">
            </tr>
            <tr>
                <td>Service: <td>
                <input type="text" name="servicepro" value="null" size="100px">
            </tr>
            <tr>
                <td>mobile number: <td>
                <input type="text" name="phonenumberpro" value="aucun numero" size="100px">
            </tr>
        <?php } ?>
        </tbody>
</table><br>

【讨论】:

  • 你是对的,select_teacher_id() 函数在使用 var_dump 测试时返回 null。我意识到由于某种原因, $_SESSION['login'] 没有按应有的方式保存登录 ID。另一方面,您展示元素的方式非常好。
  • 您可以这样做,或者如果您希望它像之前一样作为对象,您可以传递 PDO::FETCH_OBJ 标志而不是 FETCH_ASSOC,并在视图中相应地调用属性,即使这样也会做..
  • 做了一些测试,我可以确认我的 $_SESSION['login'] 是空的,你是正确的。但是我不明白为什么我给 $_SESSION[] 的价值不再存在。我使用 $_POST 表保存了一个用户名。感谢您的帮助,我真的很感激!
猜你喜欢
  • 1970-01-01
  • 2023-03-24
  • 1970-01-01
  • 2013-09-29
  • 2021-06-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多