Jump to content

[solucionado] error en un controlador con php superior a 5.3


rastreator

Recommended Posts

EDITADO: 

 

Tenía un error en el módulo de feedback en la página feedbackview, que se debía a que no es compatible con la versión de php 5.4, por lo que la solución fue cambiar a php 5.3

 

¿Cómo se tendría que escribir esta línea de código para que no de un fatal error en php 5.4 y 5.5? (me interesa la 5.5 principalmente).

$nbProducts = (int)(self::$this->getFeedback($id_lang, isset($p) ? (int)($p) - 1 : NULL, isset($n) ? (int)($n) : NULL, true));

(El resto del código está en los siguientes post íntegro).

 

 

El resto de la tienda parece que funciona bien con php 5.5, y el motivo de interesarme en actualizar, es que ahora me da problemas de fragmentación el cache APC que uso, por lo que lo he desactivado, y me comentan en loading (hosting que uso) que con opcache (disponible en php 5.5) eso no pasa, pero para usar esa versión debería solucionar antes el problema con ese módulo.

 

¿Es posible adaptar esa línea nada más a php 5.5, o es más complicado que eso?

 

¿Cómo habría que reescribirla?

 

Mil gracias.

Edited by rastreator (see edit history)
Link to comment
Share on other sites

¡Hola Shacker!

 

Qué coincidencia, justo hace unos minutos me acaban de decir los del hosting que el error está en esa línea...

 

Lo que hay ahí es esto:

$nbProducts = (int)(self::$this->getFeedback($id_lang, isset($p) ? (int)($p) - 1 : NULL, isset($n) ? (int)($n) : NULL, true));

El archivo entero (por si quieres ver el contexto) es este:

<?php
/*Copyright 2011 ciroco05  email: [email protected]

This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License, version 3, as 
published by the Free Software Foundation.

This file can't be removed. This module can't be sold.

This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
GNU General Public License for more details.

You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.

*/

class ViewfeedbackControllerCore extends FrontController
{
	public $php_self = 'viewfeedback.php';
	public $ssl = true;
	
	public function process()
	{
		parent::process();
		
		$result = array();
		
		$id_lang = (int)self::$cookie->id_lang;
		if (!$id_lang)
			$id_lang = (int)(Configuration::get('PS_LANG_DEFAULT'));
		
		$nbProducts = (int)(self::$this->getFeedback($id_lang, isset($p) ? (int)($p) - 1 : NULL, isset($n) ? (int)($n) : NULL, true));
				 
		$nArray = array(10, 20, 50);
		// Clean duplicate values
		$nArray = array_unique($nArray);
		asort($nArray);
		$n = abs((int)(Tools::getValue('n', ((isset(self::$cookie->nb_item_per_page) AND self::$cookie->nb_item_per_page >= 10) ? self::$cookie->nb_item_per_page : (int)(10)))));
		$p = abs((int)(Tools::getValue('p', 1)));
		
		$current_url = tools::htmlentitiesUTF8($_SERVER['REQUEST_URI']);
		//delete parameter page
		$current_url = preg_replace('/(\?)?(&)?p=\d+/', '$1', $current_url);
		
		$range = 2; /* how many pages around page selected */
		 
		if ($p < 0)
			$p = 0;

		if (isset(self::$cookie->nb_item_per_page) AND $n != self::$cookie->nb_item_per_page AND in_array($n, $nArray))
			self::$cookie->nb_item_per_page = $n;

		if ($p > ($nbProducts / $n))
			$p = ceil($nbProducts / $n);
		$pages_nb = ceil($nbProducts / (int)($n));

		$start = (int)($p - $range);
		if ($start < 1)
			$start = 1;
		$stop = (int)($p + $range);
		if ($stop > $pages_nb)
			$stop = (int)($pages_nb);
		
		$fdbs = self::$this->getFeedback($id_lang, (int)($p) - 1, (int)($n), false);

		self::$smarty->assign(array(
		   'nb_products' => $nbProducts,
		   'fdbs' => $fdbs,
			'products_per_page' => (int)Configuration::get('PS_PRODUCTS_PER_PAGE'),
		   'pages_nb' => (int)($pages_nb),
		   'p' => (int)($p),
		   'n' => (int)($n),
		   'nArray' => $nArray,
		   'range' => (int)($range),
		   'start' => (int)($start),
		   'stop' => (int)($stop),
			'current_url' => $current_url
		));
	}
	
	private function getFeedback($id_lang, $pageNumber = 0, $nbProducts = 10, $count = false)
	{
		if ($pageNumber < 0) $pageNumber = 0;
		if ($nbProducts < 1) $nbProducts = 10;
		
		if ($count)
		{
			$result = Db::getInstance(_PS_USE_SQL_SLAVE_)->getRow('
				SELECT COUNT(`id_fb`) AS nb
				FROM `'._DB_PREFIX_.'feedback`
				WHERE `status` = 1
				AND `permission` = 1');
			
			return (int)($result['nb']);
		}
		
		$result = Db::getInstance(_PS_USE_SQL_SLAVE_)->ExecuteS('
			SELECT *
			FROM `'._DB_PREFIX_.'feedback`
			WHERE `status` = 1
			AND `permission` = 1
			ORDER BY `date` DESC
			LIMIT '.(int)($pageNumber * $nbProducts).', '.(int)($nbProducts));
		
		$i = 0;	
		foreach ($result AS $dat)
		{
			$result[$i]['id_fb'] = $dat['id_fb'];
			$result[$i]['date'] = (((int)(Configuration::get('FDBFORMATDATA')) == 0) ? date('d-m-Y', strtotime($dat['date'])) : date('Y-m-d', strtotime($dat['date'])));
			$result[$i]['name'] = $dat['name'];
			$result[$i]['email'] = "";
			$result[$i]['feedback'] = nl2br($dat['feedback']);
			$result[$i]['permission'] = $dat['permission'];
			$result[$i]['status'] = $dat['status'];
			$result[$i]['answer'] = nl2br($dat['answer']);
			$i++;
		}
		if (!$result)
			return false;
		
		return $result;
	}
	
	public function displayContent()
	{
		parent::displayContent();
		
		self::$smarty->display(_PS_MODULE_DIR_.'feedback/viewfeedback.tpl');
	}
}
Edited by rastreator (see edit history)
Link to comment
Share on other sites

¿alguna pista?

 

¡No entiendo por qué tengo este error! 

 

Fatal error: Access to undeclared static property: ViewfeedbackControllerCore::$this in /var/www/vhosts/nosolopixel.com/httpdocs/controllers/ViewfeedbackController.php on line 35

 

No he cambiado nada en el módulo, de un día para otro dejó de funcionar....

 

La línea 35 de ese archivo es la misma en todas las versiones que he probado de ese módulo (y el archivo es idéntico en todas), he probado restaurando el módulo, los controladores y las páginas php de un backup de hace unos meses (cuando funcionaba bien) y sigue dando el error

Link to comment
Share on other sites

  • 2 weeks later...

coloca una arroba en esa linea

 

@$nbProducts = (int)(self::$this->getFeedback($id_lang, isset($p) ? (int)($p) - 1 : NULL, isset($n) ? (int)($n) : NULL, true));

 

Gracias shacker por la solución, finalmente era porque se "cambió" (yo no toqué nada...) en el hosting la versión de php (también falló otro módulo), la volví a poner en 5.3 y ahora todo vuelve a funcionar bien sin cambiar nada en los módulos.

 

Un saludo.

Edited by rastreator (see edit history)
Link to comment
Share on other sites

  • 2 weeks later...

Tenía un error en el módulo de feedback en la página feedbackview, que se debía a que no es compatible con la versión de php 5.4, por lo que la solución fue cambiar a php 5.3

 

¿Cómo se tendría que escribir esta línea de código para que no de un fatal error en php 5.4 y 5.5? (me interesa la 5.5 principalmente).

 

Esta es la ĺínea que da error:

$nbProducts = (int)(self::$this->getFeedback($id_lang, isset($p) ? (int)($p) - 1 : NULL, isset($n) ? (int)($n) : NULL, true));

Ya probé a poner una @ delante como decia shacker, pero en php 5.4 y 5.5 sigue dando el mismo error.

 

 

Aquí el código entero del archivo:

    <?php
    /*Copyright 2011 ciroco05 email: [email protected]
     
    This program is free software; you can redistribute it and/or modify
    it under the terms of the GNU General Public License, version 3, as
    published by the Free Software Foundation.
     
    This file can't be removed. This module can't be sold.
     
    This program is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
    GNU General Public License for more details.
     
    You should have received a copy of the GNU General Public License
    along with this program. If not, see <http://www.gnu.org/licenses/>.
     
    */
     
    class ViewfeedbackControllerCore extends FrontController
    {
    public $php_self = 'viewfeedback.php';
    public $ssl = true;
    public function process()
    {
    parent::process();
    $result = array();
    $id_lang = (int)self::$cookie->id_lang;
    if (!$id_lang)
    $id_lang = (int)(Configuration::get('PS_LANG_DEFAULT'));
    $nbProducts = (int)(self::$this->getFeedback($id_lang, isset($p) ? (int)($p) - 1 : NULL, isset($n) ? (int)($n) : NULL, true));
    $nArray = array(10, 20, 50);
    // Clean duplicate values
    $nArray = array_unique($nArray);
    asort($nArray);
    $n = abs((int)(Tools::getValue('n', ((isset(self::$cookie->nb_item_per_page) AND self::$cookie->nb_item_per_page >= 10) ? self::$cookie->nb_item_per_page : (int)(10)))));
    $p = abs((int)(Tools::getValue('p', 1)));
    $current_url = tools::htmlentitiesUTF8($_SERVER['REQUEST_URI']);
    //delete parameter page
    $current_url = preg_replace('/(\?)?(&)?p=\d+/', '$1', $current_url);
    $range = 2; /* how many pages around page selected */
    if ($p < 0)
    $p = 0;
     
    if (isset(self::$cookie->nb_item_per_page) AND $n != self::$cookie->nb_item_per_page AND in_array($n, $nArray))
    self::$cookie->nb_item_per_page = $n;
     
    if ($p > ($nbProducts / $n))
    $p = ceil($nbProducts / $n);
    $pages_nb = ceil($nbProducts / (int)($n));
     
    $start = (int)($p - $range);
    if ($start < 1)
    $start = 1;
    $stop = (int)($p + $range);
    if ($stop > $pages_nb)
    $stop = (int)($pages_nb);
    $fdbs = self::$this->getFeedback($id_lang, (int)($p) - 1, (int)($n), false);
     
    self::$smarty->assign(array(
    'nb_products' => $nbProducts,
    'fdbs' => $fdbs,
    'products_per_page' => (int)Configuration::get('PS_PRODUCTS_PER_PAGE'),
    'pages_nb' => (int)($pages_nb),
    'p' => (int)($p),
    'n' => (int)($n),
    'nArray' => $nArray,
    'range' => (int)($range),
    'start' => (int)($start),
    'stop' => (int)($stop),
    'current_url' => $current_url
    ));
    }
    private function getFeedback($id_lang, $pageNumber = 0, $nbProducts = 10, $count = false)
    {
    if ($pageNumber < 0) $pageNumber = 0;
    if ($nbProducts < 1) $nbProducts = 10;
    if ($count)
    {
    $result = Db::getInstance(_PS_USE_SQL_SLAVE_)->getRow('
    SELECT COUNT(`id_fb`) AS nb
    FROM `'._DB_PREFIX_.'feedback`
    WHERE `status` = 1
    AND `permission` = 1');
    return (int)($result['nb']);
    }
    $result = Db::getInstance(_PS_USE_SQL_SLAVE_)->ExecuteS('
    SELECT *
    FROM `'._DB_PREFIX_.'feedback`
    WHERE `status` = 1
    AND `permission` = 1
    ORDER BY `date` DESC
    LIMIT '.(int)($pageNumber * $nbProducts).', '.(int)($nbProducts));
    $i = 0;	
    foreach ($result AS $dat)
    {
    $result[$i]['id_fb'] = $dat['id_fb'];
    $result[$i]['date'] = (((int)(Configuration::get('FDBFORMATDATA')) == 0) ? date('d-m-Y', strtotime($dat['date'])) : date('Y-m-d', strtotime($dat['date'])));
    $result[$i]['name'] = $dat['name'];
    $result[$i]['email'] = "";
    $result[$i]['feedback'] = nl2br($dat['feedback']);
    $result[$i]['permission'] = $dat['permission'];
    $result[$i]['status'] = $dat['status'];
    $result[$i]['answer'] = nl2br($dat['answer']);
    $i++;
    }
    if (!$result)
    return false;
    return $result;
    }
    public function displayContent()
    {
    parent::displayContent();
    self::$smarty->display(_PS_MODULE_DIR_.'feedback/viewfeedback.tpl');
    }
    }

El resto de la tienda parece que funciona bien con php 5.5, y el motivo de interesarme en actualizar, es que ahora me da problemas de fragmentación el cache APC que uso, por lo que lo he desactivado, y me comentan en loading (hosting que uso) que con opcache (disponible en php 5.5) eso no pasa, pero para usar esa versión debería solucionar antes el problema con ese módulo.

 

¿Es posible adaptar esa línea nada más a php 5.5, o es más complicado que eso?

 

¿Cómo habría que reescribirla?

 

Mil gracias.

Link to comment
Share on other sites

Finalmente me han solucionado el problema los de loading, y les estoy muy agradecido.

 

La solución fue cambiar esa línea 35

$nbProducts = (int)(self::$this->getFeedback($id_lang, isset($p) ? (int)($p) - 1 : NULL, isset($n) ? (int)($n) : NULL, true));

Por esta otra

$nbProducts = (int)($this->getFeedback($id_lang, isset($p) ? (int)($p) - 1 : NULL, isset($n) ? (int)($n) : NULL, true));

en el archivo /controllers/ViewFeedbackController.php

 

O lo que es lomismo, cambiar self::$this por simplemente $this

Link to comment
Share on other sites

  • nadie locked this topic
Guest
This topic is now closed to further replies.
×
×
  • Create New...