1

我目前正在构建一个下载平台,在该平台中,用户会收到一个随机代码并使用它来访问一个 mp3 以供下载最多三个下载。我使用 Python 生成了一个随机代码列表,并将它们导入到一个 SQL 表中,其中一个空列用于关联的电子邮件地址,默认值为 0 用于使用计数。我编写了以下 PHP 脚本,以便将电子邮件与特定代码相关联并添加到计数中,以便最多可以访问 3 次下载。

$email = $_POST["email"];
$email = stripslashes($email);
$uniqueCode = $_POST["uniqueCode"];
$uniqueCode = stripslashes($uniqueCode);

// check that all fields are filled
if($uniqueCode=="" || $email=="")
    apologize("Please fill out all fields.");

// check to make sure that the e-mail is valid
if (verifyEmail($email) == FALSE)
    apologize("Please enter a valid e-mail address.");

// check if uniqueCode input is alphanumeric 
if (verifyCode($uniqueCode) == FALSE)
    apologize("Download codes are alphanumeric.");

// check to see if unique code is correct 
$sql = mysql_query("SELECT * FROM wd009 where uniqueCode='$uniqueCode'");
$result = mysql_fetch_array($sql); 

if($sql==FALSE)
{
    apologize("Your download code is invalid. Please try again");
}
// only allow users with less than 3 downloads to proceed
else if ($result['count'] <= 3) {
        if ($result['email'] == ""){
            mysql_query("UPDATE wd009 SET email='$email', count=1 WHERE uniqueCode='$uniqueCode'");
            apologize("added email"); 
            }
        else if ($result['email'] != $email)
            apologize("different email from record!!"); 
        else if ($result['email'] == $email){
            mysql_query("UPDATE wd009 SET count=count+1 WHERE uniqueCode='$uniqueCode'");
            apologize("updated the count!"); 

}
else 
    apologize("Your download code is used up!"); 

显然,我在上面使用了一些代码中未包含的函数,但我已经检查了所有这些函数,它们都不应该干扰 MySQL 查询。可能需要注意的是,apologize() 在道歉后立即退出。当我在表单中输入正确的代码时,它可以正常工作并更新 SQL 数据库。但是,只要下载代码输入是字母数字,即使该字符串肯定与表中的任何字符串都不匹配,表单也会接受它。即,无论输入如何,mysql_query 都会返回一个资源。我检查了数据库连接,但由于下载代码正确时表已正确更新,这似乎不是问题。

我已经尝试过以我能想到的所有方式进行调试,并且真的很困惑。您能提供的任何帮助将不胜感激!

4

3 回答 3

1

正如您在手册中所见,mysql_query始终为有效查询返回资源,因此您需要更改逻辑并计算它返回的行数,而不是mysql_query.

除此之外,mysql_query, 已被弃用,您应该使用 mysqli 或 PDO。

您可以使用 - 同样不推荐使用 -mysql_num_rows函数计算行数。在您的情况下,0 行将不是有效代码。

于 2012-06-19T01:19:28.227 回答
0

问题可能是这一行:

if($sql==FALSE)
{
    apologize("Your download code is invalid. Please try again");
}

由于 sql 是一个字符串,因此它接受的是 true 并将其传递为有效。为了避免 sql 注入,您可能还想做的一件事是使用参数而不是直接注入用户输入。

$sql = mysql_query("SELECT * FROM wd009 where uniqueCode='$uniqueCode'");    

相反,请执行以下操作:

$stmt = $mysqli->prepare("SELECT * FROM wd009 where uniqueCode=?");
$stmt->bind_param($uniqueCode);
$stmt->execute();

while ($stmt->fetch()) {
   .....

您也希望以这种方式对更新语句执行此操作。

如果该表中有大量数据,您可能希望限制 SQL 语句中返回的列,以减轻数据库的负载。

于 2012-06-19T03:16:32.097 回答
0

这个

if($sql==FALSE)

应该是这样的

if(mysql_num_rows($sql) == 0)

编辑:我同意,现在首选 mysqli 或 PDO。

于 2012-06-19T01:20:54.643 回答