如何在PHP / SQL驱动的文件镜像上处理多个版本的文件?

这是我第一次使用
PHP或SQL.

我正在创建一个简单的网站,其中包含应用程序以及它们的名称,作者,版本,描述等.PHP脚本从我创建的MySQL数据库中获取此信息.每个应用都有一个分配给它的唯一标识符.多个版本将重用相同的标识符.

我已经让它显示只有一个版本的条目.

然而…

当发布应用程序的更新版本时,我希望它在最新版本旁边的下拉列表中列出旧版本(只是链接到旧版本链接的版本号).我假设我想出了一种方法来显示它很好,因此当我向数据库添加应用程序的更新版本时,我留下了没有变化的东西(如名称,作者,描述) ,给它与旧版本相同的标识符,只添加了较新的版本号和较新版本的文件名.有关示例,请参见here.

但是,我认为错了.

我不知道如何继续.我有一个问题:

SELECT * FROM apps WHERE identifier IN ( SELECT identifier FROM apps GROUP BY identifier HAVING count(*) > 1)

但是,这仅选择具有重复“标识符”的所有条目.我不知道如何通过循环运行它,以回显旧条目的描述/名称,但更新条目的版本号/链接(同时也能够回显我的下拉列表的旧版本号/链接).哦,并且它也不会为具有重复标识符但与其他应用程序的标识符不同的应用程序分配名称/描述/等.对不起,这很难解释.

我当前的循环,这是:

$result=mysqli_query($connection,$query);
$num=mysqli_num_rows($result);
$i=0;while ($i < $num) {while ($row = mysqli_fetch_array($result))  {
            // do stuff (echo)
                    } ;$i++;};

只是回应条目,一个是旧版本,一个是新版本(没有显示描述,名称或作者).

我该怎么办?

最佳答案 这样的事情怎么样:

您可以从表中选择所有数据,按标识符排序,然后按版本排序.查询类似于:

--                              ↓ orders data by identifier, thereby 'grouping' together records with the same identifier
SELECT * FROM apps ORDER BY identifier, version DESC
--                                           ↑ orders each 'group' by version number descending - highest / 'newest' first

然后,从这些数据中,您可以在PHP中创建一个数组结构,使您可以轻松地遍历数据.类似于以下内容:

$result = mysqli_query($connection,$query);
$apps = array(); // Create apps array

while ($row = mysqli_fetch_array($result))  {
    // Assign the Name, Description, Author of the row
    // These will be blank until the last (oldest version) which has these values
    // $app[$row[1]] will create a key for each identifier or use the existing one
    $apps[$row[1]]["name"] = $row[2];
    $apps[$row[1]]["description"] = $row[3];
    $apps[$row[1]]["author"] = $row[4];

    // If there is no current version stored
    if(empty($apps[$row[1]]["current_version"])){
        $apps[$row[1]]["current_version"]["version"] = $row[5];
        $apps[$row[1]]["current_version"]["source"] = $row[6];
        $apps[$row[1]]["current_version"]["filename"] = $row[7];
    } else { // If not, this means this row is an older version 
        $v = array(
            "version" => $row[5],
            "source" => $row[6],
            "filename" => $row[7],
        );
        $apps[$row[1]]["older_versions"][] = $v; // Add the array to the older_versions array
    }
}    

然后生成以下数组结构:

Array
(
    [vitashell] => Array
        (
            [name] => VitaShell
            [description] => VitaShell is an alternative replacement...
            [author] => TheFloW
            [current_version] => Array
                (
                    [version] => 0.86
                    [source] => http://www.example.com/link/version/0_86
                    [filename] => vitashell_0_86.vpk
                )

            [older_versions] => Array
                (
                    [0] => Array
                    (
                        [version] => 0.8
                        [source] => http://www.example.com/link/version/0_8
                        [filename] => vitashell_0_8.vpk
                    )
            )
    )

    [identifier] => Array (...)
)

然后,您可以使用几个foreach循环来遍历$apps阵列,根据需要打印出数据.

我做了一个打印出数据的简单例子.出于显示目的,我向数据集添加了一些虚拟行:

<?php foreach($apps as $app){ ?>
    <div class="app">
        Name: <?php echo $app["name"]; ?><br />
        Description: <?php echo $app["description"]; ?> <br />
        Author: <?php echo $app["author"]; ?> <br />
        Version: <a href="<?php echo $app["current_version"]["source"]; ?>"><?php echo $app["current_version"]["version"]; ?></a> <br />

        <?php if(!empty($app["older_versions"])){ ?>
        Older Versions:
        <select name="older_versions">
            <?php foreach($app["older_versions"] as $version){ ?>
            <option value="<?php echo $version["source"] ?>"><?php echo $version["version"]; ?></option>
            <?php } ?>
        </select>
        <?php } ?>
    </div>
    <hr>
<?php } ?>

这创造了:

《如何在PHP / SQL驱动的文件镜像上处理多个版本的文件?》

注意:“TIMSTUFF”只有1个版本,因此旧版本没有下拉列表

点赞