Để trực tiếp giải quyết vấn đề (tôi sẽ đi sâu hơn vào một chút), bạn đang xem qua danh sách đầy đủ các thiết bị và sau đó - sau khi bạn hoàn thành việc lặp lại tất cả - bạn cố gắng hiển thị chúng. Do đó, bạn chỉ hiển thị thiết bị cuối cùng đã được chạm vào.
Mã hiện tại của bạn, bị cắt ngắn, là:
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;
}
...
}
Nếu tôi hiểu bạn đang cố gắng làm gì, bạn sẽ cần lưu trữ từng thiết bị vào một mảng "thiết bị" và lặp lại nó trong mỗi lần lặp lại for
vòng. Hãy thử một cái gì đó như:
$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;
...
}
Một cách thanh lịch hơn để hoàn thành nhiệm vụ tương tự này có thể được thực hiện bằng cách sử dụng ustartlocation
là chỉ mục của mảng, nhưng nó sẽ yêu cầu ustartlocation
là duy nhất cho một thiết bị / máy chủ riêng lẻ:
$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');
...
}
Phương pháp này sẽ loại bỏ nhu cầu lặp lại danh sách thiết bị mỗi lần, nhưng một lần nữa - nó yêu cầu ustartlocation
là duy nhất.
Ghi chú bên lề (phê bình bổ sung, không có câu trả lời cụ thể)
-
Ở phần đầu của mã, bạn thực thi
$sql_devices="SELECT * FROM
thiết bị";
và$result_devices=mysql_query($sql_devices);
, nhưng không bao giờ sử dụng đối tượng này. Có thể và nên xóa nó vì nó là một truy vấn bổ sung (khá nặng). -
Trong
while
thứ hai -loop bạn có dòng$num_devices=mysql_numrows($result_devices);
. Không có PHP-functionmysql_numrows()
, Tôi tin rằng đây là lỗi đánh máy chomysql_num_rows()
function (đó, hoặc bạn có một hàm được viết tùy chỉnh để làm điều tương tự. Ngoài ra,$num_devices
biến không bao giờ được sử dụng nên dòng này thực sự có thể bị xóa hoàn toàn. -
Bạn đang sử dụng
mysql_
cũ và không còn được dùng nữa chức năng (kiểm tra thông báo cảnh báo trên đầu bất kỳ trang tài liệu nào cho các chức năng này; đây làmysql_connect()
để tham khảo). Tôi cũng như cộng đồng khuyên bạn nên nâng cấp lênmysqli_
hoặcPDO
phương pháp. -
Mã của bạn mở cho các lỗi SQL không được bảo vệ, không giới hạn cụ thể đối với SQL-injection vì nó không có vẻ như bạn đang lấy đầu vào trực tiếp từ người dùng nhập, nhưng cũng không loại trừ yếu tố này. Ví dụ:điều gì sẽ xảy ra nếu một
cabinet
hoặcdatacenter
giá trị chứa một dấu ngoặc kép? Vì bạn đang sử dụngmysql_
, tôi khuyên bạn nên bọc mỗi phương thức bằngmysql_real_escape_string()
trước khi sử dụng chúng trong các cuộc gọi cơ sở dữ liệu:$sql_cabinets="SELECT * FROM cabinets WHERE datacenter = '" . mysql_real_escape_string($datacenters_sqlrow[0]) . "' ORDER BY cabinetnumber";