2010-10-12 66 views
1

我需要一些想法,使我的代码更清洁一个简单的数据库一个非常简单的应用程序。我有以下想法,但它不能很好地工作。这是我在做什么:在代码中组织MySQL查询的正确方法?

我在页面上有很多查询(占用大量的空间和源代码看起来凌乱。我想有一个他们在另一个PHP文件,我可以调用索引通过包括

除了我遇到了一个问题,我有一个查询,看起来像这样的外部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)); 

这样做的问题是,即使我没有用mysql_query()查询$RegisterQuery它抛出一堆关于使用mysql_real_escape_string()以及无法连接的MySQL警告。当我甚至不查询数据库时,我不明白它是如何做到这一点的!

话又说回来,我可以很容易忽略这些警告...

我只是不知道我在做正确这个在这种情况下,我主要是想询问是否有这样做还是应该更好的方法我只是忽略了警告?

您的反馈非常感谢!提前致谢。

回答

3

我建议使用参数化的查询(例如经由库MySQLi或PDO)。

你没有逃跑的字符串,如果他们的参数查询。这使得代码更加清晰,并且使编写安全代码变得更加容易,因为如果您始终使用参数化查询,那么您很可能会留下SQL注入漏洞。

+0

+1每次调用mysql_real_escape_string都是数据库服务器上的命中。参数化查询是标准解决方案。 – 2010-10-12 18:26:17

+0

我可以在哪里了解有关参数化查询的更多信息?我会诚实地说,我从来没有听说过他们。谷歌搜索几乎没有返回。 =( – Tek 2010-10-12 18:51:19

+0

@Tek:检查出http://stackoverflow.com/questions/60174/best-way-to-stop-sql-injection-in-php – 2010-10-12 18:58:12

2

功能mysql_real_escape_string需要一个数据库连接。从php.net开始:

使用mysql_real_escape_string()之前需要MySQL连接,否则会生成级别为E_WARNING的错误,并返回FALSE。如果未定义link_identifier,则使用最后一个MySQL连接。

如果没有数据库连接存在,它会返回false,因此没有逃脱被完成,返回值是不是您所期望的。

1

我认为你需要重新考虑你的解决方案。虽然你可能认为在源代码中使用这些查询是“麻烦”的,但是当代码的一个未来维护者每次想要检查数据库逻辑时必须切换到不同的文件时,具体点。

至于mysql_real_escape_string的错误,该函数使用MySQL服务器,因为它需要相对于活动数据库连接的字符集转义字符串。

0

mysql_real_escape_string使得数据库服务器的呼叫。

与其说mysql_real_escape_string当你建立查询,调用它执行查询之前。

但是,理想情况下,您应该使用参数化查询。