需要帮助理解PHP代码


Need help understanding PHP code

以下是我从正在阅读的一本书中获得的一段代码,但我不确定$params$query变量之间的关系。更具体地说,"$query->execute($params);"行中发生了什么,以及$params变量的用途是什么。事先非常感谢。

<?php
Class Posts {
    public $db = '';
    public function __construct(){
        try {
            $this->db = new PDO("mysql:host=localhost;dbname=testposts", "username", "password");
            $this->db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
            $this->index(); 
        } catch (PDOException $e) {
            $e->getMessage();
        }
    }
    public function index(){
        $id = 0;
        $posts = array();
        $template = '';
        if (!empty($_GET['id'])){
            $id = $_GET['id'];
        }
        try {
            if (!empty($id)){
                $query = $this->db->prepare("SELECT * FROM posts WHERE id = ?");
                $params = array($id);
                $template = 'single-post.php';
            } else {
                $query = $this->db->prepare("SELECT * FROM posts");
                $params = array();
                $template = 'list-posts.php';
            }
            $query->execute($params);
            for ($i = 0; $row = $query->fetch(); $i++) {
                $posts[] = array('id' => $row['id'], 'content' => $row['content']);
            }
        } catch (PDOException $e){
            $e->getMessage();
        }
        $query->closeCursor();
        $db = null;
        require_once($template);
    }
}
    enter code here
$posts = new Posts();
?>

这是用于打印帖子的脚本。它就像数据库中有多个帖子一样打印。应该是那样吗?

有人能解释为什么它总是使用list-posts.php脚本打印吗

single-post.php

<?php foreach ($posts as $post): ?>
    <h1>Post #<?php echo htmlspecialchars($post['id']); ?></h1>
    <hr>
    <?php echo htmlspecialchars($post['content']); ?>
    <a href="http://localhost/other/posts.php">Back to Post List</a>
<?php endforeach; ?>

listposts.php:

<h1>List of Blog Posts</h1>
<?php foreach ($posts as $post): ?>
    <h3>Post # <?php echo htmlspecialchars($post['id']); ?></h3>
    <?php echo htmlspecialchars($post['content']); ?>
    <a href="http://localhost/other/posts.php?id=<?php 
        echo htmlspecialchars($post['id']); ?>">Read More</a>
    <hr>
<?php endforeach; ?>

$query->execute($params)它是PDOStatement::execute($input_parameters)另请参阅http://php.net/manual/en/pdostatement.execute.php

发生了什么

$query = $this->db->prepare("SELECT * FROM posts WHERE id = ?");
$params = array($id);

从这里的这些代码。可以解释为它准备运行一个"查询"。如果你注意到"?",那就是params打电话给后的去向

$query->execute($params);

$params的每个元素都替换查询中的"?",并对数据库运行查询。所以,如果你有2个"?"。您的$params必须有2个元素。如果您没有任何"?",您可以发送一个空数组,正如您从自己的代码中看到的那样。

$query = $this->db->prepare("SELECT * FROM posts");
$params = array();

有关更多示例,请参阅PDOStatement::execute as kmlnvm前面提到的