Extension: Introduciator SELECT dans SELECT interdit ?

Aide aux auteurs d'extensions pour phpBB 3.2.x

Modérateur: Equipe

Règles du forum
A lire impérativement : Règlement de phpBB-fr.com

Extension: Introduciator SELECT dans SELECT interdit ?

Messagepar Feneck91 » 09 Nov 2020 à 22:35

Bonjour à toutes et à tous.

Dans le cadre de l'extension Introduciator, et après soumission à phpBB et phpBB-fr où elle a été refusée il me reste des remarques que je ne sais pas prendre en compte.
J'ai déjà passé 8h00 à prendre en compte 80% des remarques. Et je suis tellement lent qu'entre deux dev, les règles ont changés, il ya des nouveaux trucs, des trucs qu'on fait plus comme ça, etc, etc... Je deséspère qu'elle soit un jour validée...

Je n'en poserais qu'une seule ici (sinon je vais me faire rappeler à l'ordre) :
[*]les requêtes select dans des select sont interdites. J'ai modifié le code de acp_statistics_controller.php mais il me reste une grosse requête que je ne sais pas splitter :
Code: Tout sélectionner
		$sql_where = $this->db->sql_build_query('SELECT', array(
				'SELECT'	=> 'COUNT(topic_id)',
				'FROM'		=> array(TOPICS_TABLE => TOPICS_TABLE),
				'WHERE'		=> TOPICS_TABLE . '.topic_type = ' . POST_NORMAL . ' AND phpbbtopics.topic_poster = ' . TOPICS_TABLE . '.topic_poster AND ' . TOPICS_TABLE . ".forum_id = {$params['fk_forum_id']} AND " . TOPICS_TABLE . '.topic_visibility = ' . ITEM_APPROVED,
			));
		 $sql = $this->db->sql_build_query('SELECT', array(
			'SELECT'	=> 'COUNT(result.topic_id)',
			'FROM'		=> array(
				$this->db->sql_build_query('SELECT', array(
					'SELECT'	=> 'topic_id',
					'FROM'		=> array(TOPICS_TABLE => 'phpbbtopics'),
					'WHERE'		=> "( {$sql_where} ) > 1",
					'GROUP_BY'	=> 'topic_poster',
				)) => ''),
			)) . " result";
[/list]

phpBB Team a écrit:for better readability and DBMS compatibility please run two separate queries instead.

Si vous avez une idée pour m'aiguiller...

EDIT : URL modifiée, j'ai merdé en supprimant l'option permettant d'activer / désactiver l'extension.
Image

Merci.
Feneck91
Maître-posteur
Maître-posteur
 
Messages: 447
Enregistré le: 31 Déc 2007 à 12:02
Localisation: Essonne (91)

Re: Extension: Introduciator SELECT dans SELECT interdit ?

Messagepar Feneck91 » 11 Nov 2020 à 11:48

J'ai réussi et fait bien plus simple :
La question : est-ce que j'ai le droit d'utiliser HAVING comme mot clef SQL ?
A priori, j'en ai vu dans le code de phpBB donc ça doit être OK.
J'attend la réponse et met en "réglé si c'est bon.

Code: Tout sélectionner
	private function do_check_action()
	{
		$params = $this->helper->introduciator_getparams();

		//
		// Compute number of introductions
		//
		$sql = $this->db->sql_build_query('SELECT', array(
				'SELECT'	=> 'COUNT(topic_id)',
				'FROM'		=> array(TOPICS_TABLE => TOPICS_TABLE),
				'WHERE'		=> TOPICS_TABLE . '.topic_type = ' . POST_NORMAL . ' AND ' . TOPICS_TABLE . ".forum_id = {$params['fk_forum_id']} AND " . TOPICS_TABLE . '.topic_visibility = ' . ITEM_APPROVED,
			));
		$row = $this->db->sql_fetchrow($this->db->sql_query($sql));
		$nb_introductions = reset($row);
		$this->template->assign_vars(array(
			'INTRODUCTIONS_NUMBER' 	=> $nb_introductions,
		));

		//
		// Compute multiple introduction
		//
		$start = $this->request->variable('start', 0);
		//
		// Here, we must check database to see if some user have more than one introduction
		// 1> Get the ids of users that post more than one introduce
		 $sql = $this->db->sql_build_query('SELECT', array(
			'SELECT'	=> 'topic_poster, topic_first_poster_name',
			'FROM'		=> array(TOPICS_TABLE => TOPICS_TABLE),
			'WHERE'		=> TOPICS_TABLE . '.topic_type = ' . POST_NORMAL . ' AND ' . TOPICS_TABLE . '.forum_id = ' . (int) $params['fk_forum_id'] . ' AND ' . TOPICS_TABLE . '.topic_visibility = ' . ITEM_APPROVED,
			'GROUP_BY'	=> 'topic_poster HAVING count(1) > 1' ,
			));

		 // Record all users that have more than one posted intruction and MUST introduce (not ignored)
		$users_ids = array();
		$result = $this->db->sql_query($sql);
		while ($row = $this->db->sql_fetchrow($result))
		{
			if ($this->helper->is_user_must_introduce_himself((int) $row['topic_poster'], null, $row['topic_first_poster_name']))
			{
				// Record this users (not ignored)
				$users_ids[] = (int) $row['topic_poster'];
			}
		}

		$nb_several_introduce = count($users_ids);
		if ($nb_several_introduce > 0)
		{
			$start = min($start, $nb_several_introduce - 1);

			for ($index = $start; $index < min($nb_several_introduce, $start + acp_statistics_controller::NUMBER_ITEMS_BY_PAGE); ++$index)
			{
				// Here, no more need to test if number of introduce > 1 because it is already done just before
				$sql = $this->db->sql_build_query('SELECT', array(
					'SELECT'    => "topic_id, topic_first_post_id, topic_title, topic_visibility, topic_time, topic_poster, topic_first_poster_name, topic_first_poster_colour, topic_type",
					'FROM'      => array(TOPICS_TABLE => TOPICS_TABLE),
					'WHERE'		=> "forum_id = {$params['fk_forum_id']} AND topic_poster = {$users_ids[$index]} AND topic_visibility = " . ITEM_APPROVED . ' AND topic_type = ' . POST_NORMAL,
					'ORDER_BY'	=> 'topic_time',
				));

				$result = $this->db->sql_query($sql);
				$first_row = true;
				while ($row = $this->db->sql_fetchrow($result))
				{
					$link_to_introduce = $this->helper->get_url_to_post($params['fk_forum_id'], $row['topic_id'], $row['topic_first_post_id']);

					$this->template->assign_block_vars('introduces', array(
						'FIRST_ROW_SPAN'	=> $first_row,
						'ROW_SPAN'			=> $result->num_rows,
						'POSTER'			=> get_username_string('full', $row['topic_poster'], $row['topic_first_poster_name'], $row['topic_first_poster_colour']),
						'DATE'				=> $this->user->format_date($row['topic_time']),
						'INTRODUCE'			=> "<a href=\"{$link_to_introduce}\">{$row['topic_title']}</a>",
						'ROW_NUMBER'		=> $index - $start + 1,
					));
					$first_row = false;
				}
				$this->db->sql_freeresult($result);
			}
			$this->template->assign_vars(array(
				'S_DISPLAY_INTRODUCES'		=> ($nb_several_introduce > 0) ? true : false,
				'PAGE_NUMBER' 				=> $this->pagination->validate_start($nb_several_introduce, acp_statistics_controller::NUMBER_ITEMS_BY_PAGE, $start),
			));
			$this->pagination->generate_template_pagination($this->u_action . "&amp;action=otherpage", 'pagination', 'start', $nb_several_introduce, acp_statistics_controller::NUMBER_ITEMS_BY_PAGE, $start);
		}

		$this->template->assign_vars(array(
			'U_ACTION'					=> $this->u_action,
			'S_CHECK_DATABASE'			=> true,
		));
	}
}
Feneck91
Maître-posteur
Maître-posteur
 
Messages: 447
Enregistré le: 31 Déc 2007 à 12:02
Localisation: Essonne (91)

Re: Extension: Introduciator SELECT dans SELECT interdit ?

Messagepar Skouat » 11 Nov 2020 à 18:27

Hello,

J'ai un doute avec la requête qui utilise le GROUP BY.
Il faut la tester avec une version de MySQL en mode strict.
Skouat
Resp. Traducteurs
Resp. Traducteurs
 
Messages: 14714
Enregistré le: 02 Avr 2008 à 19:47

Re: Extension: Introduciator SELECT dans SELECT interdit ?

Messagepar Feneck91 » 11 Nov 2020 à 21:33

Et je fais comment pour tester ça ? Perso j'avais plus un doute sur le HAVING...
Feneck91
Maître-posteur
Maître-posteur
 
Messages: 447
Enregistré le: 31 Déc 2007 à 12:02
Localisation: Essonne (91)

Re: Extension: Introduciator SELECT dans SELECT interdit ?

Messagepar Skouat » 12 Nov 2020 à 10:45

https://stackoverflow.com/a/40889485

Car selon moi, ton Group By n'est pas bien contruit.
Tu définies deux champs au niveau du SELECT, alors que tu ne fais qu'un regroupement sur un seul des deux.
Ce qui retournera une erreur si tu utilises MySQL (ou MariaDB) en mode Strict.
Skouat
Resp. Traducteurs
Resp. Traducteurs
 
Messages: 14714
Enregistré le: 02 Avr 2008 à 19:47


Retourner vers Aide au développement

 


  • Articles en relation
    Réponses
    Vues
    Dernier message

Qui est en ligne

Utilisateurs parcourant ce forum : Aucun utilisateur enregistré et 2 invités