IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

PHP & Base de données Discussion :

Cherche a optimiser une boucle avec SELECT [.] FROM [.] IN


Sujet :

PHP & Base de données

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    96
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 96
    Par défaut Cherche a optimiser une boucle avec SELECT [.] FROM [.] IN
    Bonjour,

    Je suis entrain de coder ma petite fonction permettant grace a ob_start de redefinir en url rewriting chaque lien de mes pages.

    Seul soucis rencontré, je passe de 4 à 30 reqs environ par page (26 pour les urls).

    Voila la fonction utilisé par le tampon :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    function replace_mod_rewriting($contents)
    {
    	$http  = 'http://www2.moviefactory.fr/';
    	// Récupérer les liens videos à l'aide d'une expression régulière
    	if(preg_match_all(
    		'#<a href="fiche-video.php\?id=([0-9]+)">(.+)</a>#Usi',
    		$contents,
    		$matches,
    		PREG_SET_ORDER))
    	{
     
    		// Parcourir les liens et les réécrire à l'aide de la base de données
    		foreach($matches as $match){
    			$pattern = $match[0];
    			$article_id = $match[1];
    			$anchor = $match[2];
     
    			$sql = 'SELECT `id`,`nom` FROM `videos` WHERE `id` = '.$article_id;
    			$result = sql_query($sql,'AFFICHE TITRE VIDEO POUR REWRITING');
     
    			if($article = mysql_fetch_assoc($result)){
    			$new_url =
    				'<a href="'.$http.'videos/'.rewriting($article['nom']).'-'.$article['id'].'.html" '
    					.'title="'.$article['nom'].'">'
    					.$anchor
    					.'</a>';
    			$contents = str_replace($pattern, $new_url, $contents);
    			}
     
    		}
     
     
    	}
     
     
    	// Afficher la page
    	echo $contents;
    }
    Comme vous pouvez le voir (enfin j'espère) chaque lien appelle une requête sql, pas top...

    Alors on m'a parlé du IN dans ma requête afin de faire tous les liens d'un table d'un coup.

    Mais après moultes testes infructueux, j'en appelle à vous.

    Comment je peux m'en sortir pour éviter tout ceci ?

    Merci d'avance.

  2. #2
    Membre Expert
    Avatar de Eusebe
    Inscrit en
    Mars 2006
    Messages
    1 992
    Détails du profil
    Informations personnelles :
    Âge : 47

    Informations forums :
    Inscription : Mars 2006
    Messages : 1 992
    Par défaut
    Bonjour,

    Pour ce qui concerne la requête, il faut que tu l'écrives sous la forme :
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT `id`,`nom` FROM `videos` WHERE `id` IN (id1, id2, id3)

    Pour cela, la solution la plus simple (sans prendre en compte le reste de ton code), c'est d'utiliser le flag PREG_PATTERN_ORDER pour preg_match_all, puis faire quelque chose comme :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    if(preg_match_all(
        '#<a href="fiche-video.php\?id=([0-9]+)">(.+)</a>#Usi',
        $contents,
        $matches,
        PREG_PATTERN_ORDER))
    {
        $id_list = implode(',', $match[1]);
        $sql = 'SELECT `id`,`nom` FROM `videos` WHERE `id` IN ('.$id_list.')';
        //...
    }

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    96
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 96
    Par défaut
    Merci de ta réponse.

    Après quelques tests, je me retrouve avec un petit problème surement pas méchant.

    Une fois réalisé le while de ma requête, comment réassocié chaque lien avec son originial, car le str_replace se faisait a chaque tour, et donc la nouvelle url etait bien associé avec l'ancienne.

    maintenant puisque je le sort ma requete du foreach, comment faire la relation ?

    merci

  4. #4
    Membre Expert
    Avatar de Eusebe
    Inscrit en
    Mars 2006
    Messages
    1 992
    Détails du profil
    Informations personnelles :
    Âge : 47

    Informations forums :
    Inscription : Mars 2006
    Messages : 1 992
    Par défaut
    Il y a plusieurs solutions...

    Si tes identifiants sont bien uniques dans le texte de départ, tu peux essayer de trier les tableaux de la même façon que les données de la requête, par exemple (non testé, écrit à la volée...) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    if(preg_match_all(
        '#<a href="fiche-video.php\?id=([0-9]+)">(.+)</a>#Usi',
        $contents,
        $matches,
        PREG_PATTERN_ORDER))
    {
        array_multisort($matches[1], SORT_ASC, SORT_NUMERIC, $matches[0], $matches[2]);
     
        $id_list = implode(',', $matches[1]);
        $sql = 'SELECT `id`,`nom` FROM `videos` WHERE `id` IN ('.$id_list.') ORDER BY id';
     
        $result = sql_query($sql,'AFFICHE TITRE VIDEO POUR REWRITING');
        $article_id_sql = NULL;
     
        foreach ($matches[0] as $i => $pattern)
        {
            $article_id = $matches[1][$i];
            $anchor = $matches[2][$i];
     
            // si on n'est pas sur le bon article, on avance d'un enregistrement sql
            if ($article_id_sql >= $article_id)
            {
                $article = mysql_fetch_assoc($result))
                $article_id_sql = $article['id'];
            }
     
            // maintenant on devrait avoir le bon id, sinon, c'est que la requête n'a rien ramené pour cet id
            if ($article_id_sql == $article_id)
            {
                //...
            }
        }
    }
    Une autre solution, certainement meilleure à long terme (car elle permettra plus facilement de séparer le code de récupération des données et le code 'affichage), c'est de créer ton propre tableau associatif multi-dimensionnel qui serait par exemple organisé comme ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    array([1] => array(['name'] => "nom de l'article", ['anchor'] => "anchor", ['pattern'] => "pattern"),
        [2] => array(['name'] => ... ))

Discussions similaires

  1. Réponses: 6
    Dernier message: 18/11/2011, 17h09
  2. Réponses: 4
    Dernier message: 15/06/2006, 10h05
  3. Faire une boucle avec des variables vides ?
    Par byloute dans le forum Linux
    Réponses: 5
    Dernier message: 23/02/2006, 09h33
  4. Réponses: 4
    Dernier message: 17/01/2006, 19h17
  5. [DEBUTANT] sortir d'une boucle avec un touche particulière
    Par thibouille dans le forum Débuter
    Réponses: 4
    Dernier message: 25/10/2005, 06h44

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo