2

对此有什么简化吗?

$query = $this->link->prepare('SELECT * FROM test WHERE id = :id LIMIT 1')
$query->bindParam(':id', $id);
$query->execute();
$row = $query->fetch(PDO::FETCH_ASSOC);
unlink($row['avatar']);
$query = $this->link->prepare('DELETE FROM test WHERE id = :id LIMIT 1');
$query->bindParam(':id', $id);
$query->execute();
4

2 回答 2

0

我不喜欢建议人们跳过使用查询参数。你应该养成这样做的习惯。

这实际上并不难,而且它使编写查询变得更简单,因为您永远不必考虑是否得到了正确的转义和引用。我发现它使我的代码看起来更清晰。

我一直很困惑人们如何得知他们需要使用 bindParam() 来处理 PDO 的所有内容。在大多数情况下,将参数数组传递给 execute() 会更简单。我通常使用的唯一情况bindParam()是如果我需要传递一个 NULL 值。

此外,您不需要使用命名参数,您可以使用位置参数(但不要在给定查询中混合这些参数类型)。

fetchColumn()如果您只需要一列,则更简单。说到这一点,SELECT *当你不需要所有的列时避免。

如果您正在查询特定id的 ,假设这是主键,那么您不需要LIMIT 1. 任何唯一键中的特定值最多可以有一行。

我假设您已启用基于异常的错误报告。如果没有,您应该检查每次调用的结果prepare()execute()因为它们在错误时返回false

$query = $this->link->prepare('SELECT avatar FROM test WHERE id = ?')
$query->execute([$id]);
$avatar = $query->fetchColumn();
unlink($avatar);
$query = $this->link->prepare('DELETE FROM test WHERE id = ?');
$query->execute([$id]);

PS:数组的简短语法,如[$id],需要 PHP 5.4

于 2013-10-22T04:02:55.300 回答
0

谢谢你的好问题。令我彻底失望的是,这样的问题在这个网站上极为罕见。

对此有什么简化吗?

当然。

这称为“编程”。
虽然对于普通的 PHP 用户来说,编程代表只是将几个预定义的块放在一起,就像乐高积木一样,但实际上编程更多地代表发明,创造的东西。优化同样如此,为相同的动作采取更少的动作。

程序员总是可以创建一个函数来封装重复的任务。最终他可能希望将这些函数放在一个类中,但这不是重点。

如您所见,您的大多数操作员只是重复操作员。每次看到重复时,您肯定知道可能有一个函数或至少一个循环。

这是您使用我的编程尝试的代码,旨在(除了额外的安全性)非常代码缩短:

$name = $this->link->getOne('SELECT avatar FROM test WHERE id = ?i', $id)
unlink($name);
$this->link->query('DELETE FROM test WHERE id = ?i', $id);

如您所见,此代码是 Extra DRY(代表 Don't Repeat Yourself)——所有重复的代码都被带入内部。

好吧,如你所见,我的课程是建立在 mysqli 之上的。但当然,即使使用丑陋的 PDO,也可以使用我最近发布的一种包装器来完成类似的操作:

$name = $this->link->query('SELECT avatar FROM test WHERE id = ?', [$id], "one");
unlink($name);
$this->link->query('DELETE FROM test WHERE id = ?', [$id]);

顺便说一句,稍微进一步编程,您可能会进一步缩短此代码:

unlink($avatar_dir.$id.".png");
$query = $this->link->query('DELETE FROM test WHERE id = ?i', $id);

作为头像图像显然不需要专门的名称,就id可以完美地服务,为您节省数据库中的额外字段和额外的查询。所有头像可以在上传时转换为单一格式,更加减少头痛。

于 2013-10-22T06:03:37.793 回答