2016-06-01 3 views
1

Мне нужно отобразить список результатов из опроса на странице PHP, а затем экспортировать их в файл CSV. Список также действует как сводка, которую можно щелкнуть до полного результата.Экспорт таблицы MySQL в CSV через PHP по выбору флажка

У меня есть все, что отсортировано, но теперь мне нужно экспортировать CSV путем выбора check bx, чтобы нам не нужно было загружать всю базу данных каждый раз только те, которые нам нужны.

Мой код ниже.

<div class="resultsList"> 

      <h1>PEEM Results List</h1> 
      <a class="exportCSV" href="https://domain.com/downloadcsv.php">Export to CSV</a> 
      <!-- Export CSV button --> 
      <h3 class="resultsbydate">All results by date</h3> 


       <div class="resultsListHeader"> 
        <div class="clientidTab">Agency</div> 
        <div class="clientidTab">Family ID</div> 
        <div class="clientidName">Name</div> 
        <div class="clientidTab">Date</div> 
        <div class="clientidTab"></div> 
       </div> 
       <div class="entriesListMain"> 
        <?php 
        $connection = mysql_connect("localhost", "username", "password"); // Establishing Connection with Server 
        $db = mysql_select_db("database_name", $connection); // Selecting Database 
        //MySQL Query to read data 
        $query = mysql_query("select * from results ORDER BY peemdate DESC", $connection); 
        while ($row = mysql_fetch_array($query)) { 
        echo "<div><input type=\"checkbox\" name=\"xport\" value=\"export\"><span>{$row['client_id']}</span> <span>{$row['family_id']}</span> <span>{$row['firstname']} {$row['lastname']}</span> <span>".date("d F Y", strtotime($row['peemdate']))."</span>"; 
        echo "<span><a class=\"parents-button\" href=\"peem-parent-repsonses.php?id={$row['survey_id']}\"><strong>Parent&rsquo;s Review</strong></a></span>"; 
        echo "<span><a href=\"peem-repsonses.php?id={$row['survey_id']}\"><strong>View Results</strong></a></span>"; 
        echo "</div>"; 
        } 
        ?> 
       </div> 
     </div> 

     <?php 
     if (isset($_GET['id'])) { 
     $id = $_GET['id']; 
     $query1 = mysql_query("select * from results where survey_id=$id", $connection); 
     while ($row1 = mysql_fetch_array($query1)) { 
     ?> 

     <?php 
     } 
     } 
     ?> 

     <?php 
     mysql_close($connection); // Closing Connection with Server 
     ?> 

И downloadcsv.php

<?php 
$conn = mysql_connect("localhost","username","password"); 
mysql_select_db("databasename",$conn); 

$filename = "peem_results.csv"; 
$fp = fopen('php://output', 'w'); 

$query = "SELECT COLUMN_NAME FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_SCHEMA='realwell_peemfinal' AND TABLE_NAME='results'"; 
$result = mysql_query($query); 
while ($row = mysql_fetch_row($result)) { 
    $header[] = $row[0]; 
} 

header('Content-type: application/csv'); 
header('Content-Disposition: attachment; filename='.$filename); 
fputcsv($fp, $header); 

$query = "SELECT * FROM results"; 
$result = mysql_query($query); 
while($row = mysql_fetch_row($result)) { 
    fputcsv($fp, $row); 
} 
exit; 
?> 

Любая помощь с этим было бы здорово, веселит

Обновлены с скриншотом, что я пытаюсь достичь enter image description here

+0

Это должен быть выбор «checkbox» вместо «check bx». – Phil

ответ

1

начальный набор результат должен быть обернут в форме, POST на следующей странице. Флажок должен отправить массив идентификаторов в сценарий экспорта.

<input type='checkbox' name='xport[]' value='ID_OF_THE_ROW_HERE'> 

[] после xport означает, что $ _POST ['xport'] будет массивом значений.


страница экспорта может сворачиваться массив идентификаторов в разделенных запятыми строку и использовать запрос:

SELECT * FROM results WHERE id IN (4,7,11,30) 

<form method="POST" action="downloadcsv.php"> 

     <h1>PEEM Results List</h1> 
     <a class="exportCSV" href="https://domain.com/downloadcsv.php">Export to CSV</a> 
     <!-- Export CSV button --> 
     <h3 class="resultsbydate">All results by date</h3> 


      <div class="resultsListHeader"> 
       <div class="clientidTab">Agency</div> 
       <div class="clientidTab">Family ID</div> 
       <div class="clientidName">Name</div> 
       <div class="clientidTab">Date</div> 
       <div class="clientidTab"></div> 
      </div> 
      <div class="entriesListMain"> 
       <?php 
       $connection = mysql_connect("localhost", "username", "password"); // Establishing Connection with Server 
       $db = mysql_select_db("database_name", $connection); // Selecting Database 
       //MySQL Query to read data 
       $query = mysql_query("select * from results ORDER BY peemdate DESC", $connection); 
       while ($row = mysql_fetch_array($query)) { 
       echo "<div><input type='checkbox' name='xport[]' value='{$row['client_id']}'><span>{$row['client_id']}</span> <span>{$row['family_id']}</span> <span>{$row['firstname']} {$row['lastname']}</span> <span>".date("d F Y", strtotime($row['peemdate']))."</span>"; 
       echo "<span><a class=\"parents-button\" href=\"peem-parent-repsonses.php?id={$row['survey_id']}\"><strong>Parent&rsquo;s Review</strong></a></span>"; 
       echo "<span><a href=\"peem-repsonses.php?id={$row['survey_id']}\"><strong>View Results</strong></a></span>"; 
       echo "</div>"; 
       } 
       ?> 
      </div> 

     </form> 

Изменение $ строки [ 'client_id'] к правильное значение

Затем в сценарии экспорта:

<?php 
/* 
Expecting $_POST['xport'] array of row ids 
*/ 
if(!isset($_POST['xport']) OR !is_array($_POST['xport'])) { 
    exit('No rows selected for export'); 
} 

$conn = mysql_connect("localhost","username","password"); 
mysql_select_db("databasename",$conn); 

$filename = "peem_results.csv"; 
$fp = fopen('php://output', 'w'); 

$query = "SELECT COLUMN_NAME FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_SCHEMA='realwell_peemfinal' AND TABLE_NAME='results'"; 
$result = mysql_query($query); 
while ($row = mysql_fetch_row($result)) { 
    $header[] = $row[0]; 
} 

header('Content-type: application/csv'); 
header('Content-Disposition: attachment; filename='.$filename); 
fputcsv($fp, $header); 

//Cast all ids to integer 
$ids = $_POST['xport']; 
array_walk($ids, function(&$value, $key) { 
    $value = (int)$value; 
}); 

$ids = implode(', ', $ids); 

$query = "SELECT * FROM results WHERE id IN ($ids)"; 
$result = mysql_query($query); 
while($row = mysql_fetch_row($result)) { 
    fputcsv($fp, $row); 
} 
exit; 
?> 
1

Так если я получаю это правильно, вам просто нужно проверить флажки, чтобы выбрать базы данных ($ rows), которые вы хотите вставить в файл csv fil е ....

Каждый флажок, что вы проверили будет в переменной $ _POST, так:

первых вы делаете массив со всеми именами опций CheckBox (баз данных), например

$all_db = ['database1', 'database2', 'database3']; 

второго контура через You каждое из значений в $all_db и проверить, если они существуют в массиве $ _POST, если они делают, то вы можете экспортировать строку

foreach($all_db as $db_check) { 
    if (array_key_exists($db_check, $_POST) { 
      // EXPORT TO CSV 
     } 
} 

не делают Forg et! Это означает, что атрибут «name» этого флажка должен быть именем базы данных.

Если вы не хотите иметь статический список баз данных (т. Е. Существует вероятность того, что они будут иметь разные имена в будущем/будет больше или, возможно, меньше и т. Д., То дайте мне знать, я могу отредактировать мой ответ, если необходимо :))

(Если вы используете переменную $ _GET, то вы можете сделать то же самое, просто изменить $ _POST до $ _GET)

Знайте, однако, что $ _GET приходит как немного amateuristic для конечного пользователя, если он получает тысячу переменных в своем URL-адресе,

$ _POST часто является лучшей альтернативой, поскольку он скрыт и очищен для конечного пользователя. ..

EDIT: UPDATING ANSWER (SEE COMMENT)

Так в основном нужны люди, чтобы иметь возможность выбирать, какие строки они экспортируют от вас дБ ... Прежде всего, это означает, что нам нужен уникальный идентификатор для каждой строки,

Это может либо столбцом, используемым исключительно для этого (т. е. Идентификационный столбец с автоматическим приращением и уникальным атрибутом) Или это может быть столбец, который у вас уже есть, просто убедитесь, что это уникальный столбец, поэтому мы не получаем дублирующихся значений (вы увидите, почему ниже)

Затем мы даем значение этого уникального столбца идентификатора для атрибута «name» флажка, а с помощью jquery/php мы добавляем/добавляем статическую строку ...

Например, используя свой семейный ID: "rownumber_" + $family_ID

Это заставляет нас (опять же, используя ваш пример): $_POST[] = ['rownumber_123456' => 1, 'rownumber_0000000' => 1, .....]

Итак, в вашем файле PHP вы просто выполните следующие действия, чтобы добавить правильные строки на ваш CSV:

while($row = mysql_fetch_row($result)) { 
     if (array_key_exists($row['your_row_id'], $_POST) { 
      fputcsv($fp, $row); 
     } 
} 

- Снова используя свой пример с family_ID: -

while($row = mysql_fetch_row($result)) { 
     if (array_key_exists($row['family_ID'], $_POST) { 
      fputcsv($fp, $row); 
     } 
} 

EDIT: Updating answer for comment no.2

Так мало Sidenote если вы собираетесь перебрать HTML, используя PHP (т.е. петля trhough дб строк и печатать их в определенном порядке) Тогда вы Propably хотите использовать «:» варианты петель,

  • Хотя():
  • для():
  • Еогеасп():
  • если():
  • .....

Эти варианты позволяют юй закрыть PHP тег после ":" и whataver HTML/CSS/PHP/JQuery вам р ут в состоянии/цикла будет выполняться как обычно ...

Например, вы можете сделать:

<ul> 
<?php foreach ($row as $columnkey => $columnvalue): ?> 
     <img src="whateveryouwant"?> 
     <li class="<?php echo $columnkey;?>">This is my value: <?php echo $columnvalue; ?></li> 
<?php endforeach; ?> 
</ul> 

Когда вы делаете это таким образом, что это гораздо чище, и вы не будете иметь никаких проблем с использованием двойной quatation знаки и все такое :)

Таким образом, используя этот метод, вот как ваш отображается список будет выглядеть в коде:

<div class="entriesListMain"> 
    <?php 
       $connection = mysql_connect("localhost", "username", "password"); // Establishing Connection with Server 
       $db = mysql_select_db("database_name", $connection); // Selecting Database 
       //MySQL Query to read data 
       $query = mysql_query("select * from results ORDER BY peemdate DESC", $connection); 
       while ($row = mysql_fetch_array($query)) : 
    ?> 


        <div> 
         <input type="checkbox" name="<?php echo $row['family_id']; ?>" value="export"> 
         <span><?php echo $row['client_id']; ?></span> 
         <span><?php echo $row['family_id']; ?></span> 
         <span><?php echo $row['firstname'] . " " . $row['lastname']; ?></span> 
         <span><?php echo date("d F Y",strtotime($row['peemdate']); ?></span>; 
         <span> 
         <a class="parents-button" href="peem-parent-repsonses.php?id=<?php echo $row['survey_id']; ?>"> 
         <strong>Parent&rsquo;s Review</strong> 
         </a> 
         </span> 
         <span> 
         <a href="peem-repsonses.php?id=<?php echo $row['survey_id']; ?>"> 
         <strong>View Results</strong> 
         </a> 
         </span> 
        </div> 


       <?php endwhile; ?> 
</div> 

как это флажок получит имя семейный ID, и поэтому в вашем csv.php вы можете использовать этот код:

while($row = mysql_fetch_row($result)) { 
     if (array_key_exists($row['family_ID'], $_POST) { 
      fputcsv($fp, $row); 
     } 
    } 

Поскольку теперь он будет проверять для каждой строки семейства работает ли идентификатор SQL строк размещен как разыскиваемая строка в $ _POST (checkbooxes), и если нет, он не будет экспортировать строку в файл csv! :)

Так что вы идете ^^

EDIT 3: Troubleshooting

Итак, есть несколько вещей, которые вы делаете в этой функции, формы, ли флажки в вашей HTML форме имеют family_ID в их атрибут имени? (т.е.<input type="checkbox" name="<?php echo $row['family_id']; ?>".... проверить, если имя атрибут действительно заполнен)

проводки материала из формы, (ваши флажки и прочее), так что давайте посмотрим, что на самом деле будет размещены,

die(print_r($_POST)); - Это означает, что вы хотите PHP умереть после этого (прекратите работать вообще), затем распечатайте переменную как есть (вид формата XML, который вы увидите)

Итак, вы получите целую кучу информации, если хотите, чтобы эта информация была хорошо сформированный способ, просто щелкнуть на нем элемент проверки:

Затем посмотрите, как ваш che ckboxes выходят из переменной $_POST, (они должны иметь family_ID как ключ и значение 1)

Если это все в порядке, а затем проверить ваш row['family_ID'] переменного ли family_ID правильно заполнен, сделать то же самое с вашей переменной $row, проверьте все переменные, которые вы используете в csv.php, а затем проверьте, почему ключ не существует в массиве, который вы ищете :)

Также не забудьте проверить, что вы заполнили array_key_exists(. a key FIRST и a array[] ПОСЛЕДНИЙ )

Я не могу вам помочь непосредственно с этим, так как это будет Propably быть неисправным переменной или ошибку в вашей форме, чтобы попытаться найти это самостоятельно, если до сих пор ничего, размещать эти переменные значения:

  • $_POST
  • $row
  • и полный HTML вашей формы
+0

Привет, Рафаэль Ламбелин, спасибо за ваш ответ. Да, вы на правильном пути, но это всего лишь одна база данных. Мне просто нужно разрешить выбирать, какие записи в базе данных нужно экспортировать, но с проблемами переписывать мой код, чтобы это произошло. – Phil

+0

спасибо за обновление, ваш ответ велик, но мои навыки php довольно слабы. Я уверен, как это реализовать. Cheers – Phil

+0

Можете ли вы сказать мне, какую часть вы не можете реализовать? –

Смежные вопросы