[英]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
的數組(從復選框開始,它們以類似字符串的形式出現: column1
, column2
, column4
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.