add(DBLAN_53, E_MESSAGE_WARNING); } else { $_POST[$type] = true; } } if(isset($_POST['exportXmlFile'])) { if(exportXmlFile($_POST['xml_prefs'],$_POST['xml_tables'],$_POST['package_images'])) { $mes = e107::getMessage(); $mes->add(LAN_SUCCESS, E_MESSAGE_SUCCESS); } } require_once ("auth.php"); $st = new system_tools; /* No longer needed after XML feature added. if(isset($_POST['backup_core']) || $_GET['mode']=='backup_core') { backup_core(); //message_handler("MESSAGE", DBLAN_1); $mes->add(DBLAN_1, E_MESSAGE_SUCCESS); } */ require_once ("footer.php"); class system_tools { public $_options = array(); function __construct() { global $mySQLdefaultdb; $this->_options = array( "db_update" => array('diz'=>DBLAN_15, 'label'=>DBLAN_16), "verify_sql" => array('diz'=>DBLAN_4, 'label'=>DBLAN_5), 'optimize_sql' => array('diz'=>DBLAN_6, 'label'=> DBLAN_7), 'plugin_scan' => array('diz'=>DBLAN_28, 'label'=> DBLAN_29), 'pref_editor' => array('diz'=>DBLAN_19, 'label'=> DBLAN_20), // 'backup_core' => array('diz'=>DBLAN_8, 'label'=> DBLAN_9), // 'verify_sql_record' => array('diz'=>DBLAN_35, 'label'=> DBLAN_36), 'importForm' => array('diz'=>DBLAN_59, 'label'=> DBLAN_59), 'exportForm' => array('diz'=>DBLAN_58, 'label'=> DBLAN_58), 'sc_override_scan' => array('diz'=>DBLAN_55, 'label'=> DBLAN_56), 'convert_to_utf8' => array('diz'=>'Check Database Charset','label'=>'Check Charset'), 'correct_perms' => array('diz'=>'Correct File and Directory permissions','label'=>'Correct Perms') ); $this->_options = multiarray_sort($this->_options, 'label'); if(isset($_POST['delplug'])) { $this->delete_plugin_entry($_POST['pref_type']); } if(isset($_POST['upload'])) { $this->importXmlFile(); } if(isset($_POST['delpref']) || (isset($_POST['delpref_checked']) && isset($_POST['delpref2']))) { $this->del_pref_val($_POST['pref_type']); } if(isset($_POST['verify_sql']) || varset($_GET['mode'])=='verify_sql') { require_once(e_HANDLER."db_verify_class.php"); $dbv = new db_verify; $dbv->backUrl = e_SELF."?mode=verify_sql"; $dbv->verify(); return; } // if(isset($_POST['verify_sql_record']) || varset($_GET['mode'])=='verify_sql_record' || isset($_POST['check_verify_sql_record']) || isset($_POST['delete_verify_sql_record'])) // { //$this->verify_sql_record(); // - currently performed in db_verify_class.php // } if(isset($_POST['importForm']) || $_GET['mode']=='importForm') { $this->importForm(); } if(isset($_POST['db_update']) || varset($_GET['mode'])=='db_update') // Requires further testing. { // header("location: ".e_ADMIN."e107_update.php"); require_once(e_ADMIN."update_routines.php"); new e107Update($dbupdate); return; } if(isset($_POST['convert_to_utf8']) || $_GET['mode']=='convert_to_utf8') { $this->convertUTF8Form(); } if(isset($_POST['exportForm']) || $_GET['mode']=='exportForm') { $this->exportXmlForm(); } if(isset($_POST['optimize_sql']) || $_GET['mode']=='optimize_sql') { $this->optimizesql($mySQLdefaultdb); } if(isset($_POST['pref_editor']) || $_GET['mode']=='pref_editor' || isset($_POST['delpref']) || isset($_POST['delpref_checked'])) { $type = isset($_GET['type']) ? $_GET['type'] : "core"; $this->pref_editor($type); } if(isset($_POST['sc_override_scan']) || $_GET['mode']=='sc_override_scan') { $this->scan_override(); } if(isset($_POST['plugin_scan']) || e_QUERY == "plugin" || isset($_POST['delplug']) || $_GET['mode']=='plugin_scan') { $this->plugin_viewscan('refresh'); } if(vartrue($_POST['perform_utf8_convert'])) { $this->perform_utf8_convert(); return; } if(varset($_GET['mode'])=='correct_perms') { $this->correct_perms(); return; } if(!vartrue($_GET['mode']) && !isset($_POST['db_execute'])) { $this->render_options(); } } /** * Correct Folder and File permissions. */ function correct_perms() { $mes = e107::getMessage(); $fl = e107::getFile(); ob_start(); $fl->chmod(e_BASE); $fl->chmod(e_BASE."cron.php",0755); $errors = ob_get_clean(); if($errors !='') { $mes->addError($errors); } else { $mes->addSuccess("Folder and File permissions have been updated"); } e107::getRender()->tablerender(DBLAN_10.SEP."Correcting File and Directory Permissions", $mes->render()); } private function convertUTF8Form() { $mes = e107::getMessage(); $frm = e107::getForm(); $config = e107::getMySQLConfig(); $sql = e107::getDb(); $sql->gen('SHOW TABLE STATUS WHERE Name LIKE "'.$config['mySQLprefix'].'%" '); $text = ""; $invalidCollations = false; while($row = $sql->fetch()) { $text .= ""; // print_a($row); if($row['Collation'] != 'utf8_general_ci') { $invalidCollations = true; } } $text .= "
Table Engine Collation Status
".$row['Name']." ".$row['Engine']." ".$row['Collation']." ".(($row['Collation'] == 'utf8_general_ci') ? ADMIN_TRUE_ICON : ADMIN_FALSE_ICON)."
"; if($invalidCollations == true) { //TODO LAN $message = ' This function will permanently modify all tables in your database. ('.$config['mySQLdefaultdb'].')
It is HIGHLY recommended that you first backup your database and switch your site into maintenance mode.

Please note: '; $mes->add($message, E_MESSAGE_WARNING); $text .= "
"."Convert Database"."
".$frm->admin_button('perform_utf8_convert', "Convert non-UTF8 Tables",false,"Convert non-UTF8 Tables",'class=btn-success&data-loading-text=Please wait...')."
"; } else { $mes->addSuccess("Your tables are using the correct character set."); } e107::getRender()->tablerender(DBLAN_10.SEP."Check Charset".SEP.$config['mySQLdefaultdb'], $mes->render().$text); } private function perform_utf8_convert() { $config = e107::getMySQLConfig(); $dbtable = $config['mySQLdefaultdb']; //TODO Add a check to be sure the database is not already utf-8. // yep, needs more methods - possibly a class in e107_handler $sql = e107::getDb('utf8-convert'); $mes = e107::getMessage(); $ERROR = FALSE; // if(!$sql->gen("USE information_schema;")) // { // $mes->add("Couldn't read information_schema", E_MESSAGE_ERROR); // return; // } $queries = array(); $queries[] = $this->getQueries("SELECT CONCAT('ALTER TABLE `', table_name, '` MODIFY ', column_name, ' ', REPLACE(column_type, 'char', 'binary'), ';') FROM information_schema.columns WHERE TABLE_SCHEMA = '".$dbtable."' AND TABLE_NAME LIKE '".$config['mySQLprefix']."%' AND COLLATION_NAME != 'utf8_general_ci' and data_type LIKE '%char%';"); $queries[] = $this->getQueries("SELECT CONCAT('ALTER TABLE `', table_name, '` MODIFY ', column_name, ' ', REPLACE(column_type, 'text', 'blob'), ';') FROM information_schema.columns WHERE TABLE_SCHEMA = '".$dbtable."' AND TABLE_NAME LIKE '".$config['mySQLprefix']."%' AND COLLATION_NAME != 'utf8_general_ci' and data_type LIKE '%text%';"); $queries2 = array(); $queries2[] = $this->getQueries("SELECT CONCAT('ALTER TABLE `', table_name, '` MODIFY ', column_name, ' ', column_type, ' CHARACTER SET utf8;') FROM information_schema.columns WHERE TABLE_SCHEMA ='".$dbtable."' AND TABLE_NAME LIKE '".$config['mySQLprefix']."%' AND COLLATION_NAME != 'utf8_general_ci' and data_type LIKE '%char%';"); $queries2[] = $this->getQueries("SELECT CONCAT('ALTER TABLE `', table_name, '` MODIFY ', column_name, ' ', column_type, ' CHARACTER SET utf8;') FROM information_schema.columns WHERE TABLE_SCHEMA = '".$dbtable."' AND TABLE_NAME LIKE '".$config['mySQLprefix']."%' AND COLLATION_NAME != 'utf8_general_ci' and data_type LIKE '%text%';"); // $sql->gen("USE ".$dbtable); // print_a($queries2); // echo $mes->render(); // return; // Convert Text tables to Binary. foreach($queries as $qry) { foreach($qry as $q) { if(!$sql->db_Query($q)) { $mes->addError($q); $ERROR = TRUE; } else { $mes->addDebug($q); } } } //------------ // Convert Table Fields to utf8 $sql2 = e107::getDb('sql2'); $sql->gen('SHOW TABLE STATUS WHERE Collation != "utf8_general_ci" '); while ($row = $sql->fetch()) { $table = $row['Name']; $tab_query = "ALTER TABLE ".$table." DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci; "; //echo "TABQRT= ".$tab_query; if(!$sql2->db_Query($tab_query)) { $mes->addError($tab_query); $ERROR = TRUE; } else { $mes->addDebug($tab_query); } } // --------------- // Convert Table Fields back to Text/varchar etc. foreach($queries2 as $qry) { foreach($qry as $q) { if(!$sql->db_Query($q)) { $mes->addError($q); $ERROR = TRUE; } else { $mes->addDebug($q); } } } //------------ $lastQry = "ALTER DATABASE `".$dbtable."` DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;"; if(!$sql->db_Query($lastQry)) { $mes->add($lastQry, E_MESSAGE_ERROR); } elseif($ERROR != TRUE) { $message = "Database Converted successfully to UTF-8. "; //$message .= "
Please now add the following line to your e107_config.php file:
\$mySQLcharset = 'utf8';"; $mes->add($message, E_MESSAGE_SUCCESS); } echo $mes->render(); } function getQueries($query) { $mes = e107::getMessage(); $sql = e107::getDb('utf8-convert'); if($sql->gen($query)) { while ($row = $sql->fetch(MYSQL_NUM)) { $qry[] = $row[0]; } } else { $mes->addError($query); } return $qry; /* if(!$result = mysql_query($query)) { $mes->addError("Query Failed: ".$query); return; } while ($row = mysql_fetch_array($result, MYSQL_NUM)) { $qry[] = $row[0]; } return $qry; * */ } /** * Delete selected preferences. * @return none */ private function del_pref_val($mode='core') { $mes = e107::getMessage(); $deleted_list = ""; $config = ($mode == 'core' || $mode='') ? e107::getConfig('core') : e107::getPlugConfig($mode); // Single Pref Deletion using button if(varset($_POST['delpref'])) { $delpref = key($_POST['delpref']); if($config->remove($delpref)) { $deleted_list .= "
  • ".$delpref."
  • "; } } // Multiple Pref deletion using checkboxes if(varset($_POST['delpref2'])) { foreach($_POST['delpref2'] as $k => $v) { if($config->remove($k)) { $deleted_list .= "
  • ".$k."
  • "; } } } if($deleted_list && $config->save()) { $mes->add(LAN_DELETED.""); e107::getCache()->clear(); } } private function delete_plugin_entry() { $mes = e107::getMessage(); $sql = e107::getDb(); $del = array_keys($_POST['delplug']); if($sql->db_Delete("plugin", "plugin_id='".intval($del[0])."' LIMIT 1")) { $mes->add(LAN_DELETED, E_MESSAGE_SUCCESS); } else { $mes->add(LAN_DELETED_FAILED, E_MESSAGE_WARNING); } } /** * Render Options * @return none */ private function render_options() { $frm = e107::getForm(); $mes = e107::getMessage(); $text = "
    ".DBLAN_10." "; $text = "
    "; foreach($this->_options as $key=>$val) { $text .= ""; } /* $text .= "
    "; // $text .= "
    // ".$frm->admin_button('trigger_db_execute', DBLAN_51, 'execute')." //
    "; $text .= "
    "; */ e107::getRender()->tablerender(DBLAN_10, $mes->render().$text); } /** * Import XML Form * @return none */ private function importForm() { // Get largest allowable file upload $frm = e107::getSingleton('e_form'); $mes = e107::getMessage(); require_once(e_HANDLER.'upload_handler.php'); $max_file_size = get_user_max_upload(); $text = "
    ".LAN_UPLOAD."
    "; $text .= $frm->admin_button('upload', LAN_UPLOAD, 'submit', LAN_UPLOAD); $text .= "
    \n"; e107::getRender()->tablerender(DBLAN_10.SEP.DBLAN_59, $mes->render().$text); } /** * Export XML Dump * @return none */ private function exportXmlForm() { $mes = e107::getMessage(); $frm = e107::getSingleton('e_form'); //TODO LANs $text = "
    Export Options "; $pref_types = e107::getConfig()->aliases; unset($pref_types['core_old'],$pref_types['core_backup']); // $exclusions = array('core_old'=>1,'core_backup'=>1); // $filteredprefs = array_diff($pref_types,$exclusions); foreach($pref_types as $key=>$description) { $checked = (vartrue($_POST['xml_prefs'][$key]) == $key) ? 1: 0; $text .= ""; } $text .= "
    ".$frm->checkbox_toggle('check-all-verify', 'xml_prefs')." Preferences Rows
    ".$frm->checkbox("xml_prefs[".$key."]", $key, $checked)." ".LAN_PREFS.": ".$key."  
    \n"; $tables = table_list(); foreach($tables as $name=>$count) { $checked = (vartrue($_POST['xml_tables'][$name]) == $name) ? 1: 0; $text .= ""; } $text .="
    ".$frm->checkbox_toggle('check-all-verify', 'xml_tables')."Tables Rows
    ".$frm->checkbox("xml_tables[".$name."]", $name, $checked)." Table Data: ".$name." $count
    ".LAN_OPTIONS."
    "; $checked = (vartrue($_POST['package_images'])) ? 1: 0; $text .= $frm->checkbox("package_images",'package_images', $checked)." Convert paths and package images and xml into: ".e107::getParser()->replaceConstants(EXPORT_PATH)."
    ".$frm->admin_button('exportXmlFile', "Export File", 'other')."
    "; e107::getRender()->tablerender(DBLAN_10.SEP."Export Options",$mes->render(). $text); } /** * Import XML Dump * @return none */ private function importXmlFile() { $ret = e107::getSingleton('xmlClass')->e107Import($_FILES['file_userfile']['tmp_name'][0]); foreach($ret['success'] as $table) { e107::getMessage()->addSuccess("Inserted $table"); } foreach($ret['failed'] as $table) { e107::getMessage()->addError("Failed to Insert $table"); } } /** * Optimize SQL * @return none */ private function optimizesql($mySQLdefaultdb) //FIXME Use mysql class. { // global $mes; $result = mysql_list_tables($mySQLdefaultdb); while($row = mysql_fetch_row($result)) { mysql_query("OPTIMIZE TABLE ".$row[0]); } // $mes->add(DBLAN_11." $mySQLdefaultdb ".DBLAN_12, E_MESSAGE_SUCCESS); e107::getRender()->tablerender(DBLAN_10.SEP.DBLAN_7, DBLAN_11." $mySQLdefaultdb ".DBLAN_12); } /** * Preferences Editor * @return string text for display */ private function pref_editor($type='core') { //TODO Add drop-down for editing personal perfs also. ie. user pref of self. (admin) global $e107; $frm = e107::getForm(); $mes = e107::getMessage(); $tp = e107::getParser(); $pref = e107::getPref(); $config = ($type == 'core') ? e107::getConfig('core') : e107::getPlugConfig($type); $spref = $config->getPref(); ksort($spref); $text = "
    ".DBLAN_20.""; $text .= " "; foreach($spref as $key => $val) { $ptext = (is_array($val)) ? "
    ".print_r($val, TRUE)."
    " : htmlspecialchars($val, ENT_QUOTES, 'utf-8'); $ptext = $tp->textclean($ptext, 80); $text .= " "; } $text .= "
    ".LAN_DELETE." ".DBLAN_17." ".DBLAN_18." ".LAN_OPTIONS."
    ".$frm->checkbox("delpref2[$key]", 1)." {$key} {$ptext} ".$frm->submit_image("delpref[$key]", LAN_DELETE, 'delete', LAN_CONFIRMDEL." [$key]")."
    ".$frm->admin_button('delpref_checked', LAN_DELCHECKED, 'delete')." ".$frm->admin_button('back', LAN_BACK, 'back')."
    \n\n"; e107::getRender()->tablerender(DBLAN_10.SEP.DBLAN_20.SEP.ucwords($type), $mes->render().$text); return $text; } /** * Preferences Editor * @return none */ private function scan_override() { $pref = e107::getPref(); $mes = e107::getMessage(); $f = e107::getFile(); $config = e107::getConfig(); $scList = ''; $fList = $f->get_files(e_CORE.'override/shortcodes/single', '\.php$'); $scList = array(); if(count($fList)) { foreach($fList as $file) { $scList[] = strtoupper(substr($file['fname'], 0, -4)); } $scList = implode(',', $scList); } $config->set('sc_override', $scList)->save(false); // core batch overrides $fList = $f->get_files(e_CORE.'override/shortcodes/batch', '\.php$'); $scList = array(); if(count($fList)) { foreach($fList as $file) { $scList[] = substr($file['fname'], 0, -4); } $scList = implode(',', $scList); } $config->set('sc_batch_override', $scList)->save(false); //$pref['sc_override'] = $scList; //save_prefs(); // $mes->add(DBLAN_57.':
    '.$pref['sc_override'], E_MESSAGE_SUCCESS); // FIXME lan e107::getRender()->tablerender( ''.DBLAN_56, DBLAN_57.': ' .($config->get('sc_override') ? '
    '.$config->get('sc_override') : '(empty)') .'

    Batch shortcodes:' .($config->get('sc_batch_override') ? '
    '.$config->get('sc_batch_override') : '(empty)') ); } /** * Plugin Folder Scanner * @return none */ private function plugin_viewscan($mode = 'update') { $error_messages = array(0 => DBLAN_31, 1 => DBLAN_32, 2 => DBLAN_33, 3 => DBLAN_34); // $error_image = array("integrity_pass.png", "integrity_fail.png", "warning.png", "blank.png"); $error_glyph = array(ADMIN_TRUE_ICON,ADMIN_FALSE_ICON,""," "); $error_type = array('warning'=>2, 'error'=>1); global $e107; $sql = e107::getDb(); $tp = e107::getParser(); $frm = e107::getForm(); $mes = e107::getMessage(); require_once (e_HANDLER."plugin_class.php"); $ep = new e107plugin(); $ep->update_plugins_table($mode); // scan for e_xxx changes and save to plugin table. $ep->save_addon_prefs($mode); // generate global e_xxx_list prefs from plugin table. /* we all are awaiting for PHP5 only support - method chaining... $mes->add(DBLAN_22.' - '.DBLAN_23, E_MESSAGE_SUCCESS) ->add("".LAN_BACK."", E_MESSAGE_SUCCESS) ->add(DBLAN_30); */ $mes->add(DBLAN_23, E_MESSAGE_SUCCESS); $mes->add("".LAN_BACK."", E_MESSAGE_SUCCESS); $mes->add(DBLAN_30); $text = "
    ".ADLAN_CL_7." "; $sql->select("plugin", "*", "plugin_id !='' order by plugin_path ASC"); // Must order by path to pick up duplicates. (plugin names may change). $previous = ''; while($row = $sql->fetch()) { e107::loadLanFiles($row['plugin_path'],'admin'); e107::plugLan($row['plugin_path'],'global',true); $text .= " "; $previous = $row['plugin_path']; } $text .= "
    ".LAN_NAME." ".DBLAN_25." ".DBLAN_26." ".DBLAN_27."
    ".$tp->toHtml($row['plugin_name'], FALSE, "defs,emotes_off")." ".$row['plugin_path']." "; if(trim($row['plugin_addons'])) { //XXX - $nl_code = ''; - OLD VAR? foreach(explode(',', $row['plugin_addons']) as $this_addon) { $ret_code = 3; // Default to 'not checked if((strpos($this_addon, 'e_') === 0) || (substr($this_addon, - 4, 4) == '_sql')) { $ret_code = $ep->checkAddon($row['plugin_path'], $this_addon); // See whether spaces before opening tag or after closing tag } elseif(strpos($this_addon, 'sc_') === 0) { $this_addon = substr($this_addon, 3). ' (sc)'; } if(!is_numeric($ret_code)) { $errorMessage = $ret_code['msg']; $ret_code = $error_type[$ret_code['type']]; } else { $errorMessage = $error_messages[$ret_code]; } $text .= ""; $text .= $error_glyph[$ret_code]." "; // $text .= "".$error_messages[$ret_code].""; $text .= trim($this_addon); // $ret_code - 0=OK, 1=content error, 2=access error $text .= "
    "; } } $text .= "
    "; if($previous == $row['plugin_path']) { $delid = $row['plugin_id']; $delname = $row['plugin_name']; //Admin delete button $text .= $frm->admin_button("delplug[{$delid}]", DBLAN_52, 'delete', '', array('title' => LAN_CONFIRMDEL." ID:{$delid} [$delname]")); //Or maybe image submit? - //$text .= $frm->submit_image("delplug[{$delid}]", DBLAN_52, 'delete', LAN_CONFIRMDEL." ID:{$delid} [$delname]"); } else { $text .= ($row['plugin_installflag'] == 1) ? "".DBLAN_27."" : " "; // "Installed and not installed"; } $text .= "
    "; e107::getRender()->tablerender(DBLAN_10.SEP.DBLAN_22, $mes->render().$text); } } //XXX - what is this for (backup core)? function db_adminmenu() //FIXME - has problems when navigation is on the LEFT instead of the right. { global $st; foreach($st->_options as $key=>$val) { $var[$key]['text'] = $val['label']; $var[$key]['link'] = e_SELF."?mode=".$key; } e107::getNav()->admin(DBLAN_10, $_GET['mode'], $var); } /** * Export XML File and Copy Images. * @param object $prefs * @param object $tables * @param object $debug [optional] * @return none */ function exportXmlFile($prefs,$tables,$package=FALSE,$debug=FALSE) { $xml = e107::getSingleton('xmlClass'); $tp = e107::getParser(); $mes = e107::getMessage(); //TODO LANs if(vartrue($package)) { $xml->convertFilePaths = TRUE; $xml->filePathDestination = EXPORT_PATH; $xml->filePathPrepend = array( 'news_thumbnail' => "{e_IMAGE}newspost_images/" ); $desinationFolder = $tp->replaceConstants($xml->filePathDestination); if(!is_writable($desinationFolder)) { $mes->add($desinationFolder." is not writable", E_MESSAGE_ERROR); return ; } } if($xml->e107Export($prefs,$tables,$debug)) { $mes->add("Created: ".$desinationFolder."install.xml", E_MESSAGE_SUCCESS); if(varset($xml->fileConvertLog)) { foreach($xml->fileConvertLog as $oldfile) { $file = basename($oldfile); $newfile = $desinationFolder.$file; if($oldfile == $newfile || (copy($oldfile,$newfile))) { $mes->add("Copied: ".$newfile, E_MESSAGE_SUCCESS); } else { $mes->add("Couldn't copy: ".$newfile, E_MESSAGE_ERROR); } } } } } function table_list() { // grab default language lists. //TODO - a similar function is in db_verify.php. Should probably all be moved to mysql_class.php. $exclude = array(); $exclude[] = "core"; $exclude[] = "rbinary"; $exclude[] = "parser"; $exclude[] = "tmp"; $exclude[] = "online"; $exclude[] = "upload"; $exclude[] = "user_extended_country"; $exclude[] = "plugin"; $coreTables = e107::getDb()->db_TableList('nolan'); $tables = array_diff($coreTables,$exclude); foreach($tables as $e107tab) { $count = e107::getDb()->db_Select_gen("SELECT * FROM #".$e107tab); if($count) { $tabs[$e107tab] = $count; } } return $tabs; } /* Still needed? function backup_core() { global $pref, $sql; $tmp = base64_encode((serialize($pref))); if(!$sql->db_Insert("core", "'pref_backup', '{$tmp}' ")) { $sql->db_Update("core", "e107_value='{$tmp}' WHERE e107_name='pref_backup'"); } } */ /* function verify_sql_record() // deprecated by db_verify.php ( i think). { global $e107; $sql = e107::getDb(); $sql2 = e107::getDb('sql2'); $sql3 = e107::getDb('sql3'); $frm = e107::getForm(); $tp = e107::getParser(); $mes = e107::getMessage(); $tables = array(); $tables[] = 'rate'; $tables[] = 'comments'; if(isset($_POST['delete_verify_sql_record'])) { if(!varset($_POST['del_dbrec'])) { $mes->add('Nothing to delete', E_MESSAGE_DEBUG); } else { $msg = "ok, so you want to delete some records? not a problem at all!
    "; $msg .= "but, since this is still an experimental procedure, i won't actually delete anything
    "; $msg .= "instead, i will show you the queries that would be performed
    "; $text .= "
    "; $mes->add($msg, E_MESSAGE_DEBUG); foreach($_POST['del_dbrec'] as $k => $v) { if($k == 'rate') { $keys = implode(", ", array_keys($v)); $qry .= "DELETE * FROM rate WHERE rate_id IN (".$keys.")
    "; } elseif($k == 'comments') { $keys = implode(", ", array_keys($v)); $qry .= "DELETE * FROM comments WHERE comment_id IN (".$keys.")
    "; } } $mes->add($qry, E_MESSAGE_DEBUG); $mes->add("".LAN_BACK."", E_MESSAGE_DEBUG); } } //Nothing selected if(isset($_POST['check_verify_sql_record']) && (!isset($_POST['table_rate']) && !isset($_POST['table_comments']))) { $_POST['check_verify_sql_record'] = ''; unset($_POST['check_verify_sql_record']); $mes->add(DBLAN_53, E_MESSAGE_WARNING); } if(!isset($_POST['check_verify_sql_record'])) { //select table to verify $text = "
    ".DBLAN_39." "; foreach($tables as $t) { $text .= " "; } $text .= "
    ".DBLAN_37."
    ".$frm->checkbox('table_'.$t, $t).$frm->label($t, 'table_'.$t, $t)."
    ".$frm->admin_button('check_verify_sql_record', DBLAN_38)." ".$frm->admin_button('back', LAN_BACK, 'back')."
    "; $ns->tablerender(DBLAN_10.SEP.DBLAN_39, $mes->render().$text); } else { //function to sort the results function verify_sql_record_cmp($a, $b) { $orderby = array('type' => 'asc', 'itemid' => 'asc'); $result = 0; foreach($orderby as $key => $value) { if($a[$key] == $b[$key]) continue; $result = ($a[$key] < $b[$key]) ? - 1 : 1; if($value == 'desc') $result = - $result; break; } return $result; } //function to display the results //$err holds the error data //$ctype holds the tablename function verify_sql_record_displayresult($err, $ctype) { global $frm; usort($err, 'verify_sql_record_cmp'); $text = "
    ".DBLAN_40." ".$ctype." "; if(is_array($err) && !empty($err)) { foreach($err as $k => $v) { $delkey = $v['sqlid']; $text .= " "; } } else { $text .= " "; } $text .= "
    ".DBLAN_41." ".DBLAN_42." ".DBLAN_43." ".LAN_OPTIONS."
    {$v['type']} {$v['itemid']} ".($v['table_exist'] ? DBLAN_45 : DBLAN_46)." ".$frm->checkbox('del_dbrec['.$ctype.']['.$delkey.'][]', '1').$frm->label(LAN_DELETE, 'del_dbrec['.$ctype.']['.$delkey.'][]', '1')."
    {$err}
    "; return $text; } function verify_sql_record_gettables() { $sql2 = e107::getDb('sql2'); //array which will hold all db tables $dbtables = array(); //get all tables in the db $sql2->db_Select_gen("SHOW TABLES"); while($row2 = $sql2->db_Fetch()) { $dbtables[] = $row2[0]; } return $dbtables; } $text = "
    "; //validate rate table records if(isset($_POST['table_rate'])) { $query = " SELECT r.* FROM #rate AS r WHERE r.rate_id!='' ORDER BY r.rate_table, r.rate_itemid"; $data = array('type' => 'rate', 'table' => 'rate_table', 'itemid' => 'rate_itemid', 'id' => 'rate_id'); if(!$sql->db_Select_gen($query)) { $text .= verify_sql_record_displayresult(DBLAN_49, $data['type']); } else { //the master error array $err = array(); //array which will hold all db tables $dbtables = verify_sql_record_gettables(); while($row = $sql->db_Fetch()) { $ctype = $data['type']; $cid = $row[$data['id']]; $citemid = $row[$data['itemid']]; $ctable = $row[$data['table']]; //if the rate_table is an existing table, we need to do more validation //else if the rate_table is not an existing table, this is an invalid reference //FIXME Steve: table is never found without MPREFIX; Multi-language tables? if(in_array(MPREFIX.$ctable, $dbtables)) { $sql3->db_Select_gen("SHOW COLUMNS FROM ".MPREFIX.$ctable); while($row3 = $sql3->db_Fetch()) { //find the auto_increment field, since that's the most likely key used if($row3['Extra'] == 'auto_increment') { $aif = $row3['Field']; break; } } //we need to check if the itemid (still) exists in this table //if the record is not found, this could well be an obsolete record //if the record is found, we need to keep this record since it's a valid reference if(!$sql2->db_Select("{$ctable}", "*", "{$aif}='{$citemid}' ORDER BY {$aif} ")) { $err[] = array('type' => $ctable, 'sqlid' => $cid, 'table' => $ctable, 'itemid' => $citemid, 'table_exist' => TRUE); } } else { $err[] = array('type' => $ctable, 'sqlid' => $cid, 'table' => $ctable, 'itemid' => $citemid, 'table_exist' => FALSE); } } $text .= verify_sql_record_displayresult(($err ? $err : DBLAN_54), $ctype); } } //validate comments table records if(isset($_POST['table_comments'])) { $query = " SELECT c.* FROM #comments AS c WHERE c.comment_id!='' ORDER BY c.comment_type, c.comment_item_id"; $data = array('type' => 'comments', 'table' => 'comment_type', 'itemid' => 'comment_item_id', 'id' => 'comment_id'); if(!$sql->db_Select_gen($query)) { $text .= verify_sql_record_displayresult(DBLAN_49, $data['type']); } else { //the master error array $err = array(); //array which will hold all db tables $dbtables = verify_sql_record_gettables(); //get all e_comment files and variables require_once (e_HANDLER."comment_class.php"); $cobj = new comment(); $e_comment = $cobj->get_e_comment(); while($row = $sql->db_Fetch()) { $ctype = $data['type']; $cid = $row[$data['id']]; $citemid = $row[$data['itemid']]; $ctable = $row[$data['table']]; //for each comment we need to validate the referencing record exists //we need to check if the itemid (still) exists in this table //if the record is not found, this could well be an obsolete record //if the record is found, we need to keep this record since it's a valid reference // news if($ctable == "0") { if(!$sql2->db_Select("news", "*", "news_id='{$citemid}' ")) { $err[] = array('type' => 'news', 'sqlid' => $cid, 'table' => $ctable, 'itemid' => $citemid, 'table_exist' => TRUE); } // article, review or content page } elseif($ctable == "1") { // downloads } elseif($ctable == "2") { if(!$sql2->db_Select("download", "*", "download_id='{$citemid}' ")) { $err[] = array('type' => 'download', 'sqlid' => $cid, 'table' => $ctable, 'itemid' => $citemid, 'table_exist' => TRUE); } // poll } elseif($ctable == "4") { if(!$sql2->db_Select("polls", "*", "poll_id='{$citemid}' ")) { $err[] = array('type' => 'polls', 'sqlid' => $cid, 'table' => $ctable, 'itemid' => $citemid, 'table_exist' => TRUE); } // userprofile } elseif($ctable == "profile") { if(!$sql2->db_Select("user", "*", "user_id='{$citemid}' ")) { $err[] = array('type' => 'user', 'sqlid' => $cid, 'table' => $ctable, 'itemid' => $citemid, 'table_exist' => TRUE); } //else if this is a plugin comment } elseif(isset($e_comment[$ctable]) && is_array($e_comment[$ctable])) { $var = $e_comment[$ctable]; $qryp = ''; //new method must use the 'qry' variable if(isset($var) && $var['qry'] != '') { if($installed = $sql2->db_Select("plugin", "*", "plugin_path = '".$var['plugin_path']."' AND plugin_installflag = '1' ")) { $qryp = str_replace("{NID}", $citemid, $var['qry']); if(!$sql2->db_Select_gen($qryp)) { $err[] = array('type' => $ctable, 'sqlid' => $cid, 'table' => $ctable, 'itemid' => $citemid, 'table_exist' => TRUE); } } //old method } else { if(!$sql2->db_Select($var['db_table'], $var['db_title'], $var['db_id']." = '{$citemid}' ")) { $err[] = array('type' => $ctable, 'sqlid' => $cid, 'table' => $ctable, 'itemid' => $citemid, 'table_exist' => TRUE); } } //in all other cases } else { $err[] = array('type' => $ctable, 'sqlid' => $cid, 'table' => $ctable, 'itemid' => $citemid, 'table_exist' => FALSE); } } $text .= verify_sql_record_displayresult(($err ? $err : DBLAN_54), $ctype); } } $text .= "
    ".$frm->admin_button('delete_verify_sql_record', LAN_DELCHECKED, 'delete')." ".$frm->admin_button('verify_sql_record', LAN_BACK, 'back')."
    "; $ns->tablerender(DBLAN_10.SEP.DBLAN_50, $mes->render().$text); } } */ ?>