Wiki Tuto - Chercher présence d'une sous chaîne dans une chaîne avec MySQL grâce à LIKE

0
25
fév.
2017

Introduction

Admettons que nous possédions une table "articles" contenant une cellule "quelleCategorie". Dans cette cellule nous indiquons une ou plusieurs catégories pour chaque articles comme dans l'exemple suivant :

    id | nomArticle | quelleCategorie | dateCreation
    1 | banane | fruits | 5
    2 | jus d'orange | jus de fruits | 9
    3 | tomate | fruits ; legumes | 22
    4 | maison | immobilier | 42

Admettons que nous désirons récupérer tout les articles ayant "fruit" dans "quelleCategorie". Avec l'option LIKE nous allons pouvoir spécifier une expression régulière afin de récupérer banane, jus d'orange et tomate et ce même si chacun possède une version légèrement différente de la catégorie.
À noter que vous pouvez aussi utiliser NOT LIKE qui vous permet de faire exactement l'inverse : demander à MySQL de ne retourner que les chaînes où n'est PAS présent le pattern.

L'exemple suivant va sélectionner dans la table "articles" tout les éléments ayant dans leur cellule "quelleCategorie" la sous-chaîne contenue dans la variable $categorieChoisie, classés du plus récent aux plus anciens.

<?php
$bdd_hostname = "localhost";
$bdd_name = "nomDeMaBase";
$bdd_login = "loginDeMaBase";
$bdd_password = "passowrdDeMaBase";
try {
    $bdd = new PDO('mysql:host='.$bdd_hostname.';dbname='.$bdd_name.';charset=utf8', $bdd_login, $bdd_password);
} catch( Exception $e){
    error_log("Error BDD connexion from ".$_SERVER["PHP_SELF"]);
}

$categorieChoisie = "fruit";

$requestSQL = $bdd->prepare('SELECT `*` FROM articles WHERE `quelleCategorie` LIKE %{:categorieChoisie}%  ORDER BY `dateCreation`');
$requestSQL->bindParam(':categorieChoisie', strval($categorieChoisie), PDO::PARAM_STR);
$requestSQL->execute();
$myArticles = $requestSomeArticles->fetchAll(PDO::FETCH_CLASS);
print_r($myArticles);
?>

Explication en détails :

  1. On tente de connecter PDO à la base de données, si on réussi on obtient l'objet $bdd si non on retourne une erreur dans les logs (/var/log/apache2/error.log pour apache2)
try {
    $bdd = new PDO('mysql:host='.$bdd_hostname.';dbname='.$bdd_name.';charset=utf8', $bdd_login, $bdd_password);
} catch( Exception $e){
    error_log("Error BDD connexion from ".$_SERVER["PHP_SELF"]);
}
  1. On défini notre sous chaîne à rechercher : fruit
$categorieChoisie = "fruit";
  1. On demande a PDO de préparer notre requête à partir de l'objet $bdd
$requestSQL = $bdd->prepare('SELECT `*` FROM articles WHERE `quelleCategorie` LIKE %{:categorieChoisie}%  ORDER BY `dateCreation`');
  • Ici on lui demande de tout (*) récupérer dans "articles" où "quelleCategorie" ressemble à la chaîne injectée, ordonnée (ORDER BY) par leur date de création.
  1. On injecte le paramètre de recherche (fruit)
$requestSQL->bindParam(':categorieChoisie', strval($categorieChoisie), PDO::PARAM_STR);
  1. On exécute la requête SQL
$requestSQL->execute();
  1. On récupère le résultat de la requête SQL sous forme d'objet
$myArticles = $requestSomeArticles->fetchAll(PDO::FETCH_CLASS);
  1. Si vous préférez récupérer sous forme de tableau, remplacez la précédente ligne par les suivantes
$myArticles = array();
while($tmpArticle = $requestSomeArticles->fetch(PDO::FETCH_ASSOC)){
    $myArticles[] = $tmpArticle;
}
  1. On affiche le résultat
print_r($myArticles);

Wiki Tuto Ajax - afficher au format JSON des articles e-shop depuis MySQL-MariaDB grâce à PHP

0
23
fév.
2017

Sommaire

Niveau requis pour utilisation : moyen.
Nécessite au moins PHP5.4+ avec PDO (php-mysql)
Ce tutoriel s'intègre dans une suite de tutoriel permettant d'appréhender l'ajax voir Farm Link à la fin du wiki.

Introduction

  • Nous allons ici étudier un script PHP, rédigé par votre humble serviteur en programmation fonctionnelle, permettant de faire de l'ajax. L'objectif d'origine de ces fonctions est de recevoir les requêtes GET provenant d'une interface cliente (page web angularjs) d'une boutique en ligne, de récupérer des articles depuis une table de Base de Données puis afficher les informations au format JSON.
    Le but de ce topic est de vous aider a mettre en place le plus rapidement possible une fonction ajax côté serveur (pour les tuto côté client il faudra voir du côté du Farm Link en bas de page).

  • Donc ce script analyse les variables $_GET afin de récupérer les informations lui permettant de forger des requêtes SQL. Ensuite il récupère les informations de la base de données MySQL/MariaDB et les affiche dans un JSON.
    Pour fonctionner il faut bien entendu disposer d'une base de données contenant une table (nom gérable via $tableName) et contenant au moins les cellules : id, categorie.
    Afin d'éviter les doublons entre deux requêtes clientes lorsque des articles ont des informations recherchées quasi identique: lors d'une requête GET le client doit mentionner les articles qu'il a visionné dernièrement en ajoutant dans ses requêtes GET les variables banItemX = identifiant article à bannir comme dans l'exemple suivant : ajax.php?banItem1=6&banItem2=7&banItem3=8

  • La sécurité anti injection SQL est gérée suivant les cas par les requêtes préparées de PDO ou par une moulinette qui vérifie la correspondance entre la table de données et les infos postées par l'utilisateur puis qui injecte les infos depuis la base de données en lieu et place des données envoyées par l'user. Sauf pour les $_GET["banItemX"] qui eux sont directement convertis en integer afin de casser toutes injections.

Les paramètres GET acceptés par le script :

Paramètres obligatoires :

  • &articleMax=[integer] gère la LIMITE SQL (nombre d'entrées max à renvoyer)
  • &orderByAttributs=[string] l'attribut pour ORDER BY (par exemple l'id, le prix, etc)
  • &orderByAttributsLastValue=[float] la valeur la plus haute (ou basse selon la recherche) de l'attribut ORDER BY afin de commencer la recherche à partir de là
  • &categorie=[string] le nom de la catégorie d'article (peut facilement être remplacer par une seconde condition de recherche)
  • &orderByType=[1|-1] décide du sens de la recherche (1 pour plus petit au plus grand (> et ASC), -1 pour plus grand au plus petit (< et DESC))

Paramètres optionnels :

  • &forceChangeOrderSymbole=[1|2] 1 pour > (plus grand que) ou 2 pour < (plus petit que) permet de changer le sens de la recherche sans affecter le reste (ASC ou DESC). Par défaut 1 (>) est sélectionné.
  • &banItem1=[integer] reçoit les identifiants à bannir (peut avoir un nombre "infini" (voir limite GET) ex: banItem2, banItem3, etc). Par défaut aucun élément n'est bannis.

Exemples :

  • www.hostname.be/ajaxArticles.php?articleMax=10&orderByAttributsLastValue=42&orderByAttributs=prix&orderByType=1&categorie=film

    • On demande à voir les 10 prochains articles, classé par la cellule prix du plus petit au plus grand à partir du prix 42, de la catégorie film

Le code

Pour l'installer créez un ajaxArticles.php et collez le code suivant dedans.

<?php
/*  Licence GPLv3 - Papa :  voxdemonix
    infos : https://www.0rion.netlib.re/forum4/viewtopic.php?f=79&t=541&p=1156#p1156
*/
/*  Je vous conseil d'insérer tout le bloc try dans un fichier séparé protégé par un .htaccess (deny for all)  */
try {
    /*  éditez les informations nécessaire pour la connexion à la base de données   */
    $bdd = new PDO('mysql:host='.$main["bdd_Hostname"].';dbname='.$main['bdd_Name'].';charset=utf8', $main['bdd_Login'], $main['bdd_Pass']);
} catch( Exception $e){
    error_log("ajax -> Error BDD connexion from ".$_SERVER["PHP_SELF"]);
}

    $tableName = "Articles";



    function displayInJsonMyArray($myArray){
        header('Content-type: application/json');
        print_r( json_encode($myArray, JSON_NUMERIC_CHECK)  );
    }



    function articleOrderByList(){
            //MYSQL
        global $bdd;
        $searchCategorieArticle = $bdd->prepare('SELECT * FROM '.$tableName.' LIMIT 1');
        $searchCategorieArticle->execute();

            //RECOVER THE RESULT IN A TAB
        $tabCategorie = $searchCategorieArticle->fetch(PDO::FETCH_ASSOC);
        $tab = array();

            //READ THE TAB AND MAKE THE OPTIONS'S TAG
        foreach ($tabCategorie as $key => $value) { 
            $tab[] = $key;
        }
        return $tab;
    }


    function articleCategorieList(){
        $liste = array(); global $bdd;
        $searchCategorieArticle = $bdd->prepare('SELECT `categorie` FROM '.$tableName);
        $searchCategorieArticle->execute();

            //MAINTENANT LISTE LES CATEGORIES DANS $tmpCategorie, (PERMET AUSSI DE CRÉER UN FORMULAIRE SELECT)
        while($tmpCategorie = $searchCategorieArticle->fetch(PDO::FETCH_ASSOC)){
            if (!in_array($tmpCategorie["categorie"], $liste)) {
                $liste[] = $tmpCategorie["categorie"];
            //  var_dump($tmpCategorie); echo '<br />';
            }
        }
        return $liste;
    }


    function genBanItemForMySQLRequest(){
        $banRequest = '';
        foreach( $_GET as $key => $value){
            if (stripos( ' '.$key , 'banItem' )){
                $banRequest .= ' AND (id != '.intval($value).')';   
            }
        }
        return $banRequest;
    }


    /*
        EXPLICATIONS :
    reçoit des variables GET du style :
opt     &banItem1= reçoit les identifiants a bannir (peut avoir un nombre "infini" (voir limite GET) ex: banItem2, banItem3, etc)
        &articleMax= gère la LIMITE SQL (nombre d'entrée max a renvoier)
        &orderByAttributs= l'attribut pour ORDER BY (par exemple l'id, le prix, etc)
        &orderByAttributsLastValue= la valeur la plus haute (ou basse selon la recherche) de l'attribut ORDER BY afin de commencer la recherche a partir de là
        &categorie= la categorie d'article (peut facilement être remplacer par une seconde condition de recherche)
        &orderByType= decide du sens de la recherche (1 pour plus petit au plus grand (> et ASC), -1 pour plus grand au plus petit (< et DESC))
opt     &forceChangeOrderSymbole= permet de changer le sens (< ou >) de la recherche sans affecter le reste (ASC ou DESC)
    */




    $forceChangeOrderSymbole = 0; //if = 1 => > (plus grand que); if = 2 => < (plus petit que)
    if(filter_has_var(INPUT_GET, "forceChangeOrderSymbole")){
        if(isset($_GET["forceChangeOrderSymbole"]) & !empty($_GET["forceChangeOrderSymbole"])){
            switch(intval($_GET["forceChangeOrderSymbole"])){
                case 1 :
                case '1':
                    $forceChangeOrderSymbole = 1;
                break;
                case 2 :
                case '2':
                    $forceChangeOrderSymbole = 2;
                break;              
            }
        }
    }
    if ( filter_has_var(INPUT_GET, "articleMax") & filter_has_var(INPUT_GET, "orderByType") & filter_has_var(INPUT_GET, "orderByAttributs") & filter_has_var(INPUT_GET, "orderByAttributsLastValue")) {
        $wichCategorie = "all";
        if (filter_has_var(INPUT_GET, "categorie")) {
            $wichCategorie = strval($_GET["categorie"]); //categorie = idForTraduct, not the traducted version (https://www.0rion.netlib.re/forum4/viewtopic.php?f=9&t=211)
        }
        displaySomeArticleInJSONUniversal($_GET["articleMax"], $wichCategorie, $_GET["orderByAttributs"], $_GET["orderByAttributsLastValue"]);
    }


    function displaySomeArticleInJSONUniversal($nbLimit, $categorie, $inputOrderByAttributs, $inputOrderByAttributsLastValue){
        // $iMinimal = l'identifiant unique minimal de l'article, afin d'envoyer les suivants
        global $bdd; //PDO object
        global $forceChangeOrderSymbole;

        $orderByAttributs = 'id'; $orderByAttributsLastValue = 1;
        /* security */
        if(in_array(strval($inputOrderByAttributs) , articleOrderByList())){
            $orderByAttributs = strval($inputOrderByAttributs);
            $orderByAttributsLastValue = $inputOrderByAttributsLastValue;
        }
        $orderByType = 'ASC'; $orderSymbole = '>';
        if(strval($_GET["orderByType"]) == '-1'){
            $orderByType = 'DESC';
            $orderSymbole = '<';    
        }
        if($forceChangeOrderSymbole == 2){ $orderSymbole = '<'; }
        if( strval($categorie == "all") || !in_array(strval($categorie), articleCategorieList() )   ){
            $requestSomeArticles = $bdd->prepare("SELECT * FROM ".$tableName." WHERE `".$orderByAttributs."` ".$orderSymbole."= :orderByAttributsLastValue ".genBanItemForMySQLRequest()." ORDER BY `".$orderByAttributs."` ".$orderByType.", `id` ASC LIMIT :nbLimit");
        }else{
            $requestSomeArticles = $bdd->prepare("SELECT * FROM ".$tableName." WHERE `".$orderByAttributs."` ".$orderSymbole."= :orderByAttributsLastValue AND `categorie` = :categorie ORDER BY `".$orderByAttributs."` ".$orderByType.", `id` ASC LIMIT :nbLimit");
            $requestSomeArticles->bindParam(':categorie', strval($categorie), PDO::PARAM_STR);
        }

        $requestSomeArticles->bindParam(':nbLimit', intval($nbLimit), PDO::PARAM_INT);
        $requestSomeArticles->bindParam(':orderByAttributsLastValue', floatval($orderByAttributsLastValue), PDO::PARAM_STR);

        $requestSomeArticles->execute();
        //$myArticles = $requestSomeArticles->fetchAll(PDO::FETCH_CLASS); 
        $myArticles = array();
            while($tmpArticle = $requestSomeArticles->fetch(PDO::FETCH_ASSOC)){
                $myArticles[] = arrayUniversalTraductor($tmpArticle);
            }
        displayInJsonMyArray($myArticles);
    }
?>

Fonctionnement en détail :

Note : ne serons mentionné que les noms des fonctions, leur fonctionnement et les types de sorties (avec des exemples). Il n'y aura pas de copier-coller de morceaux de code afin d'éviter de devoir éditer le tutoriel à chaque édition du code source.

Listes des fonctions :

  1. articleOrderByList()
  2. articleCategorieList()
  3. genBanItemForMySQLRequest()
  4. displaySomeArticleInJSONUniversal($nbLimit, $categorie, $inputOrderByAttributs, $inputOrderByAttributsLastValue)
  5. displayInJsonMyArray($myArray)

articleOrderByList()

  • Récupère la liste des attributs possible (nom de cellule) pour la table de données.
    • Exemple de sorties :
$liste[1] = "film"
$liste[2] = "séries"
$liste[3] = "musiques"

articleCategorieList()

  • Retourne une liste sous forme d'un array contenant les noms des différentes catégories sans doublon.
    • Exemple de sorties :
$liste[1] = "id"
$liste[2] = "prix"
$liste[3] = "nom"
$liste[4] = "timeCreation"

genBanItemForMySQLRequest()

  • Récupère les identifiants des articles à bannir de la prochaine requête SQL. Utilise les variables $_GET[banItemX] afin de générer un morceau de requête SQL du type ' AND (id != '.intval($_GET[banItemX]).')' à insérer avant l'ORDER BY.
    • Exemple de sorties :
    $stringMorceauRequeteSQL = ' AND (id != 1) AND (id != 2) AND (id != 3) AND (id != 5) AND (id != 9) AND (id != 8)'

displaySomeArticleInJSONUniversal($nbLimit, $categorie, $inputOrderByAttributs, $inputOrderByAttributsLastValue)

  • La fonction displaySomeArticleInJSONUniversal($nbLimit, $categorie, $inputOrderByAttributs, $inputOrderByAttributsLastValue) est précédée d'un bloc de code chargé d'appréhender certaines informations envoyées par l'utilisateur avant d’exécuter la dite fonction. C'est la fonction principale : chargée de forger et exécuter la requête SQL, insérer les résultats dans un tableau (array) puis l'envoyer à displayInJsonMyArray($myArray).

displayInJsonMyArray($myArray)

  • Fonction toute banale recevant un tableau (array) et affichant les informations contenues via print_r() au format JSON avec la vérification des entiers.

-


-

-


-

Note pour la rédaction :

  • il faut encore simplifier le tuto, ajouter des exemples (et mettre en place un exemple en ligne afin que les lecteurs puissent tester (comme dans cet exemple lié à ce tuto))
  • le code aurait besoin d'une fraîcheur afin de le rendre plus compréhensible et généralisable au max (le but étant qu'un lecteur néophyte puisse copier-coller, éventuellement avec une légère modification puis en route)
  • des exemples d'utilisations suivront (un avec javascript et un avec angular 4)

Journal freetorrent.fr : encore et toujours

19
27
déc.
2016

11ème année de bons et loyaux services qui commence pour freetorrent.fr (tracker bittorrent exclusivement consacré aux médias sous licence libre ou licence de libre diffusion).
Divisé en 2 entités l'an passé (dont freeostorrent.fr), freetorrent.fr est revenu à un schéma unitaire plus classique de présentation en réintégrant la proposition d'OS libres.
"Propulsé" par un nouveau front-end à XBTT (en php) depuis l'année dernière (qui a d'ailleurs pas mal évolué en fonctionnalités), freetorrent.fr renaît encore une fois, tant le projet me tient (...)

API Platform 2 : un cadriciel pour créer des API Web hypermédia en quelques minutes

28
10
déc.
2016
PHP

Après une année de développements et plus de 700 commits réalisés par plus d’une centaine de contributeurs à travers le monde, la nouvelle version d’API Platform vient d’être publiée. API Platform v2 est une réécriture profonde du cadriciel (framework) incluant une refonte complète de la conception, des ajouts de nouvelles fonctionnalités et des corrections de bogues.

API Platform est un framework libre (licence MIT) écrit en PHP 7 et basé sur Symfony destiné à la création d’API Web modernes, puissantes et sécurisées. Cet outil est particulièrement adapté à la construction de systèmes d’informations « API-centric » basés sur l’hypermédia et le Web des données (linked data). Il permet de réaliser facilement des applications d’une seule page (single‐page applications) ou dédiées aux mobiles en utilisant des bibliothèques JavaScript telles que React ou AngularJS.

Le sponsor principal d’API Platform est la société coopérative lilloise Les-Tilleuls.coop. Il s’agit d’une SCOP spécialisée dans la conception et la réalisation de logiciels comptant une vingtaine de salariés qui pratiquent l’autogestion et se partagent les bénéfices engrangés de manière égalitaire.

Capture d'écran

En seconde partie de la dépêche, vous trouverez une traduction en français de l’annonce de sortie de cette version deux, qui revient sur les fonctionnalités principales du cadriciel.

Première version de LDAP Tool Box White Pages

Posté par (page perso) . Édité par Davy Defaud, Nils Ratusznik, palm123 et ZeroHeure. Modéré par Yvan Munoz. Licence CC by-sa
26
26
nov.
2016
Administration système

Le projet LDAP Tool Box rassemble différents outils pour aider les administrateurs LDAP (parce que même les administrateurs LDAP ont besoin d’aide) :

  • scripts de supervision ;
  • paquets OpenLDAP ;
  • interface de changement de mot de passe.

Une nouvelle application vient d’être publiée : White Pages, ou pages blanches en français.

LDAP Tool Box White Pages est écrite en PHP et se base sur PHP-LDAP, PHP-GD et Smarty. Elle est sous licence GPL.

Journal La fin des liens morts sur Wikipedia ?

Posté par (page perso) . Licence CC by-sa
32
26
oct.
2016

Un nouveau bot sévit sur Wikipedia depuis quelques temps, non pour répandre publicité et désinformation, mais pour vérifier et archiver les liens dans les notes de bas-de-page de la plus vaste encyclopédie au monde.

IABot, c'est le petit nom de l'Internet Archive Bot développé en PHP par Maximilian Doerr et Stephen Balbach, qui s'assure que les liens ajoutés sur Wikipedia sont bien sauvegardés à l'Internet Archive.

« Ce que Max et Stephen ont fait en partenariat avec Mark Graham et (...)

Sortie de LDAP Tool Box Self Service Password 1.0

Posté par (page perso) . Édité par Davy Defaud, Benoît Sibaud et Nils Ratusznik. Modéré par Benoît Sibaud. Licence CC by-sa
31
18
oct.
2016
Sécurité

Le logiciel Self Service Password est développé au sein du projet LDAP Tool Box. Il fournit une interface permettant aux utilisateurs de changer leur mot de passe dans un annuaire LDAP, y compris Active Directory ou Samba 4.

Outre le changement de mot de passe simple, l’interface propose de réinitialiser son mot de passe en cas de perte, soit par l’envoi d’un courriel, soit par la réponse à des questions, soit par l’envoi d’un SMS.

Les contraintes de qualité du mot de passe sont paramétrables : taille minimale, maximale, présence de différentes classes de caractères, caractères interdits, contrôle de la valeur par rapport à l’ancien mot de passe ou à l’identifiant.

Le logiciel Self Service Password est écrit en PHP et est sous licence publique générale GNU. La version 1.0 est sortie le 14 octobre 2016.

Journal jus - Just Upload Stuff

Posté par (page perso) . Licence CC by-sa
21
18
sept.
2016

Chères moules, poulpes et autres pinnipèdes,

Depuis un petit moment je ne suis plus satisfait par ma méthode ancestrale de partage de fichiers, qui consiste à exécuter la commande suivante dans mon terminal préféré :

scp mon-fichier.png ssz.fr:http/ssz.fr/www/brdl/fichier.png

Pour autant, aucune des solutions que j'ai pu trouver en ligne n'ont été jusqu'ici à la hauteur de mes espérances. Vendredi dernier j'ai justement eu l'occasion de tester une de ces solutions, qui ne marche bêtement pas sans Javascript. Je dis bêtement (...)

Journal CWP : une interface web d'impression de fichiers PDF

Posté par (page perso) . Licence CC by-sa
35
26
août
2016

Bonjour à tous,

Note : désolé pour l'autopromotion, mais cette fois-ci je me dis que ça vaut le coup.

Cela vous est peut-être déjà arrivé : vous accueillez des invités dans votre entreprise ou chez vous. Ils ont des documents sur leur ordinateur portable et veulent les imprimer. Occasionnellement on s'en sort, mais à la longue, ça devient vite contraignant :

  • s'ils ont accès au serveur d'impression
    • il faut leur fournir les instructions pour l'installation des pilotes
    • ils doivent (...)

Forum Linux.général Serveur maison

Posté par . Licence CC by-sa
Tags :
1
11
août
2016

Bonjour à tous,

J'ai chez moi un pc que je souhaite ré-utiliser pour faire un serveur.

Dans son quotidien, j'aimerai qu'il puisse servir de stockage pour tout le monde, héberger un serveur apache/php pour mes tests perso et diffuser des vidéos en UPNP.

J'aimerai savoir si vous avez des conseils sur quel distri serveur linux se pencher pour faire cela.

Merci d'avance.

Journal Gnew 2016.2

Posté par (page perso) . Licence CC by-sa
11
3
août
2016

Bonjour à tous,

Je souhaiterais vous faire part de la disponibilité de la version 2016.2 de Gnew (gestionnaire de contenu simple pour les publications web).

Voici la liste des nouveautés de cette version :

  • Ajout de la propriété CSS word-break dans les citations pour éviter les débordements
  • Ne pas afficher l'adresse e-mail dans les flux lorsque l'utilisateur ne le veut pas
  • Correction de la suppression des utilisateurs invalides sans utiliser le lien Purger les utilisateurs (administration)
  • Amélioration des suppressions (administration) (...)

Journal Présentation de freeostorrent.fr

27
16
juil.
2016

Freeostorrent.fr rassemble des OS libres (Systèmes d'exploitation) et les propose au téléchargement par l'intermédiaire du protocole Bittorrent.
Il est complémentaire des projets officiels qui possèdent déjà leurs services Bittorrent (distributions Gnu/Linux ou xBSD, projets divers, …) et s'adresse premièrement aux projets plus modestes qui recherchent un moyen simple de partager librement leurs travaux.

Conçu au départ comme une "étude de cas" pour un "béotien" désirant enfin apprendre - un peu - le PHP, le site est à l'origine un tracker (...)

Forum Programmation.php Gestion des accents dans un projet php/mysql...

Posté par . Licence CC by-sa
2
2
juin
2016

Bonjour à tous,

Avant de poser la question, je vais resituer le contexte : j'ai commencé à contribuer à un logiciel dont j'avais besoin pour mon boulot (non, je ne dirais pas lequel, non pas que ce soit hyper confidentiel, mais j'estime que ce n'est pas à moi de faire de la pub pour ce logiciel…). Comme indiqué dans le sujet, c'est un projet en PHP/Mysql qui n'a jamais pris le temps de gérer correctement le problème des accents.

Aujourd'hui (...)