PHP MYSQL - 根据行号是否匹配行号填充 HTML 表编号行

2024-04-08

所以,基本上我正在尝试制作数据中心驾驶室图。我们有一个 Excel 电子表格,但它不容易更新,也不容易搜索。我的 MySQL 数据库中有三个表;数据库是:机架,表格是:机柜、设备和数据中心 - 每个表格中的每一行代表它是什么。机柜表有一列指定其 U 高度(某些数据中心的某些机柜比其他机柜高)。所以,当php绘制一个柜子时,它会按照相应的高度绘制柜子。到目前为止,关于数据中心及其包含的机柜及其各自高度的分组一切正常。我的问题是,每个机柜似乎无法安装多于一台设备。这是整个页面,MySQL 数据库设置如下:

<SCRIPT LANGUAGE="JavaScript" type="text/javascript">
<!--
    function clickHandler(e)
    {
        var targetId, srcElement, targetElement;
        if (window.event) e = window.event; 
        srcElement = e.srcElement? e.srcElement: e.target;
        if (srcElement.className == "Outline")
        {
                targetId = srcElement.id + "d";
                targetElement = document.getElementById(targetId);

            if (targetElement.style.display == "none")
                {
                        targetElement.style.display = "";
                        srcElement.src = "images/minus.gif";
                    } 
            else
                {
                    targetElement.style.display = "none";
                    srcElement.src = "images/plus.gif";
                }
        }
    }
    document.onclick = clickHandler;
-->
</SCRIPT>
<noscript>You need Javascript enabled for this page to work correctly</noscript>
<?
function sql_conn()
{
    $username="root";
    $password="root";
    $database="racks";
    $server="localhost";

    @mysql_connect($server,$username,$password) or die("<h2 align=\"center\" class=\"red\">[<img src=\"images/critical.gif\" border=\"0\">] Unable to connect to $server [<img src=\"images/critical.gif\" border=\"0\">]</h2>");
    @mysql_select_db($database) or die("<h2 align=\"center\" class=\"red\">[<img src=\"images/critical.gif\" border=\"0\">] Unable to select $database as a database [<img src=\"images/critical.gif\" border=\"0\">]</h2>");
}

sql_conn();
$sql_datacenters="SELECT * FROM `datacenters`";

$sql_devices="SELECT * FROM `devices`";
$result_datacenters=mysql_query($sql_datacenters);
$result_devices=mysql_query($sql_devices);
$j=0;
echo "<table border='1' style='float:left;'>";
while ($datacenters_sqlrow=mysql_fetch_array($result_datacenters))
{
    echo "<tr><td>";
    echo "<h2 class='black' align='left'>";
    echo "<IMG SRC='images/plus.gif' ID='Out" . $j . "' CLASS='Outline' STYLE='cursor:hand;cursor:pointer'>"; // fancy icon for expanding-collapsing section
    echo " " . $datacenters_sqlrow['rack'] . ": " . $datacenters_sqlrow['cagenum'] . "</h2>"; // datacenter name and cage number
    echo "<div id=\"Out" . $j . "d\" style=\"display:none\">"; // opening of div box for section that is to be expanded-collapsed
    echo "<h3>" . $datacenters_sqlrow['notes'] . "</h3>"; // datacenter notes
    $sql_cabinets="SELECT * FROM `cabinets` WHERE `datacenter` = '$datacenters_sqlrow[0]' ORDER BY `cabinetnumber` ASC";
    $result_cabinets=mysql_query($sql_cabinets);
    while ($cabinets_sqlrow=mysql_fetch_array($result_cabinets))
    {
        $sql_devices="SELECT * FROM `devices` WHERE `datacenter` = '$datacenters_sqlrow[0]' AND `cabinet` = '$cabinets_sqlrow[1]' ORDER BY `ustartlocation` ASC";
        $result_devices=mysql_query($sql_devices);
        $num_devices=mysql_numrows($result_devices);
        echo "<table border='1' style='float:left;'>"; // opening of table for all cabinets in datacenter
        echo "<tr><td colspan='2' align='middle'>" . $cabinets_sqlrow[1] . "</td></tr>"; // cabinet number, spans U column and device name column
        while($row = mysql_fetch_array($result_devices))
        {
            $server = $row['devicename'];
            $ustart = $row['ustartlocation'];
        }
        for ($i = 0; $i < $cabinets_sqlrow[2]; $i++) // iterates through number of U in cabinet     
        {   
            $u = $cabinets_sqlrow[2] - $i; // subtracts current $i value from number of U in cabinet since cabinets start their numbers from the bottom up
            echo "<tr>";
            echo "<td width='15px' align='right'>$u</td>"; // U number
            echo "<td width='150px' align='middle'>";
            if ($u == $ustart) // determines if there is a device starting at this U
            {echo $server;} // device name
            else
            {echo "empty";} // empty space in cabinet
            echo "</td>";
            echo "</tr>";
        }
        $server="";
        $ustart="";

        echo "</table>"; // closes table opened in row 65
    }
    echo "</td></tr>";
    echo "</div>"; // close for div box that needs expanding-collapsing by fancy java
    $j++; // iteration for the fancy java expand-collapse
}
echo "</table>";
mysql_close();
?>

这是 MySQL 设置:

-- phpMyAdmin SQL Dump
-- version 3.5.1
-- http://www.phpmyadmin.net
--
-- Host: localhost
-- Generation Time: Nov 02, 2012 at 02:13 AM
-- Server version: 5.5.25
-- PHP Version: 5.4.4

SET SQL_MODE="NO_AUTO_VALUE_ON_ZERO";
SET time_zone = "+00:00";

--
-- Database: `racks`
--

-- --------------------------------------------------------

--
-- Table structure for table `cabinets`
--

CREATE TABLE `cabinets` (
  `id` tinyint(3) NOT NULL AUTO_INCREMENT,
  `cabinetnumber` varchar(25) NOT NULL,
  `numberofu` varchar(3) NOT NULL,
  `datacenter` tinyint(3) NOT NULL,
  KEY `id` (`id`)
) ENGINE=InnoDB  DEFAULT CHARSET=latin1 AUTO_INCREMENT=6 ;

--
-- Dumping data for table `cabinets`
--

INSERT INTO `cabinets` (`id`, `cabinetnumber`, `numberofu`, `datacenter`) VALUES
(1, '0101', '45', 2),
(2, '0102', '45', 2),
(3, '0101', '50', 1),
(4, '0102', '50', 1),
(5, '0103', '50', 1);

-- --------------------------------------------------------

--
-- Table structure for table `datacenters`
--

CREATE TABLE `datacenters` (
  `id` tinyint(3) NOT NULL AUTO_INCREMENT,
  `rack` varchar(20) NOT NULL,
  `cagenum` varchar(255) NOT NULL,
  `notes` longtext NOT NULL,
  KEY `id` (`id`)
) ENGINE=InnoDB  DEFAULT CHARSET=latin1 AUTO_INCREMENT=8 ;

--
-- Dumping data for table `datacenters`
--

INSERT INTO `datacenters` (`id`, `rack`, `cagenum`, `notes`) VALUES
(1, 'CAGE1', '', ''),
(2, 'CAGE2', '', ''),
(3, 'CAGE3', '', ''),
(4, 'CAGE4', '', ''),
(5, 'CAGE5', '', ''),
(6, 'CAGE6', '', ''),
(7, 'CAGE7', '', '');

-- --------------------------------------------------------

--
-- Table structure for table `devices`
--

CREATE TABLE `devices` (
  `id` int(10) NOT NULL AUTO_INCREMENT,
  `devicename` varchar(255) NOT NULL,
  `datacenter` varchar(255) NOT NULL,
  `cabinet` varchar(255) NOT NULL,
  `frontorrear` tinyint(3) NOT NULL,
  `ustartlocation` varchar(255) NOT NULL,
  `usize` varchar(255) NOT NULL,
  `spare1` varchar(255) NOT NULL,
  `spare2` varchar(255) NOT NULL,
  `spare3` varchar(255) NOT NULL,
  KEY `id` (`id`)
) ENGINE=InnoDB  DEFAULT CHARSET=latin1 AUTO_INCREMENT=4 ;

--
-- Dumping data for table `devices`
--

INSERT INTO `devices` (`id`, `devicename`, `datacenter`, `cabinet`, `frontorrear`, `ustartlocation`, `usize`, `spare1`, `spare2`, `spare3`) VALUES
(1, 'SERVER1', '1', '0101', 1, '33', '1', '', '', ''),
(2, 'SERVER2', '1', '0102', 1, '36', '1', '', '', ''),
(3, 'SERVER3', '1', '0101', 1, '40', '2', '', '', '');

为了直接解决这个问题(我稍后会详细介绍),您将迭代完整的设备列表并then- 循环完所有这些之后 - 您尝试显示它们。因此,您仅显示最终触摸的设备。

您当前的代码(被截断)是:

while($row = mysql_fetch_array($result_devices)) {
    $server = $row['devicename'];
    $ustart = $row['ustartlocation'];
}
for ($i = 0; $i < $cabinets_sqlrow[2]; $i++) {
    $u = $cabinets_sqlrow[2] - $i;
    ...
    if ($u == $ustart) {
        echo $server;
    }
    ...
}

如果我理解您要做什么,您需要将每个设备存储到“devices”数组中,并在每次迭代期间循环遍历它for环形。尝试类似的方法:

$devices = array();
while($row = mysql_fetch_array($result_devices)) {
    $devices[] = array(
        'server' => $row['devicename'],
        'ustart' => $row['ustartlocation']
    );
}
for ($i = 0; $i < $cabinets_sqlrow[2]; $i++) {
    ...
    $output = 'empty';
    foreach ($devices as $device) {
        if ($u == $device['ustart']) {
            $output = $device['server'];
            break;
        }
    }
    echo $output;
    ...
}

可以使用更优雅的方式来完成相同的任务ustartlocation作为数组的索引,但它需要ustartlocation对于单个设备/服务器来说是唯一的:

$devices = array();
while($row = mysql_fetch_array($result_devices)) {
    $devices[$row['ustartlocation']] = $row['devicename'];
}
for ($i = 0; $i < $cabinets_sqlrow[2]; $i++) {
    ...
    echo (isset($devices[$u]) ? $devices[$u] : 'empty');
    ...
}

此方法将不再需要每次循环遍历设备列表,但同样 - 它要求ustartlocation是独特的。

旁注(额外的、非特定答案的批评)

  1. 在代码的开头执行$sql_devices="SELECT * FROMdevices"; and $result_devices=mysql_query($sql_devices);,但永远不要使用这个对象。它可以而且应该被删除,因为它是一个额外的(相当重的)查询。

  2. 在第二while-loop 你有这条线$num_devices=mysql_numrows($result_devices);。没有 PHP 函数mysql_numrows(),我相信这是一个拼写错误mysql_num_rows() http://php.net/mysql_num_rows函数(或者你有一个自定义编写的函数来完成同样的事情。此外,$num_devices变量从未使用过,因此实际上可以完全删除该行。

  3. 你正在使用旧的和即将被弃用的mysql_函数(查看这些函数的任何文档页面顶部的警告消息;这里是mysql_connect() http://php.net/manual/en/function.mysql-connect.php以供参考)。我以及社区建议您升级到mysqli_ http://php.net/manual/en/book.mysqli.php or PDO http://php.net/manual/en/book.pdo.php方法。

  4. 您的代码容易出现未经清理的 SQL 错误,不仅限于 SQL 注入,因为您似乎没有直接从用户输入中获取输入,但也不排除此因素。例如,如果cabinet or datacenter值包含单引号?既然你正在使用mysql_方法,我建议你用以下方法包装每个方法mysql_real_escape_string() http://php.net/mysql_real_escape_string在数据库调用中使用它们之前:$sql_cabinets="SELECT * FROM cabinets WHERE datacenter = '" . mysql_real_escape_string($datacenters_sqlrow[0]) . "' ORDER BY cabinetnumber";

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

PHP MYSQL - 根据行号是否匹配行号填充 HTML 表编号行 的相关文章

随机推荐

  • Android蓝牙更改UUID后未发现特征

    我正在使用 Android 5 0 1 Lollipop 并开发蓝牙低功耗服务器 客户端通信 我有三星 Galaxy s4 我的定制服务具有三个特点 我将该特性的属性之一设置为只写和加密写入 然后我将其更改为非加密写入 写操作不再适用于此特
  • 使用 SSL 找不到证书路径的信任锚

    你好 我尝试在 Android 上与 SSL 握手 但收到此错误 10 21 15 39 33 279 W System err 500 javax net ssl SSLHandshakeException java security c
  • 在 Spring 3.2 和 Thymeleaf 2.1.3 中使用多个模板解析器来处理电子邮件

    我在定义 a 时遇到问题ClassLoaderTemplateResolver用于电子邮件和一个ServletContextTemplateResolver用于网络浏览量 我在尝试发送电子邮件时收到以下错误 HTTP Status 500
  • 关闭连接是最终确定最佳实践吗? [复制]

    这个问题在这里已经有答案了 可能的重复 为什么要实现finalize https stackoverflow com questions 158174 why would you ever implement finalize 我看到一些j
  • 将字符串转换为内存流 - 内存流不可扩展?

    我试图将一个字符串写入内存流 但失败并出现错误消息 Memory stream is not expandable 产生此问题的代码行 context Response Filter new System IO MemoryStream S
  • ViewPager onPageSelected 为第一页

    因此 当使用 ViewPager 时 不会为第一页调用 onPageSelected 侦听器 问题与this http code google com p android issues detail id 27526 我有一些逻辑为当前选定
  • Vim:突出显示每种文件类型的 TODO 一词

    我想在 vim 中突出显示 TODO 这个词 无论编辑什么文件 代码或普通文本 它目前适用于许多不同的语言 例如 默认情况下 TODO 在 C Java 注释中突出显示 但我将 vim 用于非代码文本文件 并且我希望看到它们也突出显示 TO
  • 使用 Hibernate 预防 SQL 注入

    我有一个现有的代码 其中应用程序根据许多条件生成不同的 sql 并通过 hibernate 会话 createSQLQuery 执行它们 在这里 参数与驻留在 java 类中的 sql 字符串连接 作为普通字符串替换 现在的问题是我需要防止
  • 运行 fatjar 时无法加载 log4j2

    我正在开发一个使用 log4j2 日志记录的项目 在 intellij 中开发时 一切正常 并且日志记录按预期完成 log4j2 xml 通过在启动时通过 intellij 设置传递给 jvm 的 java 属性进行链接 但是一旦我尝试运行
  • 如何在 GKE 上配置 Ingress 请求超时

    我目前在 GKE k8s 1 2 上配置了一个 Ingress 用于将请求转发到我的应用程序的 Pod 我有一个可能需要很长时间的请求 30秒 和我的应用程序超时 504 我观察到 这样做时 我收到的响应不是我自己的 504 而是来自看起来
  • 机架 Web 服务器和 https:教程?

    任何人都可以提供使用 Ruby RACK Web 服务器处理 https 和 installint 证书等设置的描述或教程的链接吗 Thanks Rack 不是网络服务器 它是网络服务器 如 Apache nginx 和应用程序中间件之间的
  • 我可以获得`FILE*`的访问模式吗?

    我必须复制一个FILE Mac OS X 上的 C 语言 使用 POSIXint不幸的是 文件描述符一直是不可能的 所以我想出了以下函数 static FILE fdup FILE fp const char mode int fd fil
  • iPhone X中为什么页面推送动画Tabbar上移

    我构建了一个应用程序演示 在推送动画中使用 hidesBottomBarWhenPushed 隐藏 Tabbar But When I click Jump Button Tabbar move up like this VoidLess
  • 用于具有数字签名的 WSSecurity 的 SOAPHandler

    我正在尝试在 java 中创建一个 Soap 客户端 我必须使用我的私钥对 Soap 消息进行签名 我正在使用得到回复SoapUI with WS Security配置 我已导入 WSDL 并使用生成的类wsimport 我创建了一个SOA
  • 要安装 OpenType 字体,Windows 有哪些要求?

    利基编程问题 我正在通过字节制作来开发 OpenType 字体 而不是使用 Fontlab 或 FontForge 等设计工具 现在有一个自定义 OpenType CFF 字体 它实现了 Basic Latin unicode 块的子集 特
  • 让宏定义为函数返回值是不好的做法吗?

    使用定义为有条件返回值的宏有一个缺点 即仅查看客户端代码可能会在宏处退出 这一点并不明显 我正在考虑的用例是编写值和错误检查 如下所示 define WRITE CHK file param if write that returns ze
  • POST 请求中的 %5B 和 %5D 代表什么?

    我正在尝试编写一个Java 类来登录某个网站 登录的POST请求中发送的数据是 user 5Blogin 5D username user 5Bpassword 5D 123456 我很好奇是什么 5B and 5D意味着在钥匙用户登录 我
  • AWS Redis 从外部连接

    有没有办法从外部 AWS 网络连接 AWS 上托管的 Redis 实例 我有一个基于 Windows 的 EC2 实例在 AWS 上运行 另一个是 Redis 缓存节点 我知道有人问过这个问题 但答案是在基于 Linux 的系统中 但我的是
  • 在 PL/SQL 存储过程中拆分逗号分隔的字符串

    我有 CSV 字符串 100 01 200 02 300 03 我需要将其传递给 Oracle 中的 PL SQL 存储过程 在过程中 我需要将这些值插入表中的数字列中 为此 我从这里得到了一个工作方法 如何在 oracle 9i 中最好地
  • PHP MYSQL - 根据行号是否匹配行号填充 HTML 表编号行

    所以 基本上我正在尝试制作数据中心驾驶室图 我们有一个 Excel 电子表格 但它不容易更新 也不容易搜索 我的 MySQL 数据库中有三个表 数据库是 机架 表格是 机柜 设备和数据中心 每个表格中的每一行代表它是什么 机柜表有一列指定其