我该如何去抓取我的数据库中的一个帖子的ID时,它存在于一个数组从以前的功能?



我是相当新的PHP和MySQL/Wampserver/MVC模型,因为我还在学习它。在我正在工作的一个项目中,我有一个包含多个表(用户,帖子,评论)的数据库。我已经想出了如何1)在提交表单后在数据库中注册一个新帖子,并在主页上获取所有帖子以列表显示它们。这是通过以下代码完成的:

public function getAllPosts()
{
$query = "SELECT * FROM posts ORDER BY timestamp(date) desc LIMIT 5";
$request = $this->db->prepare($query);
$request->execute();
$allPost = $request->fetchAll(PDO::FETCH_ASSOC);
var_dump($allPost);
return $allPost ? $allPost : [];
}

$allPost在这里作为一个数组返回,包含多个信息因为这个数组包含了每个帖子的ID,所以我想从一个特定的帖子中选择一个特定的ID,我的想法是获取生成的数组中存在的ID来制作帖子列表,并通过post方法将其传递给地址。

这是一件令人费解的事情吗?如果是这样,你建议我怎么做呢?

到目前为止我尝试的事情:创建一个新的公共函数,用一个新的查询从数据库中获取ID ("SELECT ID from tablename WHERE ID =?"),但这不起作用,只是返回"布尔值false "在var_dump

public function getOnePostById()
{
$query = "SELECT id FROM posts WHERE id=?";
$request = $this->db->prepare($query);
$request->execute();
$singlePost = $request->fetch(PDO::FETCH_ASSOC);
var_dump($singlePost);
}

然后我试图传递给getOnePostById结果数组从前一个函数,而这似乎是由我的代码接受,在我的控制器之后,数组$allPost被标记为一个未定义的变量

您必须在查询中提供占位符的值,通过使用PDOStatementbindParambindValue方法或将其作为数组参数添加到execute()

public function getAllPosts(): array
{
$query = "SELECT * FROM posts ORDER BY timestamp(date) desc LIMIT 5";
$request = $this->db->query($query);
return $request->fetchAll(PDO::FETCH_ASSOC);
}
// if your Post ID is not a number, use string $id
public function getOnePostById(int $id): ?array
{
$query = "SELECT * FROM posts WHERE id = ?";

$request = $this->db->prepare($query);
$request->execute([$id]);
return $request->fetch(PDO::FETCH_ASSOC);
}
// Here you can just check post existence by given id
// if your Post ID is not a number, use string $id
public function isPostExists(int $id): bool
{
$query = "SELECT 1 AS exist FROM posts WHERE id = :id";

$request = $this->db->prepare($query);
// if your Post ID is not a number, use PDO::PARAM_STR
$request->bindParam('id', $id, PDO::PARAM_INT);

$request->execute();

// FETCH_OBJ example
return (bool)$request->fetch(PDO::FETCH_OBJ);
}

注:FETCH_ASSOC是不好的做法(因为它只是一个数组,它可以是一个条目列表,也可以是单个条目)。首选PDO::FETCH_OBJ
查看更多关于PDO获取模式和如何设置默认获取模式(整个PDO实例,而不仅仅是PDOStatement)和许多其他设置。

乌利希期刊指南$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);也是一个很好的实践,你的PDO实例将抛出异常,而不是沉默的失败。

查看bindParambindValue的区别-这里

相关内容

最新更新