0

php/mysql を使用してストレージ ログ アプリケーションに取り組んでいますが、すべてを結び付けるはずの SQL クエリに問題があります。

基本的に、このプログラムを使用すると、ユーザーはさまざまなフィールド (id#、プロジェクト名、顧客名、測定単位など) を使用してプロジェクトに入力できます。プロジェクトが作成されると、ストレージ ログ ページ (以下にコードがリストされているページ) に、それらのプロジェクトごとに個別の HTML テーブルが表示されます。これらの各テーブルの下部にはフォームがあり、ユーザーはストレージ イン/アウト トランザクションを送信できます。送信時に、トランザクションがデータベースに追加され、プログラムはストレージ ログ ページにリダイレクトされます。

ここで、ログ ページを設計して、各トランザクションが対応するテーブルに表示されるようにします。したがって、ID 番号が「15」のプロジェクトがある場合、プロジェクト 15 の HTML テーブルで、そのプロジェクトの各トランザクションをそのテーブルの独自の行に表示する必要があります。ただし、移動 ID が「14」の場合、プロジェクト #14 のテーブルにのみトランザクションを表示したいと考えています。

これが私のコードです:

<?php
 $script = '<script> 
 $(document).ready(function(){
    $(".datepicker").datepicker();
        }); </script>' ; 
        $title = "View/Edit Storage - " ;
        include('inc/header.php');   
        $projects = mysqli_query($con, "SELECT projectname, moveid, customername, PPU, UoM FROM newproject");
        $transactions = mysqli_query($con, "SELECT * FROM newtransaction as t where $tranresults[moveid] == t.moveid"); 

while ($results = mysqli_fetch_array($projects, MYSQLI_ASSOC)) {
    echo "<table align='center'>";
        echo "<th colspan='7'>";
            echo $results[moveid] . " -- " . $results[projectname] . " c/o " . $results[customername] . " -- " . "$" . $results[PPU] . "/" . $results[UoM];
        echo "</th>";
        echo "<tr>";
            echo "<td>Move ID</td>";
            echo "<td>In/Out</td>";
            echo "<td>Number of Units</td>";
            echo "<td>Date</td>";
            echo "<td>RR/DT#</td>";
        echo "</tr>";

while ($tranresults = mysqli_fetch_array($transactions, MYSQLI_ASSOC)){
    echo "<tr>";
        echo "<td>$tranresults[moveid]</td>";
        echo "<td>$tranresults[IORO]</td>";
        echo "<td>$tranresults[units]</td>";
        echo "<td>$tranresults[transdate]</td>";
        echo "<td>$tranresults[refno]</td>";
    echo "</tr>";
}?>
                    <tr>
                    <form action="transadded.php" name='addnewtransaction' method="POST">
                        <td><input type="text" name="moveID" size="20" value="<?php echo $results[moveid]; ?>" readonly> </td>
                        <td><select id="inoutselect" name="inorout">
                                <option value="Select">Select</option>
                                <option value="Storage In">Storage In</option>
                                <option value="Storage Out">Storage Out</option>
                            </select> </td>
                        <td><input type="text" name="numberofunits" size="20"></td>
                        <td><input type="text" name="dateoftransaction" size="20" class="datepicker"></td>
                        <td><input type="text" name="rrdt" size="20"> </td>
                        <td><input type="submit" value="Add" id="logsubmit"></td>
                    </form>
                    </table>
                    <br /><br />
    <?php   };?>

免責事項: 現在、コードが SQL インジェクションに対して脆弱であることは承知しており、基本的な機能が完成したら修正します。

4

2 に答える 2

0

あなたの質問のエラーは、結果ではなく$transactions返されるためです。FALSEこれは、構築している SQL の構文エラーが原因です。まず、配列アクセスを文字列にダンプすることはできません。文字列を分割するか、中かっこを使用して、その変数を補間することを示す必要があります。次に、連想配列内のキーの名前を引用符で囲む必要があります。PHP は必要なものを見つけ出しますが、それでもログに E_WARNING が生成されます。3 番目に、無効な SQL で二重等号を使用しています。

元の行は次のとおりです。

$transactions = mysqli_query($con, "SELECT * FROM newtransaction as t where $tranresults[moveid] == t.moveid");

それは次のようになります。

$transactions = mysqli_query($con, "SELECT * FROM newtransaction as t where {$tranresults['moveid']} = t.moveid");

_編集_

コメントから、9 行目は 24 行目まで設定されていない変数を参照していることがわかりました。とにかく内部を調べるのは間違った変数です。これはコードの別のクラックで、2 番目の SQL クエリが移動され、配列アクセスの一部がクリーンアップされています。

$projects = mysqli_query($con, "SELECT projectname, moveid, customername, PPU, UoM FROM newproject");

while ($results = mysqli_fetch_array($projects, MYSQLI_ASSOC)) {
    echo "<table align='center'>";
    echo "<th colspan='7'>";
    echo $results['moveid'] . " -- " . $results['projectname'] . " c/o " . $results['customername'] . " -- " . "$" . $results['PPU'] . "/" . $results['UoM'];
    echo "</th>";
    echo "<tr>";
    echo "<td>Move ID</td>";
    echo "<td>In/Out</td>";
    echo "<td>Number of Units</td>";
    echo "<td>Date</td>";
    echo "<td>RR/DT#</td>";
    echo "</tr>";
    $transactions = mysqli_query($con, "SELECT * FROM newtransaction as t where {$results['moveid']} = t.moveid"); 
    while ($tranresults = mysqli_fetch_array($transactions, MYSQLI_ASSOC)){
        echo "<tr>";
        echo "<td>{$tranresults['moveid']}</td>";
        echo "<td>{$tranresults['IORO']}</td>";
        echo "<td>{$tranresults['units']}</td>";
        echo "<td>{$tranresults['transdate']}</td>";
        echo "<td>{$tranresults['refno']}</td>";
        echo "</tr>";
    }
?>
于 2013-09-12T01:10:36.740 に答える