sql >> データベース >  >> RDS >> Mysql

PHP MYSQL-行番号と一致するかどうかに基づいて、HTMLテーブルの番号が付けられた行にデータを入力します

    問題に直接対処するために(後で詳しく説明します)、デバイスの完全なリストを繰り返し処理してから、 -それらすべてをループした後-あなたはそれらを表示しようとします。このため、タッチされた最後のデバイスのみが表示されます。

    切り捨てられた現在のコードは次のとおりです。

    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が必要です。 ユニークです。

    サイドノート (追加の、回答に固有ではない批評)

    1. コードの先頭で、 $ sql_devices ="SELECT * FROMを実行します。 デバイス"; および$result_devices =mysql_query($ sql_devices); 、ただし、このオブジェクトは使用しないでください。余分な(かなり重い)クエリが1つあるため、削除することができ、削除する必要があります。

    2. 2番目のwhile - $ num_devices =mysql_numrows($ result_devices);という行があるループ 。 PHP関数はありませんmysql_numrows() 、これは mysql_num_rows()のタイプミスだと思います 関数(または、同じことを行うためのカスタム作成された関数があります。また、 $ num_devices 変数は使用されないため、この行は実際には完全に削除される可能性があります。

    3. 古くて廃止されたmysql_を使用しています 関数(これらの関数のドキュメントページの上部にある警告メッセージを確認してください。ここに mysql_connect() 参考のため)。私とコミュニティは、 mysqli_<にアップグレードすることをお勧めします。 / code> または PDO メソッド。

    4. コードは、サニタイズされていないSQLエラーにさらされています。特に、ユーザー入力から直接入力を取得しているようには見えないため、SQLインジェクションに限定されませんが、この要因を排除することもできません。たとえば、キャビネットの場合はどうなりますか? またはdatacenter 値に一重引用符が含まれていますか? mysql_を使用しているため メソッドについては、それぞれを mysql_real_escape_string()でラップすることをお勧めします。 データベース呼び出しでそれらを使用する前に: $ sql_cabinets ="SELECT*FROMキャビネットWHEREdatacenter='"。 mysql_real_escape_string($ datacenters_sqlrow [0])。 "'ORDERBYキャビネット番号";




    1. スーパーバイザー階層のリストを取得するためのSQLクエリ。従業員->スーパーバイザー->スーパーバイザー

    2. MySql-重複キー挿入時

    3. SQLクエリで親のカテゴリテーブルに参加するにはどうすればよいですか?

    4. Microsoft Accessテーブルのヒント–秘訣とガイドラインパート2