2013-05-03 146 views
0

我有这个代码,我想知道是否有更简单的方法来重复它。我有大约60个,我会一直添加更多,所以如果有人能够帮助我找出一个循环或某个东西,这样我就不必手动添加每一个。其中每个链接都是下载的链接,所以我猜测我可能不得不使用变量名作为文件名。文件名01 Intro.mp3是告诉下载的地方,所以我猜测要做这个工作,我也必须将其改为变量名。重复PHP代码

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

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>"; 
      } 
     ?> 
+0

将它们保存在一个单独的文件中,并将它们包含在任何需要的位置 – 2013-05-03 04:53:36

+0

php,html,sql..all其中一个不好 – 2013-05-03 04:58:21

回答

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; 
} 

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

+0

我明白你的意思,并且我理解你的while循环代码。但是我不确定我应该如何设置数据库以使其按照您的方式工作。我是否需要设置不同的表格,因为现在所有变量都与用户名存储在同一个表中,以便我可以更新用户名所在的变量? – 2013-05-03 05:12:59

+0

如果变量设置为1,我该如何才能让它只显示下载链接 – 2013-05-03 05:15:09

+0

查询'$ resultstwo'的表是什么样的?从外观上看,表格中有一列叫做'intro'和'fightingfires'。我强烈建议创建一个管理您网站上可用音乐列表的单独表格。 – 2013-05-03 05:16:59

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>"; 
    } 
} 

,然后简单地从数据库,文件或只是一个阵列中恢复的价值观,你认为合适。

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>";   
} 

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

+0

您不应该在循环内执行数据库查询。 – Kao 2013-05-03 05:20:57

+0

我不想从海报的要求中更改代码。很明显,刚开始使用PHP,让我们保持简单。 – 2013-05-03 05:24:06

+0

他开始了,让我们教他如何做正确的事情。 – Kao 2013-05-03 05:27:15

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的。

+0

好吧,我想弄清楚如何实现这与其他答案 – 2013-05-03 05:44:32

+0

是的,这是绝对有效的,现在我只需要使它只工作,如果用户有变量设置为1 – 2013-05-03 05:46:28

+0

你能解释一点关于这个用户应该设置为1的值? – Kao 2013-05-03 05:47:20