我需要一些想法,使我的代码对于使用简单数据库的非常简单的应用程序来说更清晰一些。我有以下想法,但它不能很好地工作。这就是我正在做的事情:
我在页面上有很多查询(占用大量空间,源代码看起来很乱。我想在另一个PHP文件中有一个索引,我可以通过include调用。
除了遇到问题。我有一个在外部php页面上看起来像这样的查询。
Queries.php:
$RegisterQuery = sprintf("INSERT INTO `testdb`.`users` (
`user_id`,
`username`,
`password`,
`First Name`,
`Last Name`,
`email`)
VALUES (
NULL,
'%s',
'%s',
'%s',
'%s',
'%s'
);",
mysql_real_escape_string($username),
mysql_real_escape_string($password),
mysql_real_escape_string($first_name),
mysql_real_escape_string($last_name),
mysql_real_escape_string($email));
这个问题是,即使我没有用$RegisterQuery
查询mysql_query()
,它也会抛出一堆关于使用mysql_real_escape_string()
的MySQL警告以及它如何无法连接。当我甚至不查询数据库时,我不知道它是怎么做的!
然后,我可以轻易忽略警告......
我只是不确定我是否正确地做了这种情况,在这种情况下,我主要想询问是否有更好的方法可以做到这一点,还是应该忽略警告?
非常感谢您的反馈!提前谢谢。
答案 0 :(得分:3)
我建议使用参数化查询(例如通过mysqli或PDO)。
如果它们是查询的参数,则不必转义字符串。这既使代码更清晰,也使编写安全代码更容易,因为如果你一直使用参数化查询,你将不太可能留下SQL注入漏洞。
答案 1 :(得分:2)
函数mysql_real_escape_string需要数据库连接。来自php.net:
在使用mysql_real_escape_string()之前需要MySQL连接,否则会生成级别为E_WARNING的错误,并返回FALSE。如果未定义link_identifier,则使用最后一个MySQL连接。
如果不存在数据库连接,它将返回false,因此不会进行转义,并且返回的值不是您所期望的。
答案 2 :(得分:1)
我认为您需要重新考虑您的解决方案。虽然你可能认为在源代码中使用这些查询是“混乱的”,但是当他每次想要检查数据库逻辑时必须切换到不同的文件时,该代码的未来维护者将会解决问题。具体点。
对于mysql_real_escape_string
的错误,该函数使用MySQL服务器,因为它需要相对于活动数据库连接的字符集转义字符串。
答案 3 :(得分:0)
mysql_real_escape_string
调用数据库服务器。
不是在构建查询时调用mysql_real_escape_string
,而是在执行查询之前调用它。
但是,理想情况下,您应该使用参数化查询。