从两个SQL表创建一个带有标题的HTML表

问题描述:

我想创建一个使用PHP和MySQL的简单文件上传系统。从两个SQL表创建一个带有标题的HTML表

文件表

+---+------------------+--------------+ 
| # |  Name  |  Type  | 
+---+------------------+--------------+ 
| 1 | file_id   | int   | 
| 2 | file_name  | varchar  | 
| 3 | file_size  | int   | 
| 4 | file_type  | varchar  | 
| 5 | folder   | int   |Foreign Key to folders.folder_id 
| 6 | user_Id   | int   | 
| 7 | upload_time  | timestamp | 
| 8 | modify_time  | timestamp | 
+---+------------------+--------------+ 

文件夹表

+---+------------------+--------------+ 
| # |  Name  |  Type  | 
+---+------------------+--------------+ 
| 1 | folder_id  | int   | 
| 2 | name    | varchar  | 
| 3 | subfolder  | int   | 
+---+------------------+--------------+ 

档案查询

SELECT * 
FROM files 
     JOIN folders 
     ON folders.folder_id = files.folder 
ORDER BY folders.subfolder ASC, 
      folders.folder_id ASC 
:我在下面的结构创建了一个数据库包含两个表个

夹查询

SELECT * FROM folders 

的表都呼应到HTML表格。为此,我有两个查询运行分开进行,一个回显文件夹并将它们显示在表格上,另一个回显文件并将它们列出在文件夹列表下方。

而不是列出所有文件夹,然后列出所有文件,我希望这些文件列在相关文件夹下。

这是目前是如何显示我的表:

Table Heading 
------------- 
folder 
folder2 
folder3 
file1 
file2 
file3 
file4 

这是我希望它是:

Table Heading 
------------- 
folder 
file1 
file2 
folder2 
file3 
folder3 
file4 
+0

那么...什么似乎是问题? – Anand

+0

那么你认为你的SQL不安全? – RiggsFolly

+0

注意:'phpMyAdmin'是一个用PHP编写的工具,可以让您更轻松地维护您的MYSQL数据库。 MYSQL是DBMS – RiggsFolly

Prepared statements被设计在循环中被执行多次,这是一个很好的例子:

<?php 
// prepare the statement for use later 
$folderId = 0; 
$stmt = $connectionUploads->prepare("SELECT * FROM files WHERE folder = ?"); 
$stmt->bind_param("i", $folderId); 

$queryGetFolders = "SELECT * FROM folders"; 
$resultGetFolders = mysqli_query($connectionUploads, $queryGetFolders); 

if ($resultGetFolders->num_rows != 0) { 
    // loop through the folder list 
    while ($rowFolders = $resultGetFolders->fetch_assoc()) { 
     $folderName = ucwords($rowFolders['name']); 
     echo "<h1>$folderName</h1>"; 

     // put the new value in $folderId 
     $folderId = $rowFolders['folder_id']; 
     // execute the query 
     $stmt->execute(); 
     $resultGetFiles = $stmt->get_result(); 
     if ($resultGetFiles->num_rows == 0) { 
      echo "<p>No files</p>"; 
     else { 
      // loop through the results as normal 
      while ($rowFiles = $resultGetFiles->fetch_assoc()) { 
       echo "<p>$rowFiles[file_name]</p>"; 
      } 
     } 
    } 
} 

注意没有固有的安全性conc使用“普通”数据库查询来运行。将用户提供的输入添加到查询字符串时出现问题。然后准备好的陈述是必须的。在循环查询时,除了减少开销(如上所述)之外,他们还自动清理用户输入。

+0

完美:)砸了它非常感谢你! –

+0

没问题。还有一点需要注意的是,不要从功能上“回声”。让函数'返回'一个值,无论函数什么样的调用都可以'回显'那个。理想情况下,你的函数返回一个你可以使用的表单的原始数据,然后你的视图变成一个模板来填充这些数据。 – miken32

+0

这是有道理的,然而,当我的函数内的回声​​改变返回时,它显示了很多数据缺失,是因为我有多个返回,其中只有一个实际返回? –

你可以尝试创建两个PHP函数调用各种数据库表,例如

function fetch($query){ 

    while($row = $query->fetch_array(MYSQLI_ASSOC)){ 
     $result[] = $row; 
    } 

    return $result; 
} 

function getArray($a, $b, $c, $d){ 
    $array = mysqli_fetch_array(mysqli_query($a, "SELECT * FROM $b WHERE $c = '$d' ORDER BY $c DESC LIMIT 1")); 
    return $array; 
} 

然后使用foreach迭代器取得associative array每个文件,然后使用folder列,你可以能够得到找到文件的每个文件夹的数组。