From 085676784024137750bd3b5cbfc09c014dd059c6 Mon Sep 17 00:00:00 2001 From: Carsten Schmitz Date: Fri, 16 Mar 2012 17:19:18 +0100 Subject: [PATCH] Fixed issue: PHP warning when importing label set without labels --- admin/importlabel.php | 713 +++++++++++++++++++++--------------------- 1 file changed, 357 insertions(+), 356 deletions(-) diff --git a/admin/importlabel.php b/admin/importlabel.php index 9ef2c23dd05..a8eeffda04d 100644 --- a/admin/importlabel.php +++ b/admin/importlabel.php @@ -1,357 +1,358 @@ -".$clang->gT("Import Label Set")."\n"; - -$sFullFilepath = $tempdir . DIRECTORY_SEPARATOR . $_FILES['the_file']['name']; -$aPathInfo = pathinfo($sFullFilepath); -$sExtension = $aPathInfo['extension']; - -if (!@move_uploaded_file($_FILES['the_file']['tmp_name'], $sFullFilepath)) -{ - $importlabeloutput .= "".$clang->gT("Error")."
\n"; - $importlabeloutput .= sprintf ($clang->gT("An error occurred uploading your file. This may be caused by incorrect permissions in your %s folder."),$tempdir)."

\n"; - $importlabeloutput .= "

\n"; - return; -} - -$importlabeloutput .= "
".$clang->gT("Success")."

\n"; -$importlabeloutput .= $clang->gT("File upload succeeded.")."

\n"; -$importlabeloutput .= $clang->gT("Reading file..")."

\n"; -$options['checkforduplicates']='off'; -if (isset($_POST['checkforduplicates'])) -{ - $options['checkforduplicates']=$_POST['checkforduplicates']; -} - -if (strtolower($sExtension)=='csv') -{ - $aImportResults=CSVImportLabelset($sFullFilepath, $options); -} -elseif (strtolower($sExtension)=='lsl') -{ - $aImportResults=XMLImportLabelsets($sFullFilepath, $options); -} - else -{ - $importlabeloutput .= "
\n
".$clang->gT("Error")."

\n"; - $importlabeloutput .= "".$clang->gT("Label set import summary")."
\n"; - $importlabeloutput .= $clang->gT("Uploaded label set file needs to have an .lsl extension.")."

\n"; - $importlabeloutput .= "\n"; - $importlabeloutput .= "

\n"; -} -unlink($sFullFilepath); - -if (isset($aImportResults)) -{ - if (count($aImportResults['warnings'])>0) - { - $importlabeloutput .= "
\n
".$clang->gT("Warnings")."
\n"; - } - - $importlabeloutput .= "
\n
".$clang->gT("Success")."

\n"; - $importlabeloutput .= "".$clang->gT("Label set import summary")."
\n"; - $importlabeloutput .= "\n"; - $importlabeloutput .= "

".$clang->gT("Import of label set(s) is completed.")."

\n"; - $importlabeloutput .= "\n"; - $importlabeloutput .= "
\n"; -} - - -// IF WE GOT THIS FAR, THEN THE FILE HAS BEEN UPLOADED SUCCESFULLY -function CSVImportLabelset($sFullFilepath, $options) -{ - global $dbprefix, $connect, $clang; - $results['labelsets']=0; - $results['labels']=0; - $results['warnings']=array(); - $csarray=buildLabelSetCheckSumArray(); - //$csarray is now a keyed array with the Checksum of each of the label sets, and the lid as the key - - $handle = fopen($sFullFilepath, "r"); - while (!feof($handle)) - { - $buffer = fgets($handle); //To allow for very long survey welcomes (up to 10k) - $bigarray[] = $buffer; - } - fclose($handle); - if (substr($bigarray[0], 0, 27) != "# LimeSurvey Label Set Dump" && substr($bigarray[0], 0, 28) != "# PHPSurveyor Label Set Dump") - { - return $results['fatalerror']=$clang->gT("This file is not a LimeSurvey label set file. Import failed."); - } - - for ($i=0; $i<9; $i++) //skipping the first lines that are not needed - { - unset($bigarray[$i]); - } - $bigarray = array_values($bigarray); - - //LABEL SETS - if (array_search("# LABELS TABLE\n", $bigarray)) - { - $stoppoint = array_search("# LABELS TABLE\n", $bigarray); - } - elseif (array_search("# LABELS TABLE\r\n", $bigarray)) - { - $stoppoint = array_search("# LABELS TABLE\r\n", $bigarray); - } - else - { - $stoppoint = count($bigarray)-1; - } - for ($i=0; $i<=$stoppoint+1; $i++) - { - if ($i<$stoppoint-2) {$labelsetsarray[] = $bigarray[$i];} - unset($bigarray[$i]); - } - $bigarray = array_values($bigarray); - - - //LABELS - $stoppoint = count($bigarray)-1; - - for ($i=0; $i<$stoppoint; $i++) - { - // do not import empty lines - if (trim($bigarray[$i])!='') - { - $labelsarray[] = $bigarray[$i]; - } - unset($bigarray[$i]); - } - - - - $countlabelsets = count($labelsetsarray)-1; - $countlabels = count($labelsarray)-1; - - - if (isset($labelsetsarray) && $labelsetsarray) { - $count=0; - foreach ($labelsetsarray as $lsa) { - $fieldorders =convertCSVRowToArray($labelsetsarray[0],',','"'); - $fieldcontents=convertCSVRowToArray($lsa,',','"'); - if ($count==0) {$count++; continue;} - - $labelsetrowdata=array_combine($fieldorders,$fieldcontents); - - // Save old labelid - $oldlid=$labelsetrowdata['lid']; - // set the new language - - unset($labelsetrowdata['lid']); - - $newvalues=array_values($labelsetrowdata); - $newvalues=array_map(array(&$connect, "qstr"),$newvalues); // quote everything accordingly - $lsainsert = "insert INTO {$dbprefix}labelsets (".implode(',',array_keys($labelsetrowdata)).") VALUES (".implode(',',$newvalues).")"; //handle db prefix - $lsiresult=$connect->Execute($lsainsert); - $results['labelsets']++; - - // Get the new insert id for the labels inside this labelset - $newlid=$connect->Insert_ID("{$dbprefix}labelsets",'lid'); - - if ($labelsarray) { - $count=0; - $lfieldorders=convertCSVRowToArray($labelsarray[0],',','"'); - unset($labelsarray[0]); - foreach ($labelsarray as $la) { - - $lfieldcontents=convertCSVRowToArray($la,',','"'); - // Combine into one array with keys and values since its easier to handle - $labelrowdata=array_combine($lfieldorders,$lfieldcontents); - $labellid=$labelrowdata['lid']; - - if ($labellid == $oldlid) { - $labelrowdata['lid']=$newlid; - - // translate internal links - $labelrowdata['title']=translink('label', $oldlid, $newlid, $labelrowdata['title']); - if (!isset($labelrowdata["assessment_value"])) - { - $labelrowdata["assessment_value"]=(int)$labelrowdata["code"]; - } - - $newvalues=array_values($labelrowdata); - $newvalues=array_map(array(&$connect, "qstr"),$newvalues); // quote everything accordingly - $lainsert = "insert INTO {$dbprefix}labels (".implode(',',array_keys($labelrowdata)).") VALUES (".implode(',',$newvalues).")"; //handle db prefix - $liresult=$connect->Execute($lainsert); - $results['labels']++; - } - } - } - - //CHECK FOR DUPLICATE LABELSETS - - if (isset($_POST['checkforduplicates'])) - { - $thisset=""; - $query2 = "SELECT code, title, sortorder, language, assessment_value - FROM ".db_table_name('labels')." - WHERE lid=".$newlid." - ORDER BY language, sortorder, code"; - $result2 = db_execute_num($query2) or safe_die("Died querying labelset $lid
$query2
".$connect->ErrorMsg()); - while($row2=$result2->FetchRow()) - { - $thisset .= implode('.', $row2); - } // while - $newcs=dechex(crc32($thisset)*1); - unset($lsmatch); - - if (isset($csarray) && $options['checkforduplicates']=='on') - { - foreach($csarray as $key=>$val) - { - // echo $val."-".$newcs."
"; For debug purposes - if ($val == $newcs) - { - $lsmatch=$key; - } - } - } - if (isset($lsmatch)) - { - //There is a matching labelset. So, we will delete this one and refer - //to the matched one. - $query = "DELETE FROM {$dbprefix}labels WHERE lid=$newlid"; - $result=$connect->Execute($query) or safe_die("Couldn't delete labels
$query
".$connect->ErrorMsg()); - $query = "DELETE FROM {$dbprefix}labelsets WHERE lid=$newlid"; - $result=$connect->Execute($query) or safe_die("Couldn't delete labelset
$query
".$connect->ErrorMsg()); - $newlid=$lsmatch; - $results['warnings'][]=$clang->gT("Label set was not imported because the same label set already exists.")." ".sprintf($clang->gT("Existing LID: %s"),$newlid); - - } - //END CHECK FOR DUPLICATES - } - } - } - - return $results; -} - - -function XMLImportLabelsets($sFullFilepath, $options) -{ - global $connect, $dbprefix, $clang; - - $xml = simplexml_load_file($sFullFilepath); - if ($xml->LimeSurveyDocType!='Label set') safe_die('This is not a valid LimeSurvey label set structure XML file.'); - $dbversion = (int) $xml->DBVersion; - $csarray=buildLabelSetCheckSumArray(); - $aLSIDReplacements=array(); - $results['labelsets']=0; - $results['labels']=0; - $results['warnings']=array(); - - - // Import labels table =================================================================================== - - $tablename=$dbprefix.'labelsets'; - foreach ($xml->labelsets->rows->row as $row) - { - $insertdata=array(); - foreach ($row as $key=>$value) - { - $insertdata[(string)$key]=(string)$value; - } - $oldlsid=$insertdata['lid']; - unset($insertdata['lid']); // save the old qid - - // Insert the new question - $query=$connect->GetInsertSQL($tablename,$insertdata); - $result = $connect->Execute($query) or safe_die ($clang->gT("Error").": Failed to insert data
{$query}
\n".$connect->ErrorMsg()); - $results['labelsets']++; - - $newlsid=$connect->Insert_ID($tablename,"lid"); // save this for later - $aLSIDReplacements[$oldlsid]=$newlsid; // add old and new lsid to the mapping array - } - - - // Import labels table =================================================================================== - - $tablename=$dbprefix.'labels'; - foreach ($xml->labels->rows->row as $row) - { - $insertdata=array(); - foreach ($row as $key=>$value) - { - $insertdata[(string)$key]=(string)$value; - } - $insertdata['lid']=$aLSIDReplacements[$insertdata['lid']]; - $query=$connect->GetInsertSQL($tablename,$insertdata); - $result = $connect->Execute($query) or safe_die ($clang->gT("Error").": Failed to insert data
{$query}
\n".$connect->ErrorMsg()); - $results['labels']++; - } - - //CHECK FOR DUPLICATE LABELSETS - - if (isset($_POST['checkforduplicates'])) - { - foreach (array_values($aLSIDReplacements) as $newlid) - { - $thisset=""; - $query2 = "SELECT code, title, sortorder, language, assessment_value - FROM ".db_table_name('labels')." - WHERE lid=".$newlid." - ORDER BY language, sortorder, code"; - $result2 = db_execute_num($query2) or safe_die("Died querying labelset $lid
$query2
".$connect->ErrorMsg()); - while($row2=$result2->FetchRow()) - { - $thisset .= implode('.', $row2); - } // while - $newcs=dechex(crc32($thisset)*1); - unset($lsmatch); - - if (isset($csarray) && $options['checkforduplicates']=='on') - { - foreach($csarray as $key=>$val) - { - if ($val == $newcs) - { - $lsmatch=$key; - } - } - } - if (isset($lsmatch)) - { - //There is a matching labelset. So, we will delete this one and refer - //to the matched one. - $query = "DELETE FROM {$dbprefix}labels WHERE lid=$newlid"; - $result=$connect->Execute($query) or safe_die("Couldn't delete labels
$query
".$connect->ErrorMsg()); - $results['labels']=$results['labels']-$connect->Affected_Rows(); - $query = "DELETE FROM {$dbprefix}labelsets WHERE lid=$newlid"; - $result=$connect->Execute($query) or safe_die("Couldn't delete labelset
$query
".$connect->ErrorMsg()); - $results['labelsets']--; - $newlid=$lsmatch; - $results['warnings'][]=$clang->gT("Label set was not imported because the same label set already exists.")." ".sprintf($clang->gT("Existing LID: %s"),$newlid); - - } - } - //END CHECK FOR DUPLICATES - } - return $results; -} - +".$clang->gT("Import Label Set")."\n"; + +$sFullFilepath = $tempdir . DIRECTORY_SEPARATOR . $_FILES['the_file']['name']; +$aPathInfo = pathinfo($sFullFilepath); +$sExtension = $aPathInfo['extension']; + +if (!@move_uploaded_file($_FILES['the_file']['tmp_name'], $sFullFilepath)) +{ + $importlabeloutput .= "".$clang->gT("Error")."
\n"; + $importlabeloutput .= sprintf ($clang->gT("An error occurred uploading your file. This may be caused by incorrect permissions in your %s folder."),$tempdir)."

\n"; + $importlabeloutput .= "

\n"; + return; +} + +$importlabeloutput .= "

".$clang->gT("Success")."

\n"; +$importlabeloutput .= $clang->gT("File upload succeeded.")."

\n"; +$importlabeloutput .= $clang->gT("Reading file..")."

\n"; +$options['checkforduplicates']='off'; +if (isset($_POST['checkforduplicates'])) +{ + $options['checkforduplicates']=$_POST['checkforduplicates']; +} + +if (strtolower($sExtension)=='csv') +{ + $aImportResults=CSVImportLabelset($sFullFilepath, $options); +} +elseif (strtolower($sExtension)=='lsl') +{ + $aImportResults=XMLImportLabelsets($sFullFilepath, $options); +} + else +{ + $importlabeloutput .= "
\n
".$clang->gT("Error")."

\n"; + $importlabeloutput .= "".$clang->gT("Label set import summary")."
\n"; + $importlabeloutput .= $clang->gT("Uploaded label set file needs to have an .lsl extension.")."

\n"; + $importlabeloutput .= "\n"; + $importlabeloutput .= "

\n"; +} +unlink($sFullFilepath); + +if (isset($aImportResults)) +{ + if (count($aImportResults['warnings'])>0) + { + $importlabeloutput .= "
\n
".$clang->gT("Warnings")."
\n"; + } + + $importlabeloutput .= "
\n
".$clang->gT("Success")."

\n"; + $importlabeloutput .= "".$clang->gT("Label set import summary")."
\n"; + $importlabeloutput .= "\n"; + $importlabeloutput .= "

".$clang->gT("Import of label set(s) is completed.")."

\n"; + $importlabeloutput .= "\n"; + $importlabeloutput .= "
\n"; +} + + +// IF WE GOT THIS FAR, THEN THE FILE HAS BEEN UPLOADED SUCCESFULLY +function CSVImportLabelset($sFullFilepath, $options) +{ + global $dbprefix, $connect, $clang; + $results['labelsets']=0; + $results['labels']=0; + $results['warnings']=array(); + $csarray=buildLabelSetCheckSumArray(); + //$csarray is now a keyed array with the Checksum of each of the label sets, and the lid as the key + + $handle = fopen($sFullFilepath, "r"); + while (!feof($handle)) + { + $buffer = fgets($handle); //To allow for very long survey welcomes (up to 10k) + $bigarray[] = $buffer; + } + fclose($handle); + if (substr($bigarray[0], 0, 27) != "# LimeSurvey Label Set Dump" && substr($bigarray[0], 0, 28) != "# PHPSurveyor Label Set Dump") + { + return $results['fatalerror']=$clang->gT("This file is not a LimeSurvey label set file. Import failed."); + } + + for ($i=0; $i<9; $i++) //skipping the first lines that are not needed + { + unset($bigarray[$i]); + } + $bigarray = array_values($bigarray); + + //LABEL SETS + if (array_search("# LABELS TABLE\n", $bigarray)) + { + $stoppoint = array_search("# LABELS TABLE\n", $bigarray); + } + elseif (array_search("# LABELS TABLE\r\n", $bigarray)) + { + $stoppoint = array_search("# LABELS TABLE\r\n", $bigarray); + } + else + { + $stoppoint = count($bigarray)-1; + } + for ($i=0; $i<=$stoppoint+1; $i++) + { + if ($i<$stoppoint-2) {$labelsetsarray[] = $bigarray[$i];} + unset($bigarray[$i]); + } + $bigarray = array_values($bigarray); + + + //LABELS + $stoppoint = count($bigarray)-1; + + for ($i=0; $i<$stoppoint; $i++) + { + // do not import empty lines + if (trim($bigarray[$i])!='') + { + $labelsarray[] = $bigarray[$i]; + } + unset($bigarray[$i]); + } + + + + $countlabelsets = count($labelsetsarray)-1; + $countlabels = count($labelsarray)-1; + + + if (isset($labelsetsarray) && $labelsetsarray) { + $count=0; + foreach ($labelsetsarray as $lsa) { + $fieldorders =convertCSVRowToArray($labelsetsarray[0],',','"'); + $fieldcontents=convertCSVRowToArray($lsa,',','"'); + if ($count==0) {$count++; continue;} + + $labelsetrowdata=array_combine($fieldorders,$fieldcontents); + + // Save old labelid + $oldlid=$labelsetrowdata['lid']; + // set the new language + + unset($labelsetrowdata['lid']); + + $newvalues=array_values($labelsetrowdata); + $newvalues=array_map(array(&$connect, "qstr"),$newvalues); // quote everything accordingly + $lsainsert = "insert INTO {$dbprefix}labelsets (".implode(',',array_keys($labelsetrowdata)).") VALUES (".implode(',',$newvalues).")"; //handle db prefix + $lsiresult=$connect->Execute($lsainsert); + $results['labelsets']++; + + // Get the new insert id for the labels inside this labelset + $newlid=$connect->Insert_ID("{$dbprefix}labelsets",'lid'); + + if ($labelsarray) { + $count=0; + $lfieldorders=convertCSVRowToArray($labelsarray[0],',','"'); + unset($labelsarray[0]); + foreach ($labelsarray as $la) { + + $lfieldcontents=convertCSVRowToArray($la,',','"'); + // Combine into one array with keys and values since its easier to handle + $labelrowdata=array_combine($lfieldorders,$lfieldcontents); + $labellid=$labelrowdata['lid']; + + if ($labellid == $oldlid) { + $labelrowdata['lid']=$newlid; + + // translate internal links + $labelrowdata['title']=translink('label', $oldlid, $newlid, $labelrowdata['title']); + if (!isset($labelrowdata["assessment_value"])) + { + $labelrowdata["assessment_value"]=(int)$labelrowdata["code"]; + } + + $newvalues=array_values($labelrowdata); + $newvalues=array_map(array(&$connect, "qstr"),$newvalues); // quote everything accordingly + $lainsert = "insert INTO {$dbprefix}labels (".implode(',',array_keys($labelrowdata)).") VALUES (".implode(',',$newvalues).")"; //handle db prefix + $liresult=$connect->Execute($lainsert); + $results['labels']++; + } + } + } + + //CHECK FOR DUPLICATE LABELSETS + + if (isset($_POST['checkforduplicates'])) + { + $thisset=""; + $query2 = "SELECT code, title, sortorder, language, assessment_value + FROM ".db_table_name('labels')." + WHERE lid=".$newlid." + ORDER BY language, sortorder, code"; + $result2 = db_execute_num($query2) or safe_die("Died querying labelset $lid
$query2
".$connect->ErrorMsg()); + while($row2=$result2->FetchRow()) + { + $thisset .= implode('.', $row2); + } // while + $newcs=dechex(crc32($thisset)*1); + unset($lsmatch); + + if (isset($csarray) && $options['checkforduplicates']=='on') + { + foreach($csarray as $key=>$val) + { + // echo $val."-".$newcs."
"; For debug purposes + if ($val == $newcs) + { + $lsmatch=$key; + } + } + } + if (isset($lsmatch)) + { + //There is a matching labelset. So, we will delete this one and refer + //to the matched one. + $query = "DELETE FROM {$dbprefix}labels WHERE lid=$newlid"; + $result=$connect->Execute($query) or safe_die("Couldn't delete labels
$query
".$connect->ErrorMsg()); + $query = "DELETE FROM {$dbprefix}labelsets WHERE lid=$newlid"; + $result=$connect->Execute($query) or safe_die("Couldn't delete labelset
$query
".$connect->ErrorMsg()); + $newlid=$lsmatch; + $results['warnings'][]=$clang->gT("Label set was not imported because the same label set already exists.")." ".sprintf($clang->gT("Existing LID: %s"),$newlid); + + } + //END CHECK FOR DUPLICATES + } + } + } + + return $results; +} + + +function XMLImportLabelsets($sFullFilepath, $options) +{ + global $connect, $dbprefix, $clang; + + $xml = simplexml_load_file($sFullFilepath); + if ($xml->LimeSurveyDocType!='Label set') safe_die('This is not a valid LimeSurvey label set structure XML file.'); + $dbversion = (int) $xml->DBVersion; + $csarray=buildLabelSetCheckSumArray(); + $aLSIDReplacements=array(); + $results['labelsets']=0; + $results['labels']=0; + $results['warnings']=array(); + + + // Import labels table =================================================================================== + + $tablename=$dbprefix.'labelsets'; + foreach ($xml->labelsets->rows->row as $row) + { + $insertdata=array(); + foreach ($row as $key=>$value) + { + $insertdata[(string)$key]=(string)$value; + } + $oldlsid=$insertdata['lid']; + unset($insertdata['lid']); // save the old qid + + // Insert the new question + $query=$connect->GetInsertSQL($tablename,$insertdata); + $result = $connect->Execute($query) or safe_die ($clang->gT("Error").": Failed to insert data
{$query}
\n".$connect->ErrorMsg()); + $results['labelsets']++; + + $newlsid=$connect->Insert_ID($tablename,"lid"); // save this for later + $aLSIDReplacements[$oldlsid]=$newlsid; // add old and new lsid to the mapping array + } + + + // Import labels table =================================================================================== + + $tablename=$dbprefix.'labels'; + if (isset($xml->labels->rows->row)) + foreach ($xml->labels->rows->row as $row) + { + $insertdata=array(); + foreach ($row as $key=>$value) + { + $insertdata[(string)$key]=(string)$value; + } + $insertdata['lid']=$aLSIDReplacements[$insertdata['lid']]; + $query=$connect->GetInsertSQL($tablename,$insertdata); + $result = $connect->Execute($query) or safe_die ($clang->gT("Error").": Failed to insert data
{$query}
\n".$connect->ErrorMsg()); + $results['labels']++; + } + + //CHECK FOR DUPLICATE LABELSETS + + if (isset($_POST['checkforduplicates'])) + { + foreach (array_values($aLSIDReplacements) as $newlid) + { + $thisset=""; + $query2 = "SELECT code, title, sortorder, language, assessment_value + FROM ".db_table_name('labels')." + WHERE lid=".$newlid." + ORDER BY language, sortorder, code"; + $result2 = db_execute_num($query2) or safe_die("Died querying labelset $lid
$query2
".$connect->ErrorMsg()); + while($row2=$result2->FetchRow()) + { + $thisset .= implode('.', $row2); + } // while + $newcs=dechex(crc32($thisset)*1); + unset($lsmatch); + + if (isset($csarray) && $options['checkforduplicates']=='on') + { + foreach($csarray as $key=>$val) + { + if ($val == $newcs) + { + $lsmatch=$key; + } + } + } + if (isset($lsmatch)) + { + //There is a matching labelset. So, we will delete this one and refer + //to the matched one. + $query = "DELETE FROM {$dbprefix}labels WHERE lid=$newlid"; + $result=$connect->Execute($query) or safe_die("Couldn't delete labels
$query
".$connect->ErrorMsg()); + $results['labels']=$results['labels']-$connect->Affected_Rows(); + $query = "DELETE FROM {$dbprefix}labelsets WHERE lid=$newlid"; + $result=$connect->Execute($query) or safe_die("Couldn't delete labelset
$query
".$connect->ErrorMsg()); + $results['labelsets']--; + $newlid=$lsmatch; + $results['warnings'][]=$clang->gT("Label set was not imported because the same label set already exists.")." ".sprintf($clang->gT("Existing LID: %s"),$newlid); + + } + } + //END CHECK FOR DUPLICATES + } + return $results; +} + // Closing PHP tag intentionall left out \ No newline at end of file