所以,基本上我正在尝试制作数据中心驾驶室图。我们有一个 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', '', '', '');
最佳答案
为了直接解决问题(我稍后会详细介绍),您正在遍历完整的设备列表,然后 - 在您完成所有循环之后 -你试图展示它们。因此,您仅显示被触摸的最终设备。
您当前的代码被截断后是:
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;
}
...
}
如果我理解您要执行的操作,您需要将每个设备存储到“设备”数组中,并在 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 是唯一的。
旁注(附加的、非特定答案的评论)
在代码的开头执行 $sql_devices="SELECT * FROMdevices"; 和 $result_devices=mysql_query($sql_devices) ;,但永远不要使用这个对象。它可以而且应该被删除,因为它是一个额外的(相当繁重的)查询。
在第二个 while 循环中,您有行 $num_devices=mysql_numrows($result_devices);。没有 PHP 函数 mysql_numrows(),我认为这是 mysql_num_rows() 的拼写错误函数(即,或者您有自定义编写的函数来执行相同的操作。此外,从未使用过 $num_devices 变量,因此实际上可以完全删除这一行。
您正在使用旧的和即将弃用的 mysql_ 函数(查看这些函数的任何文档页面顶部的警告消息;这里是 mysql_connect()以供引用)。我和社区建议您升级到 mysqli_或 PDO方法。
您的代码对未清理的 SQL 错误开放,并不特别限于 SQL 注入(inject),因为您似乎没有直接从用户输入中获取输入,但也不排除这个因素。例如,如果 cabinet 或 datacenter 值包含单引号会怎样?由于您使用的是 mysql_ 方法,我建议您用 mysql_real_escape_string() 包装每个方法在数据库调用中使用它们之前:$sql_cabinets="SELECT * FROM cabinets WHERE datacenter = '"。 mysql_real_escape_string($datacenters_sqlrow[0]) 。 "'ORDER BY 柜号";
关于PHP MYSQL - 根据行号是否匹配填充 HTML 表编号行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13187927/
给定这段代码defcreate@upgrades=User.update_all(["role=?","upgraded"],:id=>params[:upgrade])redirect_toadmin_upgrades_path,:notice=>"Successfullyupgradeduser."end我如何在该操作中实际验证它们是否已保存或未重定向到适当的页面和消息? 最佳答案 在Rails3中,update_all不返回任何有意义的信息,除了已更新的记录数(这可能取决于您的DBMS是否返回该信息)。http://ar.ru
我想将html转换为纯文本。不过,我不想只删除标签,我想智能地保留尽可能多的格式。为插入换行符标签,检测段落并格式化它们等。输入非常简单,通常是格式良好的html(不是整个文档,只是一堆内容,通常没有anchor或图像)。我可以将几个正则表达式放在一起,让我达到80%,但我认为可能有一些现有的解决方案更智能。 最佳答案 首先,不要尝试为此使用正则表达式。很有可能你会想出一个脆弱/脆弱的解决方案,它会随着HTML的变化而崩溃,或者很难管理和维护。您可以使用Nokogiri快速解析HTML并提取文本:require'nokogiri'h
我正在使用的第三方API的文档状态:"[O]urAPIonlyacceptspaddedBase64encodedstrings."什么是“填充的Base64编码字符串”以及如何在Ruby中生成它们。下面的代码是我第一次尝试创建转换为Base64的JSON格式数据。xa=Base64.encode64(a.to_json) 最佳答案 他们说的padding其实就是Base64本身的一部分。它是末尾的“=”和“==”。Base64将3个字节的数据包编码为4个编码字符。所以如果你的输入数据有长度n和n%3=1=>"=="末尾用于填充n%
在我的应用程序中,我需要能够找到所有数字子字符串,然后扫描每个子字符串,找到第一个匹配范围(例如5到15之间)的子字符串,并将该实例替换为另一个字符串“X”。我的测试字符串s="1foo100bar10gee1"我的初始模式是1个或多个数字的任何字符串,例如,re=Regexp.new(/\d+/)matches=s.scan(re)给出["1","100","10","1"]如果我想用“X”替换第N个匹配项,并且只替换第N个匹配项,我该怎么做?例如,如果我想替换第三个匹配项“10”(匹配项[2]),我不能只说s[matches[2]]="X"因为它做了两次替换“1fooX0barXg
如何匹配未被反斜杠转义的平衡定界符对(其本身未被反斜杠转义)(无需考虑嵌套)?例如对于反引号,我试过了,但是转义的反引号没有像转义那样工作。regex=/(?!$1:"how\\"#expected"how\\`are"上面的正则表达式不考虑由反斜杠转义并位于反引号前面的反斜杠,但我愿意考虑。StackOverflow如何做到这一点?这样做的目的并不复杂。我有文档文本,其中包括内联代码的反引号,就像StackOverflow一样,我想在HTML文件中显示它,内联代码用一些spanMaterial装饰。不会有嵌套,但转义反引号或转义反斜杠可能出现在任何地方。
这个问题在这里已经有了答案:Checktoseeifanarrayisalreadysorted?(8个答案)关闭9年前。我只是想知道是否有办法检查数组是否在增加?这是我的解决方案,但我正在寻找更漂亮的方法:n=-1@arr.flatten.each{|e|returnfalseife
在我的Controller中,我通过以下方式在我的index方法中支持HTML和JSON:respond_todo|format|format.htmlformat.json{renderjson:@user}end在浏览器中拉起它时,它会自然地以HTML呈现。但是,当我对/user资源进行内容类型为application/json的curl调用时(因为它是索引方法),我仍然将HTML作为响应。如何获取JSON作为响应?我还需要说明什么? 最佳答案 您应该将.json附加到请求的url,提供的格式在routes.rb的路径中定义。这
所以我在关注Railscast,我注意到在html.erb文件中,ruby代码有一个微弱的背景高亮效果,以区别于其他代码HTML文档。我知道Ryan使用TextMate。我正在使用SublimeText3。我怎样才能达到同样的效果?谢谢! 最佳答案 为SublimeText安装ERB包。假设您安装了SublimeText包管理器*,只需点击cmd+shift+P即可获得命令菜单,然后键入installpackage并选择PackageControl:InstallPackage获取包管理器菜单。在该菜单中,键入ERB并在看到包时选择
我有一个用户工厂。我希望默认情况下确认用户。但是鉴于unconfirmed特征,我不希望它们被确认。虽然我有一个基于实现细节而不是抽象的工作实现,但我想知道如何正确地做到这一点。factory:userdoafter(:create)do|user,evaluator|#unwantedimplementationdetailshereunlessFactoryGirl.factories[:user].defined_traits.map(&:name).include?(:unconfirmed)user.confirm!endendtrait:unconfirmeddoenden
我有一个包含多个键的散列和一个字符串,该字符串不包含散列中的任何键或包含一个键。h={"k1"=>"v1","k2"=>"v2","k3"=>"v3"}s="thisisanexamplestringthatmightoccurwithakeysomewhereinthestringk1(withspecialcharacterslike(^&*$#@!^&&*))"检查s是否包含h中的任何键的最佳方法是什么,如果包含,则返回它包含的键的值?例如,对于上面的h和s的例子,输出应该是v1。编辑:只有字符串是用户定义的。哈希将始终相同。 最佳答案