Jump to content

Pscleaner: error al pulsar "Functional integrity constraints"


Recommended Posts

Hola Buenos días,

 

Vaya por delante que llevo poco tiempo montando tiendas prestashop.

 

El otro día me llegó un mensaje del hosting, de mi cliente, indicando que no se podía hacer la copia de seguridad de la base de datos, indicandome que el error generado era:

 

Error: Couldn't read status information for table ps_customer_message_sync_imap () mysqldump: Couldn't execute 'show create table `ps_customer_message_sync

 

Ante tal situación busqué un plugins que optimizace la base de datos, para ver si por ahí se podía arreglar el problema.

 

Instalé el pscleaner y le dí a la función "Functional integrity constraints", creyendo que por ahí irían los tiros.

 

Como resultado no sólo seguía sin poder hacer la copia de seguridad y se añadío otro que me aparece en la parte superior de la tienda y que muestra el siguiente error:

 

"Warning: Invalid argument supplied for foreach() in ...lagatitalulu.com/web/classes/Product.php on line 3218".

 

No sé si alguno ha tenido un problema parecido. ¿Alguién me puede echar una mano?, no sé por donde tirar, ya que he estado mirando por los foros y no veo nada.

 

Muchas gracias.

 

Me olvidaba, la versión de Prestashop es la 1.5.3.1 y la del PSCleaner pone la 1.5

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

No sé si lo he solucionado o no, ya que no sé que implicaciones posteriores puede tener pero creo que ninguna, ya que se trata de un "if". Lo que sí es cierto es que no me aparece el error en la cabecera de la tienda.

 

Os pongo el código de la función donde se encontraba el foreach que lanzaba el error

public static function cacheFrontFeatures($product_ids, $id_lang)
	{
		if (!Feature::isFeatureActive())
			return;

		$product_implode = array();
		foreach ($product_ids as $id_product)
			if ((int)$id_product && !array_key_exists($id_product.'-'.$id_lang, self::$_cacheFeatures))
				$product_implode[] = (int)$id_product;
		if (!count($product_implode))
			return;

		$result = Db::getInstance(_PS_USE_SQL_SLAVE_)->executeS('
		SELECT id_product, name, value, pf.id_feature
		FROM '._DB_PREFIX_.'feature_product pf
		LEFT JOIN '._DB_PREFIX_.'feature_lang fl ON (fl.id_feature = pf.id_feature AND fl.id_lang = '.(int)$id_lang.')
		LEFT JOIN '._DB_PREFIX_.'feature_value_lang fvl ON (fvl.id_feature_value = pf.id_feature_value AND fvl.id_lang = '.(int)$id_lang.')
		LEFT JOIN '._DB_PREFIX_.'feature f ON (f.id_feature = pf.id_feature)
		WHERE `id_product` IN ('.implode($product_implode, ',').')
		ORDER BY f.position ASC');
		
		foreach ($result as $row)
		{
			if (!array_key_exists($row['id_product'].'-'.$id_lang, self::$_frontFeaturesCache))
				self::$_frontFeaturesCache[$row['id_product'].'-'.$id_lang] = array();
			if (!isset(self::$_frontFeaturesCache[$row['id_product'].'-'.$id_lang][$row['id_feature']]))
				self::$_frontFeaturesCache[$row['id_product'].'-'.$id_lang][$row['id_feature']] = $row;
		}
		
	}

Lo que he modificado es la inclusión de un condicional donde verifico si existe la variable $result , de la siguiente manera

if($result){
		foreach ($result as $row)
		{
			if (!array_key_exists($row['id_product'].'-'.$id_lang, self::$_frontFeaturesCache))
				self::$_frontFeaturesCache[$row['id_product'].'-'.$id_lang] = array();
			if (!isset(self::$_frontFeaturesCache[$row['id_product'].'-'.$id_lang][$row['id_feature']]))
				self::$_frontFeaturesCache[$row['id_product'].'-'.$id_lang][$row['id_feature']] = $row;
		}
		}

No sé si es lo mas correcto, pero como dije antes no me muestra el error.

Link to comment
Share on other sites

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