Olen vaihtanut PHP 5.6:sta 7.4-versioon ja samalla olen vaihtanut tietokantasysteemit mysql-funktioista mysqli-funktioihin. Mutta jostain syystä ei suostu toimimaan.
Jos render-funktiota kutsutaan, niin lopulta tulee seuraava virheilmoitus:
PHP Fatal error: Uncaught Error: Call to undefined method mysqli_result::MoveFirst()
Eli kun käytössä oli PHP 5.6 ja tietokantaan otettiin yhteyttä mysql-fuktioilla eikä mysqli, kaikki toimi.
Ongelmana on myös se, että class MX_TreeMenu ei tunnu löytävän class MX_TreeMenu_recordset:ssä määritettyjä funktioita. Vanhalla PHP:lla ja tietokantasysteemillä kaikki toimi hyvin.
Miten saisin asian korjattua?
MX_TreeMenu.inc.php
class MX_TreeMenu { var $menuName; var $menuItems; var $menuOutput; var $DBItems; var $query; var $menuPK; var $menuFK; var $menuNameField; var $menuTitleField; var $menuLink; var $menuURLParameter; var $menuTarget; var $menuLinkField; var $menuTargetField; var $menuLevel; var $menuHighlight; var $isStatic; var $isStaticURL; var $previousItemLevel; function __construct ($menuName, $menuDepthSeparator = ' ') { // muokattu PHP 7.4 -versiossa, sillä PHP 5.6 -versiossa oli: function MX_TreeMenu ($menuName, $menuDepthSeparator = ' ') { $this->menuName = $menuName; $this->menuDepthSeparator = $menuDepthSeparator; $this->menuItems = array(); $this->DBItems = array(); $this->previousItemLevel = -1; $this->menuLevel = -1; // -1 means menuLevel is not taken into account $this->menuHighlight = false; $this->menuOutput = ''; } function render () { if (strlen($this->menuOutput) == 0) { if ($this->isStatic) { $this->menuOutput = $this->_renderStatic(); } else { $this->menuOutput = $this->_renderDynamic(); } } $this->menuOutput = html_entity_decode($this->menuOutput); return $this->menuOutput; } function _renderStatic () { $request_uri = $query_string = ''; if (isset($_SERVER['SCRIPT_NAME'])) { $request_uri = $_SERVER['SCRIPT_NAME']; } elseif (isset($_ENV['SCRIPT_NAME'])) { $request_uri = $_ENV['SCRIPT_NAME']; } $query_string = $_ENV['QUERY_STRING']; if (strlen($query_string) > 0) { $request_uri .= '?' . $query_string; } $return = '<div class="ktcsstree">'; $return .= "<ul>\r\n"; $nextItemLevel = 0; for ($i=0; $i < count($this->menuItems); $i++) { $myItem = $this->menuItems[$i]; if ($i < (count($this->menuItems) - 1) ) { $nextItemLevel = $this->menuItems[$i + 1]['itemLevel']; } else { $nextItemLevel = 0; } $url = $myItem['itemURL']; $itemLi = '<li>'; if ($this->menuHighlight) { if ($this->checkHighlight($url, $request_uri)) { $itemLi = '<li class="selected">'; $this->menuHighlight = false; } } $return .= $itemLi; $return .= '<a href="' . $url . '"'; if (strlen($myItem['itemTarget']) > 0) { $return .= ' target="' . $myItem['itemTarget'] . '"'; } if (strlen($myItem['itemTitle']) > 0) { $return .= ' title="' . $myItem['itemTitle'] . '"'; } $return .= '>'; $return .= $myItem['itemName']; $return .= '</a>'; if ($nextItemLevel <= $myItem['itemLevel']) { $return .= "</li>\r\n"; } if ($nextItemLevel < $myItem['itemLevel']) { $repeat = $myItem['itemLevel'] - $nextItemLevel; $return .= str_repeat("</ul></li>\r\n", $repeat); } if ($nextItemLevel > $myItem['itemLevel']) { $repeat = $nextItemLevel - $myItem['itemLevel']; $return .= str_repeat("<ul>\r\n", $repeat); } } $return .= "</ul>\r\n"; $return .= "</div>\r\n"; if (count($this->menuItems) == 0) { $return = 'No data to render.'; } return $return; } function _renderDynamic () { $this->_getUnformatedData(); if (count($this->DBItems) > 0) { $this->_formatData(0, 0, $this->menuLevel); } return $this->_renderStatic(); } function _getUnformatedData () { $this->DBItems = array(); if (is_resource($this->query)) { include_once('MX_TreeMenu_recordset.class.php'); $rs = new MX_TreeMenu_recordset($this->query); } else { $rs = &$this->query; $rs->MoveFirst(); // TÄMÄ ANTAA KERTOMANI VIRHEILMOITUKSEN } while (!$rs->EOF) { $myItem = array(); $myItem['itemName'] = htmlentities(stripslashes(trim($rs->Fields($this->menuNameField)))); $target = ''; if ($this->isStaticURL) { $url = $this->menuLink . $rs->Fields($this->menuURLParameter); $target = $this->menuTarget; } else { $url = $rs->Fields($this->menuLinkField); if (isset($this->menuTargetField) && strlen($this->menuTargetField) > 0) { $target = $rs->Fields($this->menuTargetField); } } $myItem['itemURL'] = $url; $myItem['itemTarget'] = $target; $myItem['itemLevel'] = 0; $title = ''; if (isset($this->menuTitleField) && strlen($this->menuTitleField) > 0) { $title = htmlentities(stripslashes(trim($rs->Fields($this->menuTitleField)))); } $myItem['itemTitle'] = $title; $pk = $rs->Fields($this->menuPK); $fk = (int)$rs->Fields($this->menuFK); $myArr = array(); $myArr['data'] = $myItem; $this->DBItems[$fk][$pk] = $myArr; $rs->MoveNext(); } if (!is_resource($this->query)) { $rs->MoveFirst(); } } function _formatData ($key, $level, $maxLevel) { foreach ($this->DBItems[$key] as $pk => $value) { $value['data']['itemLevel'] = $level; array_push($this->menuItems, $value['data']); if (($maxLevel < 0 || $level + 1 < $maxLevel) && isset($this->DBItems[$pk])) { // use $maxLevel only if positive $this->_formatData($pk, $level + 1, $maxLevel); } } } }
MX_TreeMenu_recordset.class.php
class MX_TreeMenu_recordset { var $resource = null; var $fields = array(); var $EOF = true; /** * The constructor * @param object ResourceID &$resource - the recordset resource id * @access public */ function MX_TreeMenu_recordset(&$resource) { $this->resource = &$resource; if (mysqli_num_rows($this->resource) > 0) { // korvattu PHP 7.4 -versiossa: if (mysql_num_rows($this->resource) > 0) { mysqli_data_seek($this->resource, 0); // korvattu PHP 7.4 -versiossa: mysql_data_seek($this->resource, 0); } $this->fields = mysqli_fetch_assoc($this->resource); // korvattu PHP 7.4 -versiossa: mysql_fetch_assoc($this->resource); $this->EOF = ($this->fields)?false:true; } }
Olet jättänyt koodistasi suuren osan pois, joten ei käy ilmi, missä $this->query asetetaan. Joka tapauksessa virheen perusteella siinä on nyt olio, jonka tyyppi on mysqli_result. Kuitenkin if-lauseessa tutkit, onko kyseessä resurssi, jollainen olisi vanhassa mysql-laajennuksessa haun tuloksena. Vaihda is_resource-tarkastuksen tilalle $this->query instanceof mysqli_result
, niin vältät tuon virheen.
Kaikkiin funktioihin pitäisi lisätä näkyvyysalueet (public, protected, private) ja myös jäsenmuuttujiin var-sanan tilalle sopiva näkyvyysalue, ja jälkimmäisen luokan konstruktorin nimeksi pitäisi vaihtaa __construct.
Metabolix kirjoitti:
$this->query instanceof mysqli_result
, niin vältät tuon virheen.
Kiitos erittäin paljon!
Aihe on jo aika vanha, joten et voi enää vastata siihen.