Kirjautuminen

Haku

Tehtävät

Keskustelu: Nettisivujen teko: PHP 5.6 ja MySQL -> PHP 7.4 ja MySQLi

xxmss [04.03.2021 13:15:47]

#

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;
	}
}

Metabolix [04.03.2021 21:51:51]

#

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.

xxmss [04.03.2021 23:26:05]

#

Metabolix kirjoitti:

$this->query instanceof mysqli_result, niin vältät tuon virheen.

Kiitos erittäin paljon!

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta