在PDO中使用静态变量中的表名

时间:2016-05-28 21:22:26

标签: php mysql sql pdo

我知道,PDO不会让我在表格上使用“param系统”。我的问题是,我将所有表名作为变量/静态变量存储在名为“Tables”的对象中(因此我可以集中更新表名)。

我找不到问题的答案,如果使用我的静态变量构建查询是一个好主意/不错的做法(用户无法更改表名/浏览表,所以这不应该是一个安全问题

示例:

$statement = $this->pdo->prepare('SELECT `category-id`, `icon`, `name` FROM ' . Tables::$BOARD_CATEGORIES);

我可以使用这种技术,还是应该坚持正常的“静态”方式? 谢谢:))

2 个答案:

答案 0 :(得分:2)

参数化预准备语句的主要安全优势在于,它可防止在语句被DB解析之前将字符串从不可信赖的源插入到SQL语句中;在解析和准备语句之后,只允许值替换,而不是可执行子句。

您可以将原始SQL查询视为“来自可靠来源的字符串”。如果它提高了可维护性,我认为没有理由从较小的字符串构建查询,前提是所有这些字符串也来自可靠的来源,例如Tables类。 (但我确实想知道你多久会重新命名一次表。)

无论是否是“最佳实践”,我都不准备说,但是当我使用The Great Azure Empire(真实公司的假名)时,我确实看到了类似的行业内容,而我认为即使是“最佳实践”也不应被视为教条。

答案 1 :(得分:-2)

答案:

这取决于您用于开发和修改 Tables 对象的代码。但总的来说,传统方法更加经过测试,更安全。 代码与常用PDO代码之间唯一真正的区别在于如何生成sql语句。如果使用自己的代码创建正在准备的sql语句,则必须完全确定用户输入不会修改该sql语句的结构。风险更高,如果不需要,建议不要使用,但如果你的网站绝对需要它,那么绝对确保产生 Tables 对象的代码不会被用户恶意操纵

阐述答案:

您的代码与使用PDO的一般方式之间的真正区别在于您以不同方式生成sql语句。通常,您会看到如下代码:

$sql = "SELECT `category-id`, `icon`, `name` FROM myTable WHERE id = :id";
$stmt = $conn->prepare($sql);
$stmt->bindParam(":id", $id);
$stmt->execute();

我假设你也在你的代码中绑定你的参数,因为那将是你在问题中显示的准备过程之后)。

因为你正在对你的表做的唯一真正的区别是生成sql语句,你只需要完全确定用户输入绝对没有办法影响你的sql结构,因为如果有,那么prepare语句将不会保证您的数据库安全。

通常,人们倾向于使用传统和经过测试的方法,但是如果您绝对需要使用表对象来生成sql语句,请确保创建和更新对象的代码来自用户输入。