Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Remove sorting from public query #1839

Draft
wants to merge 5 commits into
base: Development
Choose a base branch
from
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
21 changes: 12 additions & 9 deletions classes/OccurrenceListManager.php
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@ public function __destruct(){
parent::__destruct();
}

public function getSpecimenMap($pageRequest,$cntPerPage){
public function getSpecimenMap($pageRequest, $cntPerPage){
$retArr = Array();
$isSecuredReader = false;
if($GLOBALS['USER_RIGHTS']){
Expand All @@ -26,21 +26,23 @@ public function getSpecimenMap($pageRequest,$cntPerPage){
$occArr = array();
$sqlWhere = $this->getSqlWhere();
if(!$this->recordCount || $this->reset) $this->setRecordCnt($sqlWhere);
$sql = 'SELECT o.occid, c.collid, c.institutioncode, c.collectioncode, c.collectionname, c.icon, o.institutioncode AS instcodeoverride, o.collectioncode AS collcodeoverride, '.
$sql = 'SELECT o.occid, o.collid, c.institutioncode, c.collectioncode, c.icon, o.institutioncode AS instcodeoverride, o.collectioncode AS collcodeoverride, '.
'o.catalognumber, o.family, o.sciname, o.scientificnameauthorship, o.tidinterpreted, o.recordedby, o.recordnumber, o.eventdate, '.
'o.country, o.stateprovince, o.county, o.locality, o.decimallatitude, o.decimallongitude, o.localitysecurity, o.localitysecurityreason, '.
'o.habitat, o.substrate, o.minimumelevationinmeters, o.maximumelevationinmeters, o.observeruid, c.sortseq '.
'FROM omoccurrences o INNER JOIN omcollections c ON o.collid = c.collid ';
$sql .= $this->getTableJoins($sqlWhere).$sqlWhere;
//Don't allow someone to query all occurrences if there are no conditions
if(!$sqlWhere) $sql .= 'WHERE o.occid IS NULL ';
if($this->sortArr) $sql .= 'ORDER BY '.implode(',',$this->sortArr);
if($this->sortArr) $sql .= 'ORDER BY '.implode(',', $this->sortArr);
/*
else{
$sql .= 'ORDER BY c.sortseq, c.collectionname ';
$pageRequest = ($pageRequest - 1)*$cntPerPage;
}
*/
$sql .= ' LIMIT ' . $pageRequest . ',' . $cntPerPage;
//echo '<div>Spec sql: ' . $sql . '</div>'; exit;
//echo '<div>Spec sql: ' . $sql . '</div>';
$result = $this->conn->query($sql);
if($result){
$securityCollArr = array();
Expand All @@ -61,7 +63,6 @@ public function getSpecimenMap($pageRequest,$cntPerPage){
if(!$retArr[$row->occid]['collcode']) $retArr[$row->occid]['collcode'] = $row->collcodeoverride;
elseif($retArr[$row->occid]['collcode'] != $row->collcodeoverride) $retArr[$row->occid]['collcode'] .= '-'.$row->collcodeoverride;
}
$retArr[$row->occid]['collname'] = $this->cleanOutStr($row->collectionname);
$retArr[$row->occid]['icon'] = $row->icon;
$retArr[$row->occid]['catnum'] = $this->cleanOutStr($row->catalognumber);
$retArr[$row->occid]['family'] = $this->cleanOutStr($row->family);
Expand Down Expand Up @@ -140,8 +141,10 @@ public function getRecordCnt(){
return $this->recordCount;
}

public function addSort($field,$direction){
$this->sortArr[] = trim($field.' '.$direction);
public function addSort($field, $direction){
if($field){
$this->sortArr[] = $this->cleanInStr($field) . ($direction ? ' desc' : '');
}
}

//Misc support functions
Expand All @@ -162,14 +165,14 @@ public function getDatasetArr(){

public function getCloseTaxaMatch($name){
$retArr = array();
$searchName = $this->cleanInStr($name);
$searchName = trim($name);
$sql = 'SELECT tid, sciname FROM taxa WHERE soundex(sciname) = soundex(?)';
$stmt = $this->conn->prepare($sql);
$stmt->bind_param('s', $searchName);
$stmt->execute();
$stmt->bind_result($tid, $sciname);
while($stmt->fetch()){
if($searchName != $sciname) $retArr[$tid] = $sciname;
if($searchName != $sciname) $retArr[$tid] = $this->cleanOutStr($sciname);
}
$stmt->close();
return $retArr;
Expand Down
4 changes: 1 addition & 3 deletions collections/harvestparams.php
Original file line number Diff line number Diff line change
Expand Up @@ -7,8 +7,6 @@

$collManager = new OccurrenceManager();
$searchVar = $collManager->getQueryTermStr();
$SHOULD_INCLUDE_CULTIVATED_AS_DEFAULT = $SHOULD_INCLUDE_CULTIVATED_AS_DEFAULT ?? false;

?>
<!DOCTYPE html>
<html lang="<?php echo $LANG_TAG ?>">
Expand Down Expand Up @@ -314,7 +312,7 @@
<label for="hascoords"><?php echo isset($LANG['HAS_COORDS'])?$LANG['HAS_COORDS']:'Limit to Specimens with Geocoordinates Only'; ?></label>
</div>
<div>
<input type='checkbox' name='includecult' id='includecult' value='1' <?php echo $SHOULD_INCLUDE_CULTIVATED_AS_DEFAULT ? 'checked' : '' ?> />
<input type='checkbox' name='includecult' id='includecult' value='1' <?= !empty($SHOULD_INCLUDE_CULTIVATED_AS_DEFAULT) ? 'checked' : '' ?> />
<label for="includecult"><?php echo isset($LANG['INCLUDE_CULTIVATED'])?$LANG['INCLUDE_CULTIVATED']:'Include cultivated/captive occurrences'; ?></label>
</div>
</div>
Expand Down
8 changes: 3 additions & 5 deletions collections/index.php
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,6 @@


$collManager = new OccurrenceManager();
$SHOULD_USE_HARVESTPARAMS = $SHOULD_USE_HARVESTPARAMS ?? false;
//$collManager->reset();

$collList = $collManager->getFullCollectionList($catId);
Expand Down Expand Up @@ -94,14 +93,13 @@
?>
</ul>
<?php
$actionPage = "harvestparams.php";
if($specArr && $obsArr){
?>
<div id="specobsdiv">
<div class="specimen-header-margin">
<h2><?php echo $LANG['SPECIMEN_COLLECTIONS'] ?></h2>
</div>
<form name="collform1" action="<?php echo $actionPage ?>" method="post" onsubmit="return verifyCollForm(this)">
<form name="collform1" action="harvestparams.php" method="post" onsubmit="return verifyCollForm(this)">
<div class="select-deselect-input">
<input id="dballcb" name="db[]" class="specobs" value='all' type="checkbox" onclick="selectAll(this);" checked />
<label for="dballcb">
Expand All @@ -124,7 +122,7 @@
if($specArr){
?>
<div id="specimendiv">
<form name="collform2" action="<?php echo $actionPage ?>" method="post" onsubmit="return verifyCollForm(this)">
<form name="collform2" action="harvestparams.php" method="post" onsubmit="return verifyCollForm(this)">
<div class="specimen-obs-div-select-deselect-input">
<input id="dballspeccb" name="db[]" class="spec" value='allspec' type="checkbox" onclick="selectAll(this);" checked />
<label for="dballspeccb">
Expand All @@ -141,7 +139,7 @@
if($obsArr){
?>
<div id="observationdiv">
<form name="collform3" action="<?php echo $actionPage ?>" method="post" onsubmit="return verifyCollForm(this)">
<form name="collform3" action="harvestparams.php" method="post" onsubmit="return verifyCollForm(this)">
<div class="specimen-obs-div-select-deselect-input">
<input id="dballobscb" name="db[]" class="obs" value='allobs' type="checkbox" onclick="selectAll(this);" checked />
<label for="dballobscb">
Expand Down
60 changes: 25 additions & 35 deletions collections/list.php
Original file line number Diff line number Diff line change
@@ -1,9 +1,10 @@
<?php
include_once('../config/symbini.php');
include_once($SERVER_ROOT . '/classes/OccurrenceListManager.php');
if ($LANG_TAG != 'en' && file_exists($SERVER_ROOT . '/content/lang/collections/list.' . $LANG_TAG . '.php')) include_once($SERVER_ROOT . '/content/lang/collections/list.' . $LANG_TAG . '.php');
else include_once($SERVER_ROOT . '/content/lang/collections/list.en.php');
include_once($SERVER_ROOT . '/classes/OccurrenceListManager.php');
header("Content-Type: text/html; charset=" . $CHARSET);
header('Content-Type: text/html; charset=' . $CHARSET);

$taxonFilter = array_key_exists('taxonfilter', $_REQUEST) ? filter_var($_REQUEST['taxonfilter'], FILTER_SANITIZE_NUMBER_INT) : 0;
$targetTid = array_key_exists('targettid', $_REQUEST) ? filter_var($_REQUEST['targettid'], FILTER_SANITIZE_NUMBER_INT) : '';
$tabIndex = array_key_exists('tabindex', $_REQUEST) ? filter_var($_REQUEST['tabindex'], FILTER_SANITIZE_NUMBER_INT) : 1;
Expand All @@ -23,8 +24,6 @@
if ($targetTid && array_key_exists('mode', $_REQUEST)) $searchVar .= '&mode=voucher&targettid=' . $targetTid;
$searchVar .= '&comingFrom=' . $comingFrom;
$occurArr = $collManager->getSpecimenMap($pageNumber, $cntPerPage);
$SHOULD_INCLUDE_CULTIVATED_AS_DEFAULT = $SHOULD_INCLUDE_CULTIVATED_AS_DEFAULT ?? false;
$SHOULD_USE_HARVESTPARAMS = $SHOULD_USE_HARVESTPARAMS ?? false;

$_SESSION['citationvar'] = $searchVar;
?>
Expand Down Expand Up @@ -135,20 +134,20 @@ function displayDatasetTools() {
if (isset($collections_listCrumbs)) {
if ($collections_listCrumbs) {
echo '<div class="navpath">';
echo '<a href="../index.php">' . htmlspecialchars($LANG['NAV_HOME'], ENT_COMPAT | ENT_HTML401 | ENT_SUBSTITUTE) . '</a> &gt;&gt; ';
echo '<a href="../index.php">' . $LANG['NAV_HOME'] . '</a> &gt;&gt; ';
echo $collections_listCrumbs . ' &gt;&gt; ';
echo '<b>' . $LANG['NAV_SPECIMEN_LIST'] . '</b>';
echo '</div>';
}
}
else {
echo '<div class="navpath">';
echo '<a href="../index.php">' . htmlspecialchars($LANG['NAV_HOME'], ENT_COMPAT | ENT_HTML401 | ENT_SUBSTITUTE) . '</a> &gt;&gt; ';
echo '<a href="../index.php">' . $LANG['NAV_HOME'] . '</a> &gt;&gt; ';
if($comingFrom == 'harvestparams'){
echo '<a href="index.php">' . htmlspecialchars($LANG['NAV_COLLECTIONS'], ENT_COMPAT | ENT_HTML401 | ENT_SUBSTITUTE) . '</a> &gt;&gt; ';
echo '<a href="' . $CLIENT_ROOT . '/collections/harvestparams.php">' . htmlspecialchars($LANG['NAV_SEARCH'], ENT_COMPAT | ENT_HTML401 | ENT_SUBSTITUTE) . '</a> &gt;&gt; ';
echo '<a href="index.php">' . $LANG['NAV_COLLECTIONS'] . '</a> &gt;&gt; ';
echo '<a href="' . $CLIENT_ROOT . '/collections/harvestparams.php">' . $LANG['NAV_SEARCH'] . '</a> &gt;&gt; ';
} else{
echo '<a href="' . $CLIENT_ROOT . '/collections/search/index.php">' . htmlspecialchars($LANG['NAV_SEARCH'], ENT_COMPAT | ENT_HTML401 | ENT_SUBSTITUTE) . '</a> &gt;&gt; ';
echo '<a href="' . $CLIENT_ROOT . '/collections/search/index.php">' . $LANG['NAV_SEARCH'] . '</a> &gt;&gt; ';
}
echo '<b>' . $LANG['NAV_SPECIMEN_LIST'] . '</b>';
echo '</div>';
Expand All @@ -160,7 +159,7 @@ function displayDatasetTools() {
<div id="tabs" class="top-breathing-room-rel" style="margin-bottom: 1rem">
<ul>
<li>
<a id="taxatablink" href='<?php echo 'checklist.php?' . htmlspecialchars($searchVar, ENT_COMPAT | ENT_HTML401 | ENT_SUBSTITUTE | ENT_QUOTES) . '&taxonfilter=' . htmlspecialchars($taxonFilter, ENT_COMPAT | ENT_HTML401 | ENT_SUBSTITUTE | ENT_QUOTES); ?>'>
<a id="taxatablink" href='<?= 'checklist.php?' . $searchVar . '&taxonfilter=' . $taxonFilter ?>'>
<span><?php echo $LANG['TAB_CHECKLIST']; ?></span>
</a>
</li>
Expand Down Expand Up @@ -219,15 +218,15 @@ function displayDatasetTools() {
while ($collElem = array_shift($collSearchArr)) {
$collSearchStr .= $collElem . '; ';
if ($cnt == 10 && $collSearchArr) {
$collSearchStr = trim($collSearchStr, '; ') . '<span class="inst-span">... (<a href="#" onclick="$(\'.inst-span\').toggle();return false;">' . htmlspecialchars($LANG['SHOW_ALL'], ENT_COMPAT | ENT_HTML401 | ENT_SUBSTITUTE) . '</a>)</span><span class="inst-span" style="display:none">; ';
$collSearchStr = trim($collSearchStr, '; ') . '<span class="inst-span">... (<a href="#" onclick="$(\'.inst-span\').toggle();return false;">' . $LANG['SHOW_ALL'] . '</a>)</span><span class="inst-span" style="display:none">; ';
}
$cnt++;
}
if ($cnt > 11) $collSearchStr .= '</span>';
}
echo '<div><b>' . $LANG['DATASET'] . ':</b> ' . $collSearchStr . '</div>';
if ($taxaSearchStr = $collManager->getTaxaSearchStr()) {
if (strlen($taxaSearchStr) > 300) $taxaSearchStr = substr($taxaSearchStr, 0, 300) . '<span class="taxa-span">... (<a href="#" onclick="$(\'.taxa-span\').toggle();return false;">' . htmlspecialchars($LANG['SHOW_ALL'], ENT_COMPAT | ENT_HTML401 | ENT_SUBSTITUTE) . '</a>)</span><span class="taxa-span" style="display:none;">' . substr($taxaSearchStr, 300) . '</span>';
if (strlen($taxaSearchStr) > 300) $taxaSearchStr = substr($taxaSearchStr, 0, 300) . '<span class="taxa-span">... (<a href="#" onclick="$(\'.taxa-span\').toggle();return false;">' . $LANG['SHOW_ALL'] . '</a>)</span><span class="taxa-span" style="display:none;">' . substr($taxaSearchStr, 300) . '</span>';
echo '<div><b>' . $LANG['TAXA'] . ':</b> ' . $taxaSearchStr . '</div>';
}
if ($localSearchStr = $collManager->getLocalSearchStr()) {
Expand All @@ -244,19 +243,19 @@ function displayDatasetTools() {
$endPage = ($lastPage > $startPage + 10 ? $startPage + 10 : $lastPage);
$pageBar = '';
if ($startPage > 1) {
$pageBar .= '<span class="pagination" style="margin-right:5px;"><a href="list.php?' . htmlspecialchars($searchVar, ENT_COMPAT | ENT_HTML401 | ENT_SUBSTITUTE) . '" >' . htmlspecialchars($LANG['PAGINATION_FIRST'], ENT_COMPAT | ENT_HTML401 | ENT_SUBSTITUTE) . '</a></span>';
$pageBar .= '<span class="pagination" style="margin-right:5px;"><a href="list.php?' . htmlspecialchars($searchVar, ENT_COMPAT | ENT_HTML401 | ENT_SUBSTITUTE) . '&page=' . htmlspecialchars((($pageNumber - 10) < 1 ? 1 : $pageNumber - 10), ENT_COMPAT | ENT_HTML401 | ENT_SUBSTITUTE) . '">&lt;&lt;</a></span>';
$pageBar .= '<span class="pagination" style="margin-right:5px;"><a href="list.php?' . $searchVar . '" >' . $LANG['PAGINATION_FIRST'] . '</a></span>';
$pageBar .= '<span class="pagination" style="margin-right:5px;"><a href="list.php?' . $searchVar . '&page=' . (($pageNumber - 10) < 1 ? 1 : $pageNumber - 10) . '">&lt;&lt;</a></span>';
}
for ($x = $startPage; $x <= $endPage; $x++) {
if ($pageNumber != $x) {
$pageBar .= '<span class="pagination" style="margin-right:3px;margin-right:3px;"><a href="list.php?' . htmlspecialchars($searchVar, ENT_COMPAT | ENT_HTML401 | ENT_SUBSTITUTE) . '&page=' . htmlspecialchars($x, ENT_COMPAT | ENT_HTML401 | ENT_SUBSTITUTE) . '">' . htmlspecialchars($x, ENT_COMPAT | ENT_HTML401 | ENT_SUBSTITUTE) . '</a></span>';
$pageBar .= '<span class="pagination" style="margin-right:3px;margin-right:3px;"><a href="list.php?' . $searchVar . '&page=' . $x . '">' . $x . '</a></span>';
} else {
$pageBar .= '<span class="pagination" style="margin-right:3px;margin-right:3px;font-weight:bold;">' . $x . '</span>';
}
}
if (($lastPage - $startPage) >= 10) {
$pageBar .= '<span class="pagination" style="margin-left:5px;"><a href="list.php?' . htmlspecialchars($searchVar, ENT_COMPAT | ENT_HTML401 | ENT_SUBSTITUTE) . '&page=' . htmlspecialchars((($pageNumber + 10) > $lastPage ? $lastPage : ($pageNumber + 10)), ENT_COMPAT | ENT_HTML401 | ENT_SUBSTITUTE) . '">&gt;&gt;</a></span>';
$pageBar .= '<span class="pagination" style="margin-left:5px;"><a href="list.php?' . htmlspecialchars($searchVar, ENT_COMPAT | ENT_HTML401 | ENT_SUBSTITUTE) . '&page=' . htmlspecialchars($lastPage, ENT_COMPAT | ENT_HTML401 | ENT_SUBSTITUTE) . '">Last</a></span>';
$pageBar .= '<span class="pagination" style="margin-left:5px;"><a href="list.php?' . $searchVar . '&page=' . (($pageNumber + 10) > $lastPage ? $lastPage : ($pageNumber + 10)) . '">&gt;&gt;</a></span>';
$pageBar .= '<span class="pagination" style="margin-left:5px;"><a href="list.php?' . $searchVar . '&page=' . $lastPage . '">Last</a></span>';
}
$pageBar .= '</div><div style="float:right;margin:5px;">';
$beginNum = ($pageNumber - 1) * $cntPerPage + 1;
Expand All @@ -274,21 +273,12 @@ function displayDatasetTools() {
<?php include('datasetinclude.php'); ?>
<table id="omlisttable">
<?php
$prevCollid = 0;
$permissionArr = array();
if(array_key_exists('CollAdmin', $USER_RIGHTS)) $permissionArr = $USER_RIGHTS['CollAdmin'];
if(array_key_exists('CollEditor', $USER_RIGHTS)) $permissionArr = array_merge($permissionArr, $USER_RIGHTS['CollEditor']);
foreach ($occurArr as $occid => $fieldArr) {
$collId = $fieldArr['collid'];
if ($collId != $prevCollid) {
$prevCollid = $collId;
$isEditor = false;
if ($SYMB_UID && ($IS_ADMIN || (array_key_exists('CollAdmin', $USER_RIGHTS) && in_array($collId, $USER_RIGHTS['CollAdmin'])) || (array_key_exists('CollEditor', $USER_RIGHTS) && in_array($collId, $USER_RIGHTS['CollEditor'])))) {
$isEditor = true;
}
echo '<tr><td colspan="2"><h2>';
echo '<a href="misc/collprofiles.php?collid=' . htmlspecialchars($collId, ENT_COMPAT | ENT_HTML401 | ENT_SUBSTITUTE) . '">' . htmlspecialchars($fieldArr["collname"], ENT_COMPAT | ENT_HTML401 | ENT_SUBSTITUTE) . '</a>';
echo '</h2><hr /></td></tr>';
}
echo '<tr><td width="60" valign="top" align="center">';
echo '<a href="misc/collprofiles.php?collid=' . htmlspecialchars($collId, ENT_COMPAT | ENT_HTML401 | ENT_SUBSTITUTE) . '&acronym=' . htmlspecialchars($fieldArr["instcode"], ENT_COMPAT | ENT_HTML401 | ENT_SUBSTITUTE) . '">';
echo '<a href="misc/collprofiles.php?collid=' . $fieldArr['collid'] . '">';
if ($fieldArr["icon"]) {
$icon = (substr($fieldArr["icon"], 0, 6) == 'images' ? '../' : '') . $fieldArr["icon"];
echo '<img align="bottom" src="' . $icon . '" style="width:35px;border:0px;" />';
Expand All @@ -301,9 +291,9 @@ function displayDatasetTools() {
echo '</div>';
echo '<div style="margin-top:10px"><span class="dataset-div checkbox-elem" style="display:none;"><input name="occid[]" type="checkbox" value="' . $occid . '" /></span></div>';
echo '</td><td>';
if ($isEditor || ($SYMB_UID && $SYMB_UID == $fieldArr['obsuid'])) {
if ($IS_ADMIN || in_array($fieldArr['collid'], $permissionArr) || ($SYMB_UID && $SYMB_UID == $fieldArr['obsuid'])) {
echo '<div style="float:right;" title="' . $LANG['OCCUR_EDIT_TITLE'] . '">';
echo '<a href="editor/occurrenceeditor.php?occid=' . htmlspecialchars($occid, ENT_COMPAT | ENT_HTML401 | ENT_SUBSTITUTE) . '" target="_blank">';
echo '<a href="editor/occurrenceeditor.php?occid=' . $occid . '" target="_blank">';
echo '<img src="../images/edit.png" style="width:1.3em" alt="' . (isset($LANG['IMG_EDIT_OCC']) ? $LANG['IMG_EDIT_OCC'] : 'Edit Occurence') . '" /></a></div>';
}
$targetClid = $collManager->getSearchTerm("targetclid");
Expand All @@ -320,7 +310,7 @@ function displayDatasetTools() {
echo '<div style="margin:4px;">';
if (isset($fieldArr['sciname'])) {
$sciStr = '<span style="font-style:italic;">' . $fieldArr['sciname'] . '</span>';
if (isset($fieldArr['tid']) && $fieldArr['tid']) $sciStr = '<i> <a target="_blank" href="../taxa/index.php?tid=' . strip_tags($fieldArr['tid']) . '">' . strip_tags($sciStr) . '</a> </i>' ;
if (isset($fieldArr['tid']) && $fieldArr['tid']) $sciStr = '<i> <a target="_blank" href="../taxa/index.php?tid=' . $fieldArr['tid'] . '">' . strip_tags($sciStr) . '</a> </i>' ;
if (isset($fieldArr['author']) && $fieldArr['author']) $sciStr .= ' ' . $fieldArr['author'];
echo $sciStr;
} elseif ($fieldArr['localitysecurity'] > 1) {
Expand Down Expand Up @@ -368,12 +358,12 @@ function displayDatasetTools() {
if ($p = strpos($tn, '(')) {
$tn = substr($tn, 0, $p);
}
if ($closeArr = $collManager->getCloseTaxaMatch(trim($tn))) {
if ($closeArr = $collManager->getCloseTaxaMatch($tn)) {
echo '<div style="margin: 40px 0px 200px 20px;font-weight:bold;">';
echo $LANG['PERHAPS_LOOKING_FOR'] . ' ';
$outStr = '';
foreach ($closeArr as $v) {
$outStr .= '<a href="harvestparams.php?taxa=' . htmlspecialchars($v, ENT_COMPAT | ENT_HTML401 | ENT_SUBSTITUTE) . '">' . htmlspecialchars($v, ENT_COMPAT | ENT_HTML401 | ENT_SUBSTITUTE) . '</a>, ';
$outStr .= '<a href="harvestparams.php?taxa=' . $v . '">' . $v . '</a>, ';
}
echo trim($outStr, ' ,');
echo '</div>';
Expand Down
Loading