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.