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

Langage PHP Discussion :

Utilisation de str_replace sur des tableaux [PHP 7]


Sujet :

Langage PHP

  1. #1
    Membre averti Avatar de renaud26
    Homme Profil pro
    Webmaster
    Inscrit en
    Mars 2003
    Messages
    1 365
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Côtes d'Armor (Bretagne)

    Informations professionnelles :
    Activité : Webmaster

    Informations forums :
    Inscription : Mars 2003
    Messages : 1 365
    Points : 436
    Points
    436
    Par défaut Utilisation de str_replace sur des tableaux
    Bonjour à tous,

    Mon but est de modifier tous les liens de champs text issus de ma BDD.
    Après mon tri je me retrouve avec 3 tableaux: les anciens liens ($links), les nouveaux liens ($new_links) et le texte ($chaine). Les clefs sont les ID des textes.
    Dans chaque texte, il peut y avoir plusieurs liens à changer :

    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
    39
    40
    41
    42
    43
     
    Array
    (
        [3018] => Array
            (
                [0] => https://www.toto.com/401-osmoseur-rgnrateur-aqua-avanti-em.html
                [1] => https://www.toto.com/401-osmoseur-rgnrateur-aqua-avanti-em.html
                [2] => https://www.toto.com/401-osmoseur-rgnrateur-aqua-avanti-em.html
                [3] => https://www.toto.com/401-osmoseur-rgnrateur-aqua-avanti-em.html
                [4] => https://www.toto.com/401-osmoseur-rgnrateur-aqua-avanti-em.html
            )
     
        [3024] => Array
            (
                [0] => https://www.toto.com/1619-la-mdecine-nouvelle-germanique-livre-du-dr-ryke-geerd-hamer-1619.html
                [1] => https://www.toto.com/1521-la-cure-de-tous-les-herpes-hulda-clark-9780984112937.html
            )
     
    )
     
    Array
    (
        [3018] => Array
            (
                [0] => https://www.toto.com/401-osmoseur-rgnrateur-aqua-avanti-em.html?s=263322901
                [1] => https://www.toto.com/401-osmoseur-rgnrateur-aqua-avanti-em.html?s=263322901
                [2] => https://www.toto.com/401-osmoseur-rgnrateur-aqua-avanti-em.html?s=263322901
                [3] => https://www.toto.com/401-osmoseur-rgnrateur-aqua-avanti-em.html?s=263322901
                [4] => https://www.toto.com/401-osmoseur-rgnrateur-aqua-avanti-em.html?s=263322901
            )
     
        [3024] => Array
            (
                [0] => https://www.toto.com/1619-la-mdecine-nouvelle-germanique-livre-du-dr-ryke-geerd-hamer-1619.html?s=263322901
                [1] => https://www.toto.com/1521-la-cure-de-tous-les-herpes-hulda-clark-9780984112937.html?s=263322901
            )
    )
     
    Array
    (
    [3018] => Le texte 3018 qui contient les liens à remplacer
    [3024] => Le texte 3024 qui contient les liens à remplacer
    )
    Quand j'ai mes 3 tableaux, je fais un bête

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
     
    foreach($chaines as $id=>$content){
    	$new_content[$id] = str_replace($links[$id], $new_links[$id], $content);
    }
    Mais le print_r du nouveau tableau sort n'importe quoi genre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    https://www.toto.com/401-osmoseur-rgnrateur-aqua-avanti-em.html?s=263322901?s=263322901?s=263322901?s=263322901?s=263322901
    Pouvez-vous m'aider ?
    D'avance merci.

  2. #2
    Nouveau membre du Club
    Homme Profil pro
    Inscrit en
    Septembre 2011
    Messages
    34
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Septembre 2011
    Messages : 34
    Points : 38
    Points
    38
    Par défaut
    Bonjour,

    La boucle que tu essayes de passer ne permet pas de déterminer l'index des liens à remplacer.
    Voici ma correction :

    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
    39
    $links = [
        3018 => [
            'https://www.toto.com/401-osmoseur-rgnrateur-aqua-avanti-em.html',
            'https://www.toto.com/401-osmoseur-rgnrateur-aqua-avanti-em.html',
            'https://www.toto.com/401-osmoseur-rgnrateur-aqua-avanti-em.html',
            'https://www.toto.com/401-osmoseur-rgnrateur-aqua-avanti-em.html',
            'https://www.toto.com/401-osmoseur-rgnrateur-aqua-avanti-em.html'
        ],
        3024 => [
            'https://www.toto.com/1619-la-mdecine-nouvelle-germanique-livre-du-dr-ryke-geerd-hamer-1619.html',
            'https://www.toto.com/1521-la-cure-de-tous-les-herpes-hulda-clark-9780984112937.html'
        ]
    ];
     
    $new_links = [
        3018 => [
            'https://www.toto.com/401-osmoseur-rgnrateur-aqua-avanti-em.html?s=263322901',
            'https://www.toto.com/401-osmoseur-rgnrateur-aqua-avanti-em.html?s=263322901',
            'https://www.toto.com/401-osmoseur-rgnrateur-aqua-avanti-em.html?s=263322901',
            'https://www.toto.com/401-osmoseur-rgnrateur-aqua-avanti-em.html?s=263322901',
            'https://www.toto.com/401-osmoseur-rgnrateur-aqua-avanti-em.html?s=263322901'
        ],
        3024 => [
            'https://www.toto.com/1619-la-mdecine-nouvelle-germanique-livre-du-dr-ryke-geerd-hamer-1619.html?s=263322901',
            'https://www.toto.com/1521-la-cure-de-tous-les-herpes-hulda-clark-9780984112937.html?s=263322901'
        ]
    ];
     
    $chaines = [
        3018 => 'Le texte https://www.toto.com/401-osmoseur-rgnrateur-aqua-avanti-em.html, https://www.toto.com/401-osmoseur-rgnrateur-aqua-avanti-em.html, https://www.toto.com/401-osmoseur-rgnrateur-aqua-avanti-em.html, 
                    https://www.toto.com/401-osmoseur-rgnrateur-aqua-avanti-em.html, https://www.toto.com/401-osmoseur-rgnrateur-aqua-avanti-em.html qui contient les liens à remplacer',
        3024 => 'Le texte https://www.toto.com/1619-la-mdecine-nouvelle-germanique-livre-du-dr-ryke-geerd-hamer-1619.html, https://www.toto.com/1521-la-cure-de-tous-les-herpes-hulda-clark-9780984112937.html qui contient les liens à remplacer'
    ];
     
    foreach ($links as $id => $linksById) {
        foreach ($linksById as $index => $link) {
            $chaines[$id] = str_replace($link, $new_links[$id][$index], $chaines[$id]);
        }
    }

  3. #3
    Membre expert
    Avatar de Dendrite
    Femme Profil pro
    Développeuse informatique
    Inscrit en
    Juin 2008
    Messages
    2 129
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 58
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeuse informatique
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Juin 2008
    Messages : 2 129
    Points : 3 628
    Points
    3 628
    Billets dans le blog
    8
    Par défaut
    Et pourquoi tu ne passerais pas par des requêtes SQL pour modifier des tables SQL avec une formule dans ce goût


    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    update table liens l
    inner join table nouveaux_liens nl on l.id=nl.id
    set l.lien=nl.lien

    Au préalable bien sûr, tu sauvegardes toute ta base ! Très important !
    Et pour qu'on t'aide il faudrait que tu nous donnes la structure de tes tables SQL et les explications et un petit jeu de données.

  4. #4
    Membre averti Avatar de renaud26
    Homme Profil pro
    Webmaster
    Inscrit en
    Mars 2003
    Messages
    1 365
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Côtes d'Armor (Bretagne)

    Informations professionnelles :
    Activité : Webmaster

    Informations forums :
    Inscription : Mars 2003
    Messages : 1 365
    Points : 436
    Points
    436
    Par défaut
    Bonjour,

    En fait ces liens sont disséminés dans un champ wp_content d'une table wp_post (un blog Wordpress). Avec des centaines d'autres liens. Donc si leur structure matche selon certains critères, je les remplace par les mêmes liens auxquels j'ajoute un ID d'affiliation du type ?s=xxxxxxxxx

    Voici comment je récupère les tableaux:
    1- Je récupère les contents
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    $resultats = $wpdb->get_results("SELECT ID, post_content FROM wp_posts WHERE post_content != '' AND post_content LIKE '%www.toto.com%' AND post_content LIKE '%.html%'") ;
    2- Le traitement

    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
     
    foreach ($resultats as $row) {
     
    	$chaines[$row->ID] = $row->post_content;
     
    	$motif='#<a href="(.*?)"(.*?)>#is';
     
    	preg_match_all($motif,$chaine,$out,PREG_PATTERN_ORDER);
     
    	foreach ($out[1] as $link) {
    		if(strpos($link,'www.toto.com') && strpos($link, '.html')){
    			$links[$row->ID][] = $link;
    			$new_links[$row->ID][] = $link.'?s=263322901';
    		}
     
    	}	
     
    }
    3- Constitution du tableau final (tel que j'ai présenté dans mon 1er post) et affichage

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    foreach($chaines as $id=>$content){
    	$new_content[$id] = str_replace($links[$id], $new_links[$id], $content);
    }
    print_r($new_content);
    Mais peut-être n'est ce pas la bonne méthode ? J'ignorais qu'on pouvait faire ce traitement directement dans MySQL...

  5. #5
    Membre averti Avatar de renaud26
    Homme Profil pro
    Webmaster
    Inscrit en
    Mars 2003
    Messages
    1 365
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Côtes d'Armor (Bretagne)

    Informations professionnelles :
    Activité : Webmaster

    Informations forums :
    Inscription : Mars 2003
    Messages : 1 365
    Points : 436
    Points
    436
    Par défaut
    Bonjour Sam__ et merci de ta réponse,

    En fait il y a des indices dans mes tableaux car pour chaque chaine il peut y avoir plusieurs liens à traiter.
    Je n'avais pas donné assez de précisions, j'ai donc publié un autre post dans ce sujet.

  6. #6
    Nouveau membre du Club
    Homme Profil pro
    Inscrit en
    Septembre 2011
    Messages
    34
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Septembre 2011
    Messages : 34
    Points : 38
    Points
    38
    Par défaut
    Oui je me suis bien rendu compte qu'il y avait plusieurs liens à traiter pour chaque id.
    Tu trouvera dans ma réponse précédente la boucle corrigée te permettant de réaliser les remplacements.
    Il faut boucler sur les liens et non les chaînes car sinon impossible de déterminer le nombre de liens à remplacer.

    Enfin tu peux améliorer cette boucle avec une instruction SQL Update ou Replace pour enregistrer en BDD les modifications directement.

  7. #7
    Membre averti Avatar de renaud26
    Homme Profil pro
    Webmaster
    Inscrit en
    Mars 2003
    Messages
    1 365
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Côtes d'Armor (Bretagne)

    Informations professionnelles :
    Activité : Webmaster

    Informations forums :
    Inscription : Mars 2003
    Messages : 1 365
    Points : 436
    Points
    436
    Par défaut
    Merci Sam__, je vais tester et je reviens.
    Bonne soirée.

    Edit:

    C'est carrément top ! Je te remercie beaucoup. Et oui je vais faire ma requête update dans ma boucle.

  8. #8
    Membre averti Avatar de renaud26
    Homme Profil pro
    Webmaster
    Inscrit en
    Mars 2003
    Messages
    1 365
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Côtes d'Armor (Bretagne)

    Informations professionnelles :
    Activité : Webmaster

    Informations forums :
    Inscription : Mars 2003
    Messages : 1 365
    Points : 436
    Points
    436
    Par défaut
    Damned ! J'ai écrit trop vite !
    Si je fais un print_r($chaines) après les foreach de traitement, j'ai encore des liens du style
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    https://www.totocom/401-osmoseur-rgnrateur-aqua-avanti-em.html?s=263322901?s=263322901?s=263322901?s=263322901?s=263322901
    Bien sûr dans les chaines où il y a plusieurs liens identiques à remplacer...

  9. #9
    Nouveau membre du Club
    Homme Profil pro
    Inscrit en
    Septembre 2011
    Messages
    34
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Septembre 2011
    Messages : 34
    Points : 38
    Points
    38
    Par défaut
    Si plusieurs liens identiques, alors pourquoi plusieurs index identiques aussi ?

    Car dans ce cas, il suffit de :

    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
            $links = [
                3018 => [
                    'https://www.toto.com/401-osmoseur-rgnrateur-aqua-avanti-em.html'
                ],
                3024 => [
                    'https://www.toto.com/1619-la-mdecine-nouvelle-germanique-livre-du-dr-ryke-geerd-hamer-1619.html',
                    'https://www.toto.com/1521-la-cure-de-tous-les-herpes-hulda-clark-9780984112937.html'
                ]
            ];
     
            $new_links = [
                3018 => [
                    'https://www.toto.com/401-osmoseur-rgnrateur-aqua-avanti-em.html?s=263322901'
                ],
                3024 => [
                    'https://www.toto.com/1619-la-mdecine-nouvelle-germanique-livre-du-dr-ryke-geerd-hamer-1619.html?s=263322901',
                    'https://www.toto.com/1521-la-cure-de-tous-les-herpes-hulda-clark-9780984112937.html?s=263322901'
                ]
            ];

  10. #10
    Membre averti Avatar de renaud26
    Homme Profil pro
    Webmaster
    Inscrit en
    Mars 2003
    Messages
    1 365
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Côtes d'Armor (Bretagne)

    Informations professionnelles :
    Activité : Webmaster

    Informations forums :
    Inscription : Mars 2003
    Messages : 1 365
    Points : 436
    Points
    436
    Par défaut
    Parce que voici comment se construisent les tableaux $links et $new_links

    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
     
    foreach ($resultats as $row) {
     
    	$chaines[$row->ID] = $row->post_content;
     
    	$motif='#<a href="(.*?)"(.*?)>#is';
     
    	preg_match_all($motif,$chaine,$out,PREG_PATTERN_ORDER);
     
    	foreach ($out[1] as $link) {
    		if(strpos($link,'www.toto.com') && strpos($link, '.html')){
    			$links[$row->ID][] = $link;
    			$new_links[$row->ID][] = $link.'?s=263322901';
    		}
     
    	}	
     
    }
    Et je ne vois pas le problème avec les index puisque j'obtiens ça:

    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
     
    Array
    (
        [3018] => Array
            (
                [0] => https://www.toto.com/401-osmoseur-rgnrateur-aqua-avanti-em.html
                [1] => https://www.toto.com/401-osmoseur-rgnrateur-aqua-avanti-em.html
                [2] => https://www.toto.com/401-osmoseur-rgnrateur-aqua-avanti-em.html
                [3] => https://www.toto.com/401-osmoseur-rgnrateur-aqua-avanti-em.html
                [4] => https://www.toto.com/401-osmoseur-rgnrateur-aqua-avanti-em.html
            )
     
        [3024] => Array
            (
                [0] => https://www.toto.com/1619-la-mdecine-nouvelle-germanique-livre-du-dr-ryke-geerd-hamer-1619.html
                [1] => https://www.toto.com/1521-la-cure-de-tous-les-herpes-hulda-clark-9780984112937.html
            )
     
    )
     
    Array
    (
        [3018] => Array
            (
                [0] => https://www.toto.com/401-osmoseur-rgnrateur-aqua-avanti-em.html?s=263322901
                [1] => https://www.toto.com/401-osmoseur-rgnrateur-aqua-avanti-em.html?s=263322901
                [2] => https://www.toto.com/401-osmoseur-rgnrateur-aqua-avanti-em.html?s=263322901
                [3] => https://www.toto.com/401-osmoseur-rgnrateur-aqua-avanti-em.html?s=263322901
                [4] => https://www.toto.com/401-osmoseur-rgnrateur-aqua-avanti-em.html?s=263322901
            )
     
        [3024] => Array
            (
                [0] => https://www.toto.com/1619-la-mdecine-nouvelle-germanique-livre-du-dr-ryke-geerd-hamer-1619.html?s=263322901
                [1] => https://www.toto.com/1521-la-cure-de-tous-les-herpes-hulda-clark-9780984112937.html?s=263322901
            )
    )
    On voit bien que pour le content 3018 chaque lien même identique a un index différent et pareil pour le tableau $new_links de remplacement...

  11. #11
    Nouveau membre du Club
    Homme Profil pro
    Inscrit en
    Septembre 2011
    Messages
    34
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Septembre 2011
    Messages : 34
    Points : 38
    Points
    38
    Par défaut
    Parce que voici comment se construisent les tableaux $links et $new_links
    Tu peux éventuellement mettre à jour tes entrées directement dans la boucle.

    On voit bien que pour le content 3018 chaque lien même identique a un index différent et pareil pour le tableau $new_links de remplacement...
    Cela pose problème avec str_replace, car la chaîne trouvera toujours le lien, d'où ton résultat inattendu. Et il est inutile de conserver plusieurs liens identiques.
    Tu peux optimiser ta boucle avec un in_array().

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
            foreach ($out[1] as $link) {
                if (strpos($link, 'www.toto.com') && strpos($link, '.html')) {
     
                    if (!in_array($link, $links[$row->ID])) {
                        $links[$row->ID][] = $link;
                        $new_links[$row->ID][] = "$link?s=263322901";
                    }
                }
            }

  12. #12
    Membre averti Avatar de renaud26
    Homme Profil pro
    Webmaster
    Inscrit en
    Mars 2003
    Messages
    1 365
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Côtes d'Armor (Bretagne)

    Informations professionnelles :
    Activité : Webmaster

    Informations forums :
    Inscription : Mars 2003
    Messages : 1 365
    Points : 436
    Points
    436
    Par défaut
    Merci, effectivement le in_array() simplifie les tableaux et il n'y a qu'une seule entrée "link" et "new_link" si le lien est répété plusieurs fois dans content.
    Malgré cela, effectivement le str_replace plante dès qu'il n'y a plus d'un lien.

    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
     
    $out = '';
    $content = array();
    foreach ($links as $id => $linksById) {
     
        foreach ($linksById as $index => $link) {
    		$out .= "Je remplace le lien ". $link ." par " .$new_links[$id][$index] . " dans la chaine ID ".$id." \n";
                    $content[$id] = str_replace($link, $new_links[$id][$index], $chaines[$id]);
    	 }
    	$up = "UPDATE wp_post SET post_content = '".$content[$id]."' WHERE ID = '".$id."'<br>";
    	echo $up;
     
    }
     
     
    echo $out;
    print_r($content);
    Dans ce test, le $out est parfait. Mais le print_r($content) est faux dès que $links et $new_links > 1 lien.
    Et même le $up est faux

  13. #13
    Nouveau membre du Club
    Homme Profil pro
    Inscrit en
    Septembre 2011
    Messages
    34
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Septembre 2011
    Messages : 34
    Points : 38
    Points
    38
    Par défaut
    Dans ce test, le $out est parfait. Mais le print_r($content) est faux dès que $links et $new_links > 1 lien.
    Oui c'est normal car si > 1 lien, tu écrases à chaque passage ton $content[$id], d'où la modification directe de $chaines, comme dans le code d'une de mes précédentes réponses.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    foreach ($links as $id => $linksById) {
        foreach ($linksById as $index => $link) {
            $chaines[$id] = str_replace($link, $new_links[$id][$index], $chaines[$id]);
        }
    }
     
    $up = "UPDATE wp_post SET post_content = '{$content[$id]}' WHERE ID = '$id";
    echo "$up<br>";
    Penses également à utiliser une transaction avant ta première requête Update, et à valider une fois la dernière passée ;-)

  14. #14
    Membre averti Avatar de renaud26
    Homme Profil pro
    Webmaster
    Inscrit en
    Mars 2003
    Messages
    1 365
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Côtes d'Armor (Bretagne)

    Informations professionnelles :
    Activité : Webmaster

    Informations forums :
    Inscription : Mars 2003
    Messages : 1 365
    Points : 436
    Points
    436
    Par défaut
    Merci !!! C'était une erreur d'implémenter un nouveau tableau $content dans les boucles.
    En utilisant ta méthode :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    foreach ($links as $id => $linksById) {
     
        foreach ($linksById as $index => $link) {
     
            $chaines[$id] = str_replace($link, $new_links[$id][$index], $chaines[$id]);
     
        }
    $up = "UPDATE wp_post SET post_content = '{$chaines[$id]}' WHERE ID = '$id";
    echo $up."<br>";
    }
    Nickel !

    Qu'entends-tu par utiliser une transaction dans la requête UPDATE ?
    Je pensais faire un truc du genre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    $wpdb->update(
        $wpdb->prefix.'ma_table',
        array('post_content' => {$chaines[$id]}),
        array('ID' =>$id)
    );
    Je te remercie beaucoup pour ton aide précieuse, Sam. Super sympa.

  15. #15
    Expert éminent Avatar de CosmoKnacki
    Homme Profil pro
    Justicier interdimensionnel
    Inscrit en
    Mars 2009
    Messages
    2 900
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Justicier interdimensionnel

    Informations forums :
    Inscription : Mars 2009
    Messages : 2 900
    Points : 6 676
    Points
    6 676
    Par défaut
    Je ne vois pas l'intérêt d'utiliser des tableaux et encore moins de faire une recherche avec preg_match_all pour dans un deuxième temps effectuer un remplacement (toutes les fonctions de remplacement font déjà une recherche). La chaîne n'a besoin d'être parcourue qu'une seule fois pour appliquer le remplacement:
    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
    $pattern = '~ <a \s+ (?> [^>\s]+ \s+ )*? href=[\'"]? \K [^>"\'\s]+ ~ix';
     
    $options = [ 'host' => 'www.toto.com',
                 'extension' => 'html',
                 'query' => 's=263322901' ]; // on regroupe les paramètres.
     
    $replacement = function ($m) use (&$options) {
     
        $url = $m[0];
        $parts = parse_url( (stripos('http', $url) === 0 ? '' : 'http://') . $url ); // on parse l'url
     
        if ( !isset($parts['path']) )
            return $url;
     
        $tmp = explode('.', $parts['path']);
        $extension = array_pop($tmp);
     
        if ( $parts['host'] === $options['host'] && $extension === $options['extension'] ) {
            // on reconstruit l'url
            $url = $parts['scheme'] . '://' . $parts['host'] . '/' . $parts['path'] . '?';
     
            if ( isset($parts['query']) )
                $url .= $parse['query'] . '&';
     
            $url .= $options['query'];
     
            if ( isset($parts['fragment']) )
                $url .= '#' . $parts['fragment'];
        }
     
        return $url;
    };
     
    foreach ($resultats as $row) {
        $new_content = preg_replace_callback($pattern, $replacement, $row->post_content);
        echo $new_content;
    }
    C'est un code qui affiche le résultat (pour la démo). Pour ton usage, il suffit de préparer une requête SQL d'update avant la boucle puis d'y binder les valeurs et de l'exécuter dans la boucle.

  16. #16
    Membre averti Avatar de renaud26
    Homme Profil pro
    Webmaster
    Inscrit en
    Mars 2003
    Messages
    1 365
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Côtes d'Armor (Bretagne)

    Informations professionnelles :
    Activité : Webmaster

    Informations forums :
    Inscription : Mars 2003
    Messages : 1 365
    Points : 436
    Points
    436
    Par défaut
    Citation Envoyé par CosmoKnacki Voir le message
    Je ne vois pas l'intérêt d'utiliser des tableaux et encore moins de faire une recherche avec preg_match_all pour dans un deuxième temps effectuer un remplacement (toutes les fonctions de remplacement font une recherche). La chaîne n'a besoin d'être parcouru qu'une seule fois pour appliquer le remplacement:
    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
    $pattern = '~ <a \s+ (?> [^>\s]+ \s+ )*? href=[\'"]? \K [^>"\'\s]+ ~ix';
     
    $options = [ 'host' => 'www.toto.com',
                 'extension' => 'html',
                 'query' => 's=263322901' ]; // on regroupe les paramètres.
     
    $replacement = function ($m) use (&$options) {
     
        $url = $m[0];
        $parts = parse_url( (stripos('http', $url) === 0 ? '' : 'http://') . $url ); // on parse l'url
     
        if ( !isset($parts['path']) )
            return $url;
     
        $tmp = explode('.', $parts['path']);
        $extension = array_pop($tmp);
     
        if ( $parts['host'] === $options['host'] && $extension === $options['extension'] ) {
            // on reconstruit l'url
            $url = $parts['scheme'] . '://' . $parts['host'] . '/' . $parts['path'] . '?';
     
            if ( isset($parts['query']) )
                $url .= $parse['query'] . '&';
     
            $url .= $options['query'];
     
            if ( isset($parts['fragment']) )
                $url .= '#' . $parts['fragment'];
        }
     
        return $url;
    };
     
    foreach ($resultats as $row) {
        $new_content = preg_replace_callback($pattern, $replacement, $row->post_content);
        echo $new_content;
    }
    C'est un code qui affiche le résultat (pour la démo). Pour ton usage, il suffit de préparer une requête SQL d'update avant la boucle puis d'y binder les valeurs et de l'exécuter dans la boucle.
    Woooooooooaaaawwwww !
    Là je suis carrément sur le cul !
    Un grand merci à toi aussi, ce bout de code va sacrément me servir !

  17. #17
    Nouveau membre du Club
    Homme Profil pro
    Inscrit en
    Septembre 2011
    Messages
    34
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Septembre 2011
    Messages : 34
    Points : 38
    Points
    38
    Par défaut
    Citation Envoyé par renaud26 Voir le message
    Qu'entends-tu par utiliser une transaction dans la requête UPDATE ?
    Les transactions te permettent de t'assurer que toutes les lignes ont été modifiées sans erreur, sinon toute modification est annulée.

    https://www.supinfo.com/articles/sin...solation-mysql

    En l'occurence, sous WordPress :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    $wpdb->query('START TRANSACTION');
    $result = $wpdb->update(...);
    if ($result) {
        $wpdb->query('COMMIT');
    } else {
        $wpdb->query('ROLLBACK');
    }

  18. #18
    Membre averti Avatar de renaud26
    Homme Profil pro
    Webmaster
    Inscrit en
    Mars 2003
    Messages
    1 365
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Côtes d'Armor (Bretagne)

    Informations professionnelles :
    Activité : Webmaster

    Informations forums :
    Inscription : Mars 2003
    Messages : 1 365
    Points : 436
    Points
    436
    Par défaut
    Merci pour ton aide !

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. permutations/combinaisons sur des tableaux dynamiques
    Par pEAk230 dans le forum Langage
    Réponses: 5
    Dernier message: 19/04/2006, 13h18
  2. [Eval] Problème de boucle for sur des tableaux
    Par battle_benny dans le forum Général JavaScript
    Réponses: 3
    Dernier message: 12/01/2006, 23h55
  3. [RegEx] utilisation de preg_replace sur des balises
    Par Kerod dans le forum Langage
    Réponses: 5
    Dernier message: 09/12/2005, 13h46
  4. Réponses: 2
    Dernier message: 19/08/2003, 18h04
  5. free sur des tableaux "a moitié dynamiques"
    Par barthelv dans le forum C
    Réponses: 4
    Dernier message: 31/07/2003, 15h30

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