2016-06-03 8 views
3

여기와 다른 사이트에서 수백 개의 게시물을 읽었습니다. 나는 PHP와 mysql에 익숙하지 않지만 이미 mysql에 내장 된 테이블을 가지고 있으며, 단일 체크리스트를 사용하여 호출하고 날짜와 시간을 기준으로 필터링했다. 그러나 다중 체크 박스 영역에서는 배열 코드에 대해 잘못하고있는 부분을 집어내어 결과 테이블을 사용자 지정하는 것처럼 보이지 않습니다.mysql db의 다중 부분 PHP 쿼리 수행 방법

<?php 
$servername = "myhostaddress.com"; 
$username = "myusername"; 
$password = "mypassword"; 
$dbname = "mydatabasename"; 
$conn=new mysqli($servername, $username, $password, $dbname); 
if ($conn->connect_error) { 
die("Connection failed: " . $conn->connect_error);} 
if($_POST['submit'] == "submit") { 
$from_date = ($_POST['from_date']); 
$to_date = ($_POST['from_date']);} 
if(isset($_POST['submit'])) { 
:

<html> <body> <form method="POST" action="php/minute_feedback.php"> 
Date: <input type="text" name="from_date" id="from_date" value="2016-04-07"> 
<input type="checkbox" name="check_list[]" value="gate" id="gate"> 
<input type="checkbox" name="check_list[]" value="pressure" id="pressure"> 
<input type="checkbox" name="check_list[]" value="flow" id="flow"> 
<input type="submit" name="submit" value="submit"> 

이 기본 PHP (내가 포함이 동일합니다 이후 짧게 유지하는 날짜 & 시간 대 날짜 매개 변수 만 포함합니다) 인 :이 기본 HTML입니다

$checklist[] = $_POST[check_list]; 

-하지만 내가 올바른 구문/코드가 무엇인지 확실하지 않다 :

지금 ... 내가 좋아하는 여기에 배열 코드의 일종이 있어야한다 알고있다. 다음 질문은 내 쿼리에 대한 것입니다. WHERE + IN 콤보와 '*'SELECT를 사용하여 대부분의 쿼리를 보았습니다. 내가 필요로하는,

echo "<table><tr><th>Date</th><th>Time</th><th>Level (ft)</th></tr>";} 

그러나 : 나는 하나의 값이 조회되고이 있다면 내 테이블 헤더로, 나는 다음과 같은 코드를 사용할 수 있습니다 - 이제

$sql = "SELECT Fdate, Ftime, (list of variable columns from the checked options such as 'gate', 'pressure', 'flow' --> but only if they've been checked) FROM minute_db WHERE Fdate BETWEEN '$from_date' AND '$to_date'"; 

$result = $conn->query($sql);} 
if ($result->num_rows > 0) { 

: 그러나, 나는 가까이 뭔가가 필요 체크 된 항목 (필요에 따라 1, 2 또는 3 개 이상의 변수)과 날짜 및 시간 레코드의 결과로 동적으로 채워지는 헤더.

echo "<table>";} 
else { 
echo "0 results";} 
$conn->close(); 
?> 

내 최종 결과는, 그들이 2016년 4월 7일에 바로 게이트 설정 압력을 알고 싶다면 사용자가, 예를 들어, 그래서 날짜 및 시간 범위를 입력하고 표시 할 데이터를 선택할 수 있다는 것입니다 그들은 그 날짜를 입력하고 테이블을 얻을 수 있도록 두 확인란을 것 - 예를 들어, (아래 어떤 형식 그냥 표현하기 위해 노력하지 않음) : 나는 궁극적으로 수만 수천 개의 행의있는 테이블을해야합니다

Date  |  Time | Gate Setting | Pressure 
---------------------------------------------------- 
2016-04-07 | 11:00 |  21   |  50 

(선택할 수있는 데이터의 양에 대한 제한 기가 포함됨) 및 선택할 수있는 최대 56 개의 열이 있습니다. 나는 시간주기 등을 그룹화하기 위해 특별한/환상적인 수학 함수를 사용하지 않습니다. - 나는 이미 그것을 수동으로 분리하고 업로드하여 준비가되었습니다. 나는 인터넷에서 많은 다른 해결책을 시도했지만 궁극적으로 실패했다. SELECT에 대한 * 옵션은 내가 무엇인지, IN 옵션을하지 않는 것처럼 보입니다. 그러나 확실하지 않습니다. 나는 netfirms mysql 플랫폼을 사용하고있어서 꽤 업데이트되었다. (그리고 mysqli를 사용하지 않을 때 어떤 문제가 발생하지 않도록 모든 것을 mysqli로 바꿀 것이다.) 그래서 사전에 모든 피드백이 굉장 할 것이다 !! 이 그대로 완벽하게 작동 AWESOME 나는 테이블을 채울 수 있기 때문에 테이블의 배열의 사용에 관해서는, 나는 고투했지만, 일의 중복을 얻고 있었다 -.! 위의 당신은 깊은의 솔루션

답변

-1
$checklist  = $_POST['check_list']; 
$allowedFields = [ 
    'gate'  => 'Gate', 
    'pressure' => 'Pressure', 
    'flow'  => 'Flow', 
    'etc'  => 'Other field title' 
]; 
$wantedFields = []; 
$tableDynFields = []; 
foreach ($checklist as $field) { 
    if (array_key_exists($field, $allowedFields)) { 
     $wantedFields[] = $field; 
     $tableDynFields[] = $allowedFields[$field]; 
    } 
} 
if ($wantedFields) { 
    $wantedFields = join(',', $wantedFields) . ','; 
} else { 
    $wantedFields = ''; 
} 
$sql = "SELECT Ftime, {$wantedFields} Fdate FROM ...'; 
// and here you have $tableDynFields array for table generation 
+0

이것은 굉장했습니다. 너는 환상적이야! 그것은 내가 필요한만큼 정확하게 작동합니다. 그래도 $ tableDynFields 배열을 이해하려고 노력 중입니다. 위의 테이블을 수동으로 빌드하면 아무런 문제가 없습니다. 동적으로 다음과 같이 시도했습니다. // 결과 다음> 0 : while ($ row = $ result-> fetch_assoc()) {// next : echo "

"; // 다음 : foreach ($ tableDynFields as $ row) : array_map ('htmlentities', $ row); // 다음 : echo ""; // 다음 : endforeach; } echo "
"implode (''. array_keys (current ($ tableDynFields)));"
"implode ('', $ 행); "
";} else {echo "0 results" '} // 오류 – pcguru

+0

부분적인 해결책이 있지만 그것을 정리해야합니다 ($ result-> num_rows 라인 이후 시작) : echo "

"; foreach ($ tableDynFields as $ c) {echo ""; } echo ""; while ($ row = $ result-> fetch_assoc()) {echo ""; foreach는 ($ tableDynFields 같은 $ c) {에코 "" ;} echo "";} echo "
날짜 시간 $ c>
". $ 행 [ "Fdate"]. "". $ 행 [ "FTIME"]. "". $ 행 [$ C]. "
"; $ result-> free();} else {echo "query failed.
";} $ conn-> close(); // so - 테이블은 다시 채워지지만 체크 된 각 변수에 대한 날짜와 시간을 제공합니다. 한번만 필요해? 생각? – pcguru

0

감사를 (위의 답에서 언급했듯이) 그러나 나는 단순히 스크립트를 조금만 움직이면 작동한다. 이제 사용자는 날짜, 시간 및 찾고있는 추가 변수가있는 열을 다시 가져온다. 옆에, 페이지를 가로 질러, 비교 값 (참고 - 나는 아직 mysqli 또는 pdo의 시점에 이르지 않았으므로 이것이 오래된 경우, 필요에 따라 업데이트하십시오. 잘하면이 도움이 - 그리고 다시 감사합니다!그래서 - (완전 작성) 위의 깊은의 게시물에서 SQL 줄에서,이 테이블은 - 당신은 일종의을 통해 많은 필터링 할 필요가있는 경우>

$sql = "SELECT Fdate, {$wantedFields} Ftime FROM minute_db WHERE Fdate BETWEEN '$from_date' AND '$to_date' AND Ftime BETWEEN '$from_time' AND '$to_time'"; 

$result = $conn->query($sql); 
} 
if ($result->num_rows > 0) { 
//header fields 
echo "<table><tr><th>Date</th><th>Time</th>";  
     foreach($tableDynFields as $c) { 
     echo "<th>$c</th>"; 
    } 
    echo "</tr>"; 
//results 
while ($row = $result->fetch_assoc()) {       
      echo "<tr><td>".$row["Fdate"]."</td><td>".$row["Ftime"]." </td>"; 
     foreach($tableDynFields as $c) { 
      echo "<td>".$row[$c]."</td>"; 
     } 
     echo "</tr>"; 
    } 
    echo "</table>"; 
//result set free 
    $result->free(); 
    } else { 
     echo "query failed.<hr/>"; 
    } 
$conn->close(); 
?> 

내가 추가 할 것입니다있는 유일한 방법입니다 데이터가 나는 것처럼 - select 문장의 끝 부분에 강제 리미터를 두거나 그 효과를 발휘하는 것이 좋다!