这有什么简化吗?

时间:2013-10-22 03:10:43

标签: php sql pdo

这有什么简化吗?

$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();

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:0)

谢谢你提出的好问题。令我完全失望的是,这个问题在这个网站上极为罕见。

  

这有什么简化吗?

不确定

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

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

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

以下是使用my attempt in programming的代码,针对代码缩短的目标(除了额外的安全性):

$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(代表不要重复自己) - 所有重复的代码都被带入了内部。

嗯,正如你所看到的,我的班级建立在mysqli之上。但是当然可以使用丑陋的PDO进行类似的操作,使用包装类one I posted recently

$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可以完美地发挥作用,在数据库和额外查询中节省额外的字段。所有头像在上传时都可以转换为单一格式,以减轻头痛。