問題に直接対処するために(後で詳しく説明します)、デバイスの完全なリストを繰り返し処理してから、 -それらすべてをループした後-あなたはそれらを表示しようとします。このため、タッチされた最後のデバイスのみが表示されます。
切り捨てられた現在のコードは次のとおりです。
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 * FROM
を実行します。 デバイス";コード> および
$result_devices =mysql_query($ sql_devices);
、ただし、このオブジェクトは使用しないでください。余分な(かなり重い)クエリが1つあるため、削除することができ、削除する必要があります。 -
2番目の
while
-$ num_devices =mysql_numrows($ result_devices);
という行があるループ 。 PHP関数はありませんmysql_numrows()
、これはmysql_num_rows()
のタイプミスだと思います 関数(または、同じことを行うためのカスタム作成された関数があります。また、$ num_devices
変数は使用されないため、この行は実際には完全に削除される可能性があります。 -
古くて廃止された
mysql_
を使用しています 関数(これらの関数のドキュメントページの上部にある警告メッセージを確認してください。ここにmysql_connect()
参考のため)。私とコミュニティは、mysqli_<にアップグレードすることをお勧めします。 / code>
またはPDO
メソッド。 -
コードは、サニタイズされていないSQLエラーにさらされています。特に、ユーザー入力から直接入力を取得しているようには見えないため、SQLインジェクションに限定されませんが、この要因を排除することもできません。たとえば、
キャビネット
の場合はどうなりますか? またはdatacenter
値に一重引用符が含まれていますか?mysql_
を使用しているため メソッドについては、それぞれをmysql_real_escape_string()
でラップすることをお勧めします。 データベース呼び出しでそれらを使用する前に:$ sql_cabinets ="SELECT*FROMキャビネットWHEREdatacenter='"。 mysql_real_escape_string($ datacenters_sqlrow [0])。 "'ORDERBYキャビネット番号";