Php pdo调用函数和访问变量

时间:2016-03-08 16:14:29

标签: php mysql function pdo

我想了解如何在我的简单网页应用中的不同页面上调用函数的结果。我对php / pdo很新。

大多数时候我只想创建一个简单的SELECT函数并在另一个页面上显示数据。

我有一个包含我所有名为class.crud.php的函数的页面,内容如下(为显示目的而缩小);

class.crud.php

class crud {

    private $db;

    function __construct($DB_con) {
        $this->db = $DB_con;
    }

    public function testing() {
        $stmt = $this->db->prepare("SELECT * FROM users WHERE user_id=:userId");
        $stmt->bindparam(":userId", $_SESSION['user_session']);
        $stmt->execute();
        $results = $stmt->fetch(PDO::FETCH_ASSOC);
        //var_dump($results); this dumps the results successfully on the desired page
        if ($stmt->rowCount() > 0) {
            while ($row = $stmt->fetch(PDO::FETCH_ASSOC)) {
                print($row['user_id']);
                print($row['user_name']);
                echo $row['user_id'];
                echo $row['user_name'];
            }
        } else {
            echo 'nothing here';
        }
        return true;
    }

}

如何在任何其他页面上显示此testing()功能的结果?我尝试过以下但它没有工作(根本没有数据显示,但如果我取消注释var_dump($results)我可以看到显示的数据数组);

用户-details.php

<div>
  <p>User Details</p>
  <?php $crud->testing();?>
</div>

几个问题;

  • 如果我的功能中有echoprint个变量 - 如何在其他页面上访问此数据?
  • 我应该return true还是return
  • 我应该在我的函数中格式化数据 - 即表格化它。或者将其留在我想要显示的页面上?

我的数据库连接很好,我有很多功能可以使用。然而,它们是我一直用于测试的非常简单的功能。

理解逻辑时,任何帮助都是值得赞赏的。我读了很多教程:/

2 个答案:

答案 0 :(得分:2)

实现此目的的最佳方法是将数据保存到数组中并在函数中返回:

$returnResults = array();
while ($row = $stmt->fetch(PDO::FETCH_ASSOC)) {
    $returnResults[] = $row;
}
return $returnResults;

在模板文件中,您可以调用您的函数,并迭代结果:

<?php 
$testing = $crud->testing();
foreach($testing as $row) {
    // Echo your data here, in whatever way it best fits your template goals
    echo $row['user_id'];
    echo $row['user_name'];
}
?>

正如您所发现的,函数几乎不会直接打印或回显任何内容,因为它会使数据无法访问。此外,模板应始终控制数据在页面上的显示方式。这称为关注分离:

在MVC结构中,模型(您的crud类)应与您的数据库通信以创建,读取,更新或删除数据。它不应该关心如何或何时显示数据。

另一方面,您的视图(在这种情况下是您的模板文件)不应该关注与数据库交谈。它应该向您的模型询问数据,并且只担心相应地显示它。

如果你想进入更多的MVC结构,从技术上讲,你的控制器层应该在模型和视图之间来回传递数据。这意味着从模板中删除$ crud-&gt; testing()调用,并在首先从模型中获取数据的中间文件中调用它,然后呈现视图,向其传递需要呈现的数据。这可能比你的代码在这一点上要复杂得多,但如果你想进一步研究最好的MVC实践和关注点分离,这是值得理解的。

答案 1 :(得分:2)

这背后的原因是你只能 URL GOTO=https://navigator.web.de/?sid=8266e33e4a68f4dc2245fcc7e22063633d603457ed697b8c7aa7cf77306e5e1462f3096157b0b1bc031b669d19bc9df1&tz=1#mail FRAME NAME="mail" TAG POS=1 TYPE=BUTTON FORM=ID:id89 ATTR=ID:id8a TAG POS=1 TYPE=INPUT:TEXT FORM=ID:ide3 ATTR=ID:ide7 CONTENT=Testinput TAG POS=1 TYPE=BUTTON FORM=ID:ide3 ATTR=ID:ide4 只能产生一次结果,除非用可滚动光标构建你的fetch对象。

当返回所有行时(在你的情况下,我的结果集仅由一行组成,因为你有PDOStatement作为键和唯一字段),函数user_id返回false 。因此,在fetch循环中,whilefetch

或者您使用false数组,如硬质合金所建议的,或者您需要在第二次调用fetch之前再次调用$result函数,或者使用可滚动游标来回移动。您可以在PHP文档中使用PDOStatement::fetch

如果你想在数组中得到所有结果,你也可以使用函数PDOStatement::fetchAll

execute

所以它使你的整个功能如下:

$results = $stmt->fetchAll(PDO::FETCH_ASSOC);