2013-05-03 143 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