簡體   English   中英

PHP MySQL:用戶選擇要創建mysql查詢數組變量的字段

[英]PHP MySQL: User selects the fields to create mysql query array variable

這是我的問題:

我有一個表單,用戶在其中輸入3項內容(ID鍵,“起始日期”和“結束日期”),並且還從一組o復選框中選擇要在結果中查看的列。 (該表格非常大,因為它的數據庫表每個都有大約15列,所以我不在這里發布)

這是處理這些輸入並生成查詢的(的一部分)代碼。 (我會在后面解釋確切的作用)

<?php
//Check the columns that should be shown in the table
if(empty($_POST['vesselcolumns']) && empty($_POST['expeditioncolumns'])){
    $columns='*';
}else if (isset($_POST['vesselcolumns']) || isset($_POST['expeditioncolumns'])) {
    if (empty($_POST['vesselcolumns'])){
        $columns='';
    }else{
        $vesselcolumns= implode(',', $_POST['vesselcolumns']);
        $columns=$vesselcolumns;
    }

    if (empty($_POST['expeditioncolumns'])){
        $columns.='';
    }else{
        $expeditioncolumns = implode(',', $_POST['expeditioncolumns']);
        if($columns!=''){
            $columns.=','.$expeditioncolumns;
        }
    }
}

//AMAS check
if(empty($_POST['searchv'])){
    echo 'No AMAS given, will print ALL expedition data<br />';
}else{
    $amas = $_POST['searchv'];
}

//Deploy Date FROM and TO check
if(empty($_POST['deploydatefrom'])){
    $datefrom = '0000-00-00';
}else{
    $datefrom = $_POST['deploydatefrom'];
}

if(empty($_POST['deploydateto'])){
    $dateto = '9999-12-31';
}else{
    $dateto = $_POST['deploydateto'];
}

if(isset($amas)){
    $expeditionq="SELECT '$columns' 
        FROM vessel
        INNER JOIN vessel_expeditions
        ON vessel.AMAS=vessel_expeditions.vexpedition_AMAS AND vessel.AMAS= '$amas'
        INNER JOIN expedition
        ON vessel_expeditions.expedition_ID=expedition.expedition_ID
        WHERE expedition.deployDate >= '$datefrom' AND expedition.deployDate <= '$dateto'";

    $result=mysqli_query($con,$expeditionq);

    if($columns=='*'){
        $takefields=mysqli_query($con, "SHOW COLUMNS FROM vessel"); 

        while ($vcol = mysqli_fetch_array($takefields)){
            $vcolu= array( $vcol['Field']);
        }

        $takefieldse=mysqli_query($con, "SHOW COLUMNS FROM expedition");

        while ($ecol = mysqli_fetch_array($takefieldse)){
            $ecolu= array($ecol['Field']);
        }

        $vccounter = count($vcolu);
        $eccounter = count($ecolu);

        while($row = mysqli_fetch_array($result)){
            for($i=0; $i<$vccounter; $i++){
                echo $row[$vcolu[$i]] . '<br />';
            }

            for($i=0; $i<$eccounter; $i++){
                echo $row[$ecolu[$i]] . '<br />';
            }
        }
    }else{
        $column = explode(',', $columns);
        $counter = count($column);
        $forexport='<table id="results">
                        <tr>';
        for($i=0; $i<$counter; $i++){
            $forexport .= '<th>' . $column[$i] . '</th>';
        }

        $forexport.='</tr>';

        while($row = mysqli_fetch_array($result)){

            for($i=0; $i<=$counter; $i++){
                $forexport .= '<td>' . $row[$column[$i]] . '</td>';
            }
            $forexport.='</tr>';
        }

        $forexport .='</table>';

        echo $forexport;
        echo '<form name="exportanalysis" method="post" action="exportanalysis.php">
                <input type="hidden" name="export" value="' . htmlspecialchars($forexport, ENT_QUOTES) . '" />
                <label for="selectcsv"><img src="img/csv-icon.png" width="50" height="50" /> </label>
                <input type="radio" name="filexport" value="csv" id="selectcsv" required />
                <label for="selectxls"><img src="img/xls-icon.png" width="50" height="50" /> </label>
                <input type="radio" name="filexport" value="xls" id="selectxls" />
                <input type="submit" value="Download" />';
    }
}else{
    echo 'amas not set';
}
?>

首先,我檢查用戶選擇了哪些列(如果未選擇,則放入"*" ),然后將它們分解為column4的數組(從復選框開始,它們以類似字符串的形式出現: column1column2column4 etc. )。

然后,我檢查了AMAS(這是用戶輸入的ID鍵),最后我檢查了日期(如果給定了)[當我使用isset()提交沒有日期值的表單時,這里出現了奇怪的事情,即使其中沒​​有值,它也會繼續傳遞if(按它們的設置),所以我將其更改為empty()]。

經過多次測試后,我發現查詢( $expeditionq )工作正常(我什至直接在MySQL中對其進行了測試)。 另外, "SHOW COLUMNS"查詢也可以正常工作,我獲取了它們的結果並進行了顯示。

當我試圖顯示$expeditionq查詢的結果時,問題就來了,我認為問題是這樣的: $row[$column[$i]]但我想不出另一種方法:/

PUH。 抱歉,這段代碼看起來很奇怪。 這是您要表達的內容:

  if(!empty($_POST['vesselcolumns']) && !empty($_POST['expeditioncolumns'])){
    $columns= implode(',', $_POST['vesselcolumns']) . ',' . implode(',', $_POST['expeditioncolumns']);
  }
  else if(!empty($_POST['vesselcolumns'])) {
     $columns= implode(',', $_POST['vesselcolumns']);
  }
  else if(!empty($_POST['expeditioncolumns'])) {
     $columns= implode(',', $_POST['expeditioncolumns']) 
  }
  else {
      $columns='*';
  }

無論如何,問題很明顯: SHOW COLUMNS將返回該表中的所有列。 您遍歷結果,該結果僅包含用戶選擇的列。 因此,除非用戶請求顯示所有列,否則您將嘗試訪問不存在的行中的字母數字索引或“鍵”。 編輯:對不起,由於源的非結構化組織,這是不完整的閱讀。 僅當$ columns ==“ *”時才執行SHOW COLUMNS查詢,因此顯然會選擇所有字段。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM