Récupérer le chemin d'un fichier en Java

La méthode File.getAbsolutePath() renvoie le nome du chemin complet du fichier (chemin + nom).

Exemple:

File file = File("C:\\Dossier_111\\fichier.txt");
System.out.println("Chemin: " + file.getAbsolutePath());
Il va afficher le chemin complet : "C:\\Dossier_111\\fichier.txt".

Dans la plupart des cas, vous aurez besoin de récupérer seulement le chemin sans le nom du fichier en utilisant des fonctions comme substring() et lastIndexOf().

File file = File("C:\\Dossier111\\fichier.txt");
String absolutePath = file.getAbsolutePath();
String filePath = absolutePath.
substring(0,absolutePath.lastIndexOf(File.separator));
System.out.println("Chemin: " + filePath);
Exécution:

C:\\Dossier111

Ressources:
tutorialspoint - Java.io.File.getAbsolutePath() Method


Classement TIOBE des langages de programmation pour mars 2018


La classement des langages de programmation TIOBE est un indicateur de popularité. L'évaluation est basée sur le nombre des ingénieurs compétents autour du monde, des tutoriels, des développeurs ainsi que le nombre de requêtes traitées par les moteurs de recherche tels que Google, Yahoo, Bing, Baidu.

Ce classement est utile pour savoir si vos compétences de programmation sont toujours à jour ou pour prendre une décision stratégique par exemple sur un langage que vous utilisez pour développer un logiciel. Pour plus d'informations visitez le site tiobe.






jeudi 22 mars 2018

Java - supprimer un élément d'un tableau

Comment supprimer un objet particulier de type string ou int d'un tableau en java ?
Le meilleur choix est d'utiliser une collection d'objets. Les éléments sont copier dans le même tableau avec un décalage de position -1.

public void removeElement(Object[] a, int del) {
    System.arraycopy(a,del+1,a,del,a.length-1-del);
}

Apache Commons

Vous pouvez aussi utiliser la librairie commons lang's ArrayUtils.

array = ArrayUtils.removeElement(array, element)
Ressources:
https://stackoverflow.com/questions/642897/removing-an-element-from-an-array-java

Java - modifier une clé dans Hashtable

Dans ce tutoriel nous allons voir comment modifier ou remplacer une clé dans Hashtable. Java ne dispose pas d'une méthode qui fait ça et dans ce cas on est obligé d'écrire notre solution. Premièrement, on va récupérer la valeur de la clé recherchée puis supprimer l'ancienne clé-valeur et à la fin insérer la nouvelle clé avec l'ancien valeur.

Exemple:

 
package com.codeurjava.hashtable;

import java.util.*;

public class hashtable_replace_key {
 
   public static void main(String args[]) {
    
    // crérer une hashtable
    Hashtable ht = new Hashtable();      
       
    // insérer des pairs
    ht.put(1, "A");
    ht.put(2, "B");
    ht.put(3, "C");
       
    System.out.println("Hashtable avant : "+ht);
    
    //clé à modifier
    int key = 2;
    
    // avant on doit récupérer la valeur de la clé recherchée
    // et sauvegarder cette valeur dans une variable
    // pour que l'on affecte à la nouvelle clé
    String val = (String) ht.get(2);
    
    // supprimer l'ancien clé
    ht.remove(key);
    
    // insérer le nouveau pair clé-valeur
    ht.put(22,val);
    
    System.out.println("Hashtable après : "+ht); 
   
   }   
   
}
Exécution:

 
Hashtable avant : {3=C, 2=B, 1=A}
Hashtable après : {3=C, 1=A, 22=B}

Java - Modifier une valeur dans Hashtable

Supposons que nous avons une Hashtable<String, Integer> en Java. Comment modifier ou remplacer la valeur pour une clé donnée.

Exemple de la méthode java.util.Hashtable.put(K key, V value)

Cette méthode est utilisée pour lier la clé à une valeur dans une Hashtable. L’exception NullPointerException est déclenchée si la clé ou la valeurs sont nuls. Si la clé existe déjà, sa valeur est remplacée automatiquement.

L'exemple ci-dessous montre la modification d'une valeur.

 
package com.codeurjava.hashtable;

import java.util.*;

public class hashtable_put {
 
   public static void main(String args[]) {
    // crérer une hashtable
    Hashtable ht = new Hashtable();      
       
    // insérer des pairs
    ht.put(1, "A");
    ht.put(2, "B");
    ht.put(3, "C");
       
    System.out.println("Hashtable avant modification : "+ht);
       
    // modifier la valeur de la clé 2
    String val_ret=(String)ht.put(2,"BB");
       
    System.out.println("Valeur remplacée : "+val_ret);
       
    System.out.println("Hashtable après modification : "+ht); 
   
   }   
   
}
Exécution:

 
Initial hash table value: {3=C, 2=B, 1=A}
Valeur remplacée : B
Nouvelle Hashtable : {3=C, 2=BB, 1=A}

Exemple de la méthode replace()

Java dispose d'une autre méthode replace().
  • public boolean replace(K key, V oldValue, V newValue)
Il n'y a aucune différence entre la méthode put et replace() dans ce cas ou il existe déja une affectation entre la clé et la valeur et que l'on veut remplacer.

ht.replace(2,"B","BB");
Ressources:
https://docs.oracle.com/javase/7/docs/api/java/util/Hashtable.html#put(K,%20V)

PHP - Corriger l'erreur Undefined variable

L'erreur Undefined variable souvent apparaît pendant l'exécution du script PHP sous forme d'un message:

Notice: Undefined variable: nom_variable in C:\wamp\www\projet\index.php on line 14
ca signifie quoi cette erreur et comment la corriger ?

L'erreur Undefined variable est causée parce qu'elle soit :
- Elle n'a pas été déclarée dans le code.
- Elle est utilisée dans un autre fichier qui utilise le même nom de variable.
- Elle n'a pas été initialisée.

La méthode isset() détecte si la variable existe et initialisée. Encore, la méthode empty() est plus optimale parce qu'elle ne génère pas de message d'erreur.

Exemple:

foreach ($array as $item) {
    // faire quelque chose
    $count++;
}
La variable count n'a pas été définie, et dans ce cas l'erreur Undefined variable apparaît.
Pour corriger ça, ajouter la variable count avant la boucle sans oublier l'initialisation à zéro.

$count=0;
foreach ($array as $item) {
    // faire quelque chose
    $count++;
}
Exemple 2:

session_start();
// solution recommendée
$nom_utilisateur = $_SESSION['nom_utilisateur'];
if (empty($nom_utilisateur)) $nom_utilisateur = '';

Ou

// définir la variable au début de index.php
$nom_utilisateur = ''; 
$nom_utilisateur = $_SESSION['nom_utilisateur'];

Ou 

$nom_utilisateur = $_SESSION['nom_utilisateur'];
if (!isset($nom_utilisateur)) $nom_utilisateur = '';
Il ne faut pas oublier d'initialiser la session avec session_start() sinon le serveur ne va pas pouvoir identifier et lire les variables $_SESSION.

Ressources:
http://php.net/manual/en/function.empty.php
PHP: “Notice: Undefined variable”

dimanche 8 octobre 2017

Se protéger des injections SQL en PHP

Si l'input d'utilisateur est inséré sans contrôle dans la requête SQL, alors l'application devient vulnérable aux attaques de type injection SQL, comme le montre l'exemple ci-dessous:

$variable = $_POST['input_utilisateur']; 

mysql_query("INSERT INTO `table` (`column`) VALUES ('$variable')");
Dans cet exemple, l'utilisateur peut entrer valeur'); DROP TABLE table;--') . La requête devient:

mysql_query("INSERT INTO `table` (`column`) VALUES ('valeur'); DROP TABLE table;--')

Le but du pirate est de modifier la requête SQL pour pouvoir lire des informations cachées ou exécuter n'importe quelle autre opération (lecture, modification, suppression). Dans cet exemple, la table est supprimée de la base de données.
Ce type de failles est la plus répandue et la plus dangereuse et si votre code n'est pas sécurisé, le risque serait énorme.

La solution au failles de type injection SQL est l'utilisation des requêtes préparées ou requêtes paramétrables. La préparation de l'exécution, la requête est envoyée au serveur de la base de données dont il effectue une vérification de la syntaxe. Avec cette méthode, il est impossible au pirate d'injecter un code SQL malveillant.

Pour cela, vous avez trois options:

1- En utilisant les PDO:

$statement = $pdo->prepare('SELECT * FROM administrateur WHERE nom = :nom');

$statement->execute(array('nom' => $nom));

foreach ($statement as $row) {
  // faire quelque chose
}
2- En utilisant MySQLi:

$statement = $dbConnection->prepare('SELECT * FROM administrateur WHERE nom = ?');
$statement->bind_param('s', $nom);

$statement->execute();

$result = $statement->get_result();
while ($row = $result->fetch_assoc()) {
   // faire quelque chose
}
3- En utilisant la méthode PHP mysql_real_escape_string
PHP a sa propre méthode pour corriger la cette faille, mais il faut noter que les deux méthodes précédentes sont plus efficaces. mysql_real_escape_string prend un string qui va être utilisé dans la requête MySQL et retourne la même chaîne de caractères échappée à toute injection SQL. Les quotes(') son replacés par \'. Cette fonction nécessite que vous soyez déjà connecté à la base de données pour l'utiliser.

$nom = "' OR 1'"; 

$nom = mysql_real_escape_string($nom);

$query = "SELECT * FROM administrateur WHERE nom = '$nom'";
echo "Injection évitée : <br />" . $query . "<br />";

$name_vul = "'; DELETE FROM administrateur WHERE 1 or nom = '"; 

$name_vul = mysql_real_escape_string($name_vul);

$query_vul = "SELECT * FROM administrateur WHERE nom = '$nom'";
echo "Injection évitée : <br />" . $query_vul;

Détecter un clic en JavaScript avec onClick

Vous pouvez détecter l'appui sur le bouton de la souris à l'intérieur d'une page web à l'aide d'un simple event handler et ensuite récupérer le type de l’élément appuyé.

Pour cela il est nécessaire de rendre notre code pour qu'il soit en écoute de l’événement qui va être déclenché. Il faut utiliser la méthode onClick. Vous pouvez extraire l'élément appuyé à partir de l'objet event.

<form>
   Entrer un nom<br />
   <input id="text" />
   <input type="button" value="Valider" />
</form>
<h3 id="res"></h3>
<script>
   document.onclick= function(event) {
      // l'evenement permet de détecter sur quel composant le clic est passé
      if (event===undefined) event= window.event;
      var target= 'target' in event? event.target : event.srcElement;
 
      document.getElementById("res").innerHTML = "J'ai cliqué sur un élement de type "+target.tagName;
   };
</script>
Exécution:
Entrer un nom


Il est impossible de détecter un clic en dehors de la page web comme le bouton retour et dans certains navigateurs pour des raisons de sécurité.

Renommer des fichiers en Java

La méthode renameTo() permet de renommer un fichier sous n'importe quel système d'exploitation comme windows par exemple. Elle retourne true si le fichier est renommé avec succès. Il faut toujours vérifier la valeur retournée pour être sure que le fichier a bien été renommé.

package com.codeurjava.File;

import java.io.File;

public class RenameFileJava {

    public static void main(String[] argv) {

      File ancien = new File("c:\\test\\ancienFichier.txt");
      File nouveau = new File("c:\\test\\nouveauFichier.txt");

      if(ancien.renameTo(nouveau))
         System.out.println("Le fichier "+ancien+" a bien été renommé.");
      else
         System.out.println("Echec! Le fichier "+ancien+" n'a pas pu être renommé.");
  
    }
}
Exécution:

Le fichier c:\test\ancienFichier.txt a bien été renommé.

Renommer plusieurs Fichiers avec une certaine extension

Le code suivant renomme une liste des fichiers appartenant à un répertoire. Dans cette exemple, c:\test\exemple est le répertoire, les fichiers sont renommés de cette façon: f1.txt, f2.txt,etc. Seulement les fichiers avec l'extension txt sont renommés.

package com.codeurjava.File;

import java.io.File;
import java.io.IOException;

public class RenameFilesJava {
 
    public static void main(String[] argv) throws IOException {

        File dossier = new File("c:\\test");
        File[] liste = dossier.listFiles();

        for (int i = 0; i < liste.length; i++) {

            if (liste[i].isFile()) { // si c'est un fichier
             
             //récupérer le fichier en cours
             File f = new File("c:\\test\\"+liste[i].getName()); 
             String extension = "";
             String ancien = liste[i].getName();
             
             //vérifier que l'extension est txt
             int index = ancien.lastIndexOf('.');
             if (index > 0) {
                 extension = ancien.substring(index+1);
             }
             if(extension.equals("txt")){
                 String nouveau = "f"+i+".txt";
                 f.renameTo(new File("c:\\test\\"+nouveau));
                 
                 System.out.println(ancien+" renommé => "+nouveau);
             }
             else{
              System.out.println(ancien+" n'est pas un fichier txt");
             }
            }
        }

        System.out.println("Opération terminée!");
    }
}
Exécution:

anc1.txt renommé => f0.txt
anc2.txt renommé => f1.txt
anc3.txt renommé => f2.txt
img_01.jpg n'est pas un fichier txt
table.sql n'est pas un fichier txt
Opération terminée!

Ressources:
https://docs.oracle.com/javase/7/docs/api/java/io/File.html#renameTo(java.io.File)
https://stackoverflow.com/questions/1158777/rename-a-file-using-java