1

MySQLデータベースの個々のレコードをナビゲートするための何らかのページネーション/機能を実装しようとしている単純なプログラムがあります。コード自体は、連想配列を返す関数を呼び出します。これにより、連続していないインデックスが削除によって作成された場合に、レコードを順番にナビゲートできるようになります。

function getKeys($handle, $user, $password) {

    try {

         $conn = new PDO($handle,$user,$password);
         $conn -> setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

        }

    catch(PDOException $e) {
        echo "Error connectiong to database. Error: (" . $e -> getMessage() . ")";

    }

    $sql = "Select Workstation_ID from Workstation"; 

    $result = $conn -> query($sql);
    $resultArray = array();

    while ( $row = $result -> fetch()) {

        $resultArray[] = $row;
    }

    $conn = null;

    return $resultArray; } 

この関数の結果を変数に格納しようとしており、そこから他の関数​​で使用するためにその変数をインクリメントしようとしています:

    $Keys = getKeys($dsn,$un,$pw);

    $i = 0;

    $currID = $Keys[$i][0];

    $row = getResultSet($dsn,$un,$pw,$currID); 

次に、$row を使用して現在のワークステーションを表示します。

    echo "<hr class='viewHR'>";
    echo "</br></br><div class='viewFormat'>";
    echo "<form name = 'updateWorkstationForm' action ='updateWorkstation.php' method  ='post'>";
    echo "<b>Workstation Name:</b><br><input type = 'Textbox' name = 'pcName' value = '" . $row['Workstation_Name'] . "'/></br>";
    echo "<b>Serial Number: </b><br> <input type = 'Textbox' name = 'SN' value = '" . $row['Serial_Number'] . "'/></br>";

    echo "<b>Model</b></br>";

    echo "<select name ='modelSelect'>";
    echo "<option value = '".$row['Model_ID'] . "'>" .  $row['Model'] . "</option>";
    echo "</select></br>";

    echo "<b>Department</b></br>";
    echo "<select name ='DepartmentSelect'>";
    echo "<option value = '".$row['Department_ID'] . "'>" .  $row['Department'] . "   </option>";
    echo "</select></br>";

私はこれについて完全に間違っていたのでしょうか、それともファイル全体のアンカータグまたはボタンをクリックして各レコードを表示するために配列のインデックスをインクリメントする方法は次のようになるのだろうかと思っていました:

<html>
<body>
    <div>
        <?php

            $un = "xxx";
            $pw = "xxxxxx";
            $dsn = "mysql:host=127.0.0.1;dbname=xxxxxxxxxxx";

            $Keys = getKeys($dsn,$un,$pw);

            $i = 0;

            $currID = $Keys[$i][0];

            $row = getResultSet($dsn,$un,$pw,$currID); 

            echo "<hr class='viewHR'>";
            echo "</br></br><div class='viewFormat'>";
            echo "<form name = 'updateWorkstationForm' action ='updateWorkstation.php' method = 'post'>";
            echo "<b>Workstation Name:</b><br> <input type = 'Textbox' name = 'pcName' value = '" . $row['Workstation_Name'] . "'/></br>";
            echo "<b>Serial Number: </b><br> <input type = 'Textbox' name = 'SN' value = '" . $row['Serial_Number'] . "'/></br>";

            echo "<b>Model</b></br>";
            echo "<select name ='modelSelect'>";
            echo "<option value = '".$row['Model_ID'] . "'>" .  $row['Model'] . "</option>";
            echo "</select></br>";

            echo "<b>Department</b></br>";
            echo "<select name ='DepartmentSelect'>";
            echo "<option value = '".$row['Department_ID'] . "'>" .  $row['Department'] . "</option>";
            echo "</select></br>";

            echo "<b>Room</b></br>";
            echo "<select name ='RoomSelect'>";
            echo "<option value = '".$row['Room_ID'] . "'>" .  $row['Room'] . "</option>";
            echo "</select></br>";

            echo "<b>Property Status</b> </br>";
            echo "<select name = 'propertyStatus'>";
            echo "<option value = '".$row['Property_Status_ID'] . "'>" .  $row['Property_Status'] . "</option>";
            echo "</select></br>";

            if ($row['Property_Status'] != "Owned"){
                echo "<b>Lease Company:</b> ";
                echo "<select name = leaseSelect>";
                echo "<option value = '" . $row['Lease_Info_ID'] ."'>Company:" . $row['Company'] . ", Start: " . $row['Start_Date'] . "End: " .$row['End_Date'] . "</option>";
                echo "</select></br>";
            }

            echo "<b>Cart</b></br>";
            echo "<select name ='cartSelect'>";
            echo "<option value = '".$row['Cart_ID'] . "'>" .  $row['Cart_Type'] . "</option>";
            echo "</select></br>";

            echo "<b>Workstation Comments: </b><br> <Textarea rows='5' cols='60' name = 'wsComments'> ". $row['Workstation_Comment'] . " </Textarea></br>";

            echo "<b>Location Comments: </b><br> <Textarea rows='5' cols='60' name = 'locComments'> ". $row['Workstation_Comment'] . " </Textarea></br>";
            echo "<input type = 'submit' value = 'Update' />";
            echo "<input type = 'button' value = 'Cancel' onclick = 'location.reload(this);' />";
            echo "</form>";
            echo "</div>"; 

            /*Function to return a parallel array. This is so that non-sequential records in the database may be described sequentially with the help of an array's indices*/
            function getKeys($handle, $user, $password) {

                try {

                    $conn = new PDO($handle,$user,$password);
                    $conn -> setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
                }

                catch(PDOException $e) {

                    echo "Error connectiong to database. Error: (" . $e -> getMessage() . ")";
                }

                $sql = "Select Workstation_ID from Workstation"; 

                $result = $conn -> query($sql);
                $resultArray = array();

                while ( $row = $result -> fetch()) {

                    $resultArray[] = $row;
                }

                $conn = null;

                return $resultArray; 
            }


            function getResultSet($handle, $user, $password, $ID) {

                $resultSet = "";

                try {

                    $conn = new PDO($handle,$user,$password);
                    $conn -> setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
                }

                catch(PDOException $e) {

                    echo "Error connectiong to database. Error: (" . $e -> getMessage() . ")";
                }

                $sql = "Select Workstation.Workstation_ID,Workstation.Model_ID,Workstation.Property_Status_ID,workstation.Lease_Info_ID, Workstation.Workstation_Name, Workstation.Serial_Number, Model.Model, Department.Department,Room.Room,Property_Status.Property_Status,Lease_Info.Start_Date,Lease_Info.End_Date,Lease_Info.Company,Lease_Info.Lease_Comment,Cart.Cart_Type,Workstation.Workstation_Comment,Workstation.Location_Comment from Workstation INNER JOIN Model ON Workstation.Model_ID = Model.Model_ID  INNER JOIN Department ON Workstation.Department_ID = Department.Department_ID INNER JOIN Room ON Workstation.Room_ID = Room.Room_ID INNER JOIN Property_Status ON Workstation.Property_Status_ID = Property_Status.Property_Status_ID INNER JOIN Lease_Info ON Workstation.Lease_Info_ID = Lease_Info.Lease_Info_ID INNER JOIN Cart ON Workstation.Cart_ID = Cart.Cart_ID where Workstation_ID = :ID"; 

                $pstmt = $conn -> prepare($sql);

                if(!$pstmt) {
                    echo "Error preparing the statement. Error: (" . $conn -> ErrorInfo() . ")";
                }

                $pstmt -> bindParam(':ID', $ID);

                try {

                    $pstmt -> execute();
                }

                catch(PDOException $e) {

                    echo "Failed to execute prepared Statement. Error:  (" . $e -> getmessage() . ")";
                }

                $resultSet = $pstmt -> fetch();

                return $resultSet;

                $conn = null;
            }
        ?>  

    </div>
</body>
</html>

批判、洞察、または指針は大歓迎です。

4

1 に答える 1

2

サブセットのみ、または 1 つだけを表示する場合は、すべてのレコードをフェッチするべきではありません。

ページネーションするには、LIMIT句を使用します。したがって、レコードを 10 個のページに分割する場合、最初のページを取得するクエリは次のようになります。

SELECT * FROM workstations LIMIT 0,10

最初の数字はオフセットで、2 番目の数字は取得するオフセットの後のレコード数です。2 番目のページを取得するには、 limit 句をLIMIT 10,10;に変更します。3 番目のページをフェッチするLIMIT 20,10など。PHP の式は次のとおりです。

$offset = (($page - 1) * $records_per_page);

ページの値は、 http://www.example.com/?page=1$_GETのような変数から取得できます。

次に、1 つのレコードのみを表示する場合は、そのレコードをフェッチします。

SELECT * FROM workstations WHERE id = ? LIMIT 1

パラメータを介して ID を再度渡し、$_GETPDO を使用して ID をバインドし、SQL インジェクションの脆弱性を回避します。

<?php

$sql = "SELECT * FROM workstations WHERE id = :id LIMIT 1";

$sth = $db->prepare($sql);
$sth->bindParam(':id', $_GET['id'], PDO::PARAM_INT);
$sth->execute();
$row = $sth->fetchObject();
于 2013-03-04T21:30:42.630 に答える