0

我有这段代码,我想知道是否有更简单的方法可以重复它。我有大约 60 个,我会一直添加更多,所以如果有人可以帮助我找出一个循环或其他东西,这样我就不必手动添加每个了。这些中的每一个都链接到下载,所以我猜我可能不得不使用变量名作为文件名。文件名 01 Intro.mp3 说明了下载的位置,所以我猜要完成这项工作,我还必须将其更改为变量名。

这是我用来获取变量名的代码。

while ($row = mysqli_fetch_array($resultstwo))
    {
    extract($row);
    }

这是我想重复的代码。我包括其中两个。

<?php
            if ($intro ==1) {
                $strKey = createKey();
                mysqli_query($resDB,"INSERT INTO downloads (downloadkey, file, expires) VALUES ('{$strKey}', '01 Intro.mp3', '".(time()+(60*60))."')");
                echo "<a href='download.php?key=$strKey'>Intro</a>";
            }
        ?>
        <?php
            if ($fightingfires ==1) {
                $strKey = createKey();
                mysqli_query($resDB,"INSERT INTO downloads (downloadkey, file, expires) VALUES ('{$strKey}', '02 Fighting Fires.mp3', '".(time()+(60*60))."')");
                echo "<a href='download.php?key=$strKey'>Fighting Fires</a>";
            }
        ?>
4

4 回答 4

2

如果尚未包含,我建议在数据库中包含一些变量,例如:

id,caption,filename
--------------------
1,Intro,01 Intro.mp3
2,Fighting Fires,02 Fighting Fires.mp3

以下是用于创建此表的 SQL 查询:

CREATE TABLE `music` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `caption` varchar(32),
  `filename` varchar(32),
  PRIMARY KEY (`id`),
  UNIQUE KEY `uc_filename` (`filename`)
);

以及您还可以插入的一些测试数据。

INSERT INTO `music`(`caption`,`filename`) VALUES('Intro','01 Intro.mp3'),('Fighting Fires','02 Fighting Fires.mp3');

假设用户表遵循当前格式:

id,username,intro,fightingfires
-------------------------------
1,michael,1,NULL
2,dave,NULL,NULL

我认为应该改变它来显示这个:

id,username,music_id
--------------------
1,michael,1,
2,dave,NULL

该表的结构可以写成:

CREATE TABLE `users` (
 `id` int(11) NOT NULL AUTO_INCREMENT,
 `username` varchar(32),
 `music_id` int(11),
 PRIMARY KEY (`id`),
 KEY `music_id` (`music_id`),
 CONSTRAINT `users_music_id_ibfk_1` FOREIGN KEY (`music_id`) REFERENCES `music` (`id`) ON DELETE CASCADE
);

现在,当从音乐表中删除音乐行时,任何希望下载该音乐的用户也将被删除。

现在尝试像这样查询数据库:

$resultstwo=$mysqli->query("SELECT `music_id` FROM `users` WHERE `username`='michael'");

根据登录的用户更改用户名,但我想你可以控制它。

然后您可以像这样更好地管理数据:

while ($row = mysqli_fetch_array($resultstwo)) {
    $strKey = createKey();
    mysqli_query($resDB,"INSERT INTO downloads (downloadkey, file, expires) VALUES ('{$strKey}', '".$row['filename']."', '".(time()+(60*60))."')");
    echo "<a href='download.php?key=$strKey'>".$row['caption']."</a>";
    break;
}

然后,您可以通过在上表中添加或删除列来更好地管理音乐下载。

于 2013-05-03T05:02:39.727 回答
1

我不完全了解您想要做什么,但我假设以下内容:

您正在从包含文件名的表中读取数据,并且对于要在表下载中创建条目的每个文件,以及输出下载的 HTML 链接。

这是你可以做到的,但看起来你需要将文件的表结构更改为如下所示:

id  track_no  filename

在这种情况下,您可以直接在第一个循环中执行所有操作:

<?php
while($row = mysqli_fetch_array($resultstwo))
{
    $strKey = createKey();
    mysqli_query($resDB, 
        "INSERT INTO downloads (downloadkey, file, expires) 
        VALUES(
            $strKey, 
            $row['track_no']." ".$row['filename'], 
            (time()+(60*60))
        )");
    echo "<a href=\"download.php?key=$strKey\">$row['filename']</a>";        
}

如果这不能回答您的问题,您应该告诉我们更多关于包含文件的表的信息。

于 2013-05-03T05:16:36.273 回答
1

在其他答案的基础上,以下是如何执行循环并仅访问数据库一次。

$query = "INSERT INTO downloads (downloadkey, file, expires) VALUES ";

while ($row = mysql_fetch_array($resultstwo)) {
    $strKey = createKey();
    $time = time()+(60*60);

    $query .= "('{$strKey}', '{$row['filename']}', {$time}),";
    echo "<a href='download.php?key=$strKey'>{$row['caption']}</a>";
}

$query = substr ( $query, 0, -1 ); // Remove the last comma.

mysql_query ( resDB, $query );

查询的最终结果将类似于:

INSERT INTO downloads (downloadkey, file, expires) VALUES 
                      ('adfsdfgsdgs', 'Bladerunner.avi', 12345678),
                      ('dfghfyadfsg', 'How_I_met_your_mother.avi', 12345678),
                      ('34t34t3t', 'Simpson_the_movie.avi', 12345678),
                      ('taert43te', '{$row['filename']}', 12345678),
                      ('at43t3t', '{$row['filename']}', 12345678),

这将仅使用这一查询将所有值插入 mysql。

于 2013-05-03T05:36:05.177 回答
0

怎么样:

function f($condition, $filename, $prettyname) 
{ 
    if ($condition) 
    {
        $strKey = createKey();
        mysqli_query($resDB,"INSERT INTO downloads (downloadkey, file, expires) VALUES ('{$strKey}', '$filename', '".(time()+(60*60))."')");
        echo "<a href='download.php?key=$strKey'>$prettyname</a>";
    }
}

然后只需从数据库、文件或您认为合适的数组中恢复值。

于 2013-05-03T04:55:28.853 回答