0

私はこのコードを持っていますが、それを繰り返す簡単な方法があるかどうか知りたいです。私はこれらを約 60 個持っており、常にさらに追加する予定です。そのため、手動でそれぞれを追加する必要がないように、誰かがループなどを理解するのを手伝ってくれるとうれしいです. これらはそれぞれダウンロードへのリンクを作成しているため、おそらく変数名をファイル名として使用する必要があると思います。ファイル名 01 Intro.mp3 は、ダウンロードの場所を示すものであるため、これを機能させるには、それを変数名に変更する必要があると推測しています。

変数名を取得するために使用するコードを次に示します。

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

これが私が繰り返したいコードです。そのうちの2つを含めました。

<?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');

user テーブルが現在の形式に従っていると仮定します。

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

他の回答に基づいて、ループを実行してデータベースに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),

これにより、この 1 つのクエリのみを使用してすべての値が 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 に答える