Tout d'abord pour l'enregistrement des données dans une base de données, il faut utiliser mysql_real_escape_string(). Cette fonction va ajouter des antislashes sur les guillemets simples, les guillemets doubles et d'autres caractères. Pour plus d'information sur cette fonction, je vous conseille de voir la documentation officielle.
Me diriez-vous : Magic Quotes ne sert-il pas à ça ?
Tout d'abord il faut savoir que Magic Quotes est amené à disparaitre avec l'arrivé de PHP6. De plus par défaut, Magic Quotes est désactivé avec PHP5.

Voici comment désactiver les Magic Quotes :
Via le fichier de configuration php.ini :

magic_quotes_gpc = Off


Via .htaccess :

SetEnv MAGIC_QUOTES 0


Ou :

php_flag magic_quotes_gpc 0


Si ces manipulations n'ont pas fonctionnées et que vous n'avez pas accès au fichier de configuration de PHP, rien est perdu.

Il va vous suffir de mettre le code ci-dessous au début de vos scripts :

<?php

define('MAGIC_QUOTES', get_magic_quotes_gpc());

// Création de la fonction
function no_magic_quotes(&$array) {
/*
Script réalisé par Besset Francis
Vous pouvez utiliser et distribuer librement ce code
à condition de laisser le nom du réalisateur du code.
http://www.apercite.fr
*/

    // Détection si magic_quotes est activé
    if(MAGIC_QUOTES) {
        foreach($array as $key => $val) {
            // Si la variable est un tableau
            if(is_array($val)) {
                // Alors on rappelle la fonction pour traiter ce tableau
                no_magic_quotes($array[$key]);
            }
            // Sinon si la variable n'est pas un numérique alors elle est susceptible de contenir des antislahs ou quotes ajouté par Magic Quotes (Sybase)
            elseif(!is_numeric($val)) {
                // Alors on lui enlève les antislashs ajoutés par Magic Quotes
                $array[$key] = stripslashes($val);
            }
        }
    }
}

// Voici la liste des superglobales touchées par Magic Quotes :
no_magic_quotes($_GET);
no_magic_quotes($_POST);
no_magic_quotes($_COOKIE);

?>

A noter que le code ci-dessus, enlèvera les antislashes ajouter par Magic Quotes uniquement si Magic Quotes est activé.
Nous voilà donc séparé des Magic Quotes et nous tendons les bras grand ouvert vers mysql_real_escape_string().

Pour l'affichage d'une donnée sur une page venant de la base de données ou des $_POST, $_COOKIE, $_GET, je vous conseille grandement d'utiliser htmlspecialchars() avec l'option ENT_QUOTES afin de transformer les caractères suivant en entités HTML :

  • " & " devient " &amp; "
  • " " " devient " &quot; "
  • " ' " devient " #039; "
  • " < " devient " &lt; "
  • " > " devient " &gt; "

Ainsi on ne pourra pas "casser" votre joli design lors de l'affichage de données dynamiques.
Je vous conseil de visiter la documentation de cette fonction afin de pouvoir voir les différentes options qu'elle peut prendre en compte.

Pour bien être clair, que ce soit sur la page en elle même ou bien lors de l'affichage de données dans un formulaire, il faut appliquer afin d'éviter tout "cassage" de la page.

Mais c'est bien joli tout ça mais lorsque l'on renvoi le formulaire avec des entités HTML qui on été encodé par htmlspecialchars(), ça renvoit les entités et pas les caractères correspondant et donc l'enregistrement de ces données dans le SGBD ça va pas être du joli.
Heureusement j'ai LA solution ! Il va falloir décoder les entités HTML en caractères normaux. Pour celà on va utiliser le contraire de htmlspecialchars() : htmlspecialchars_decode(). Malheureusement cette fonction est accessible qu'à partir de PHP 5.1.0. Mais pour vous j'ai développé le sosi de cette fonction pour PHP 4 :

<?php

// Si la fonction htmlspecialchars_decode() n'existe pas
if(!function_exists('htmlspecialchars_decode')) {
    // Alors on la crée
    function htmlspecialchars_decode($string, $quote_style=ENT_COMPAT) {
/*
Script réalisé par Besset Francis
Vous pouvez utiliser et distribuer librement ce code
à condition de laisser le nom du réalisateur du code.
http://www.apercite.fr
*/

        $search = array('&amp;', '&lt;', '&gt;');
        $replace = array('&', '<', '>');

        if($quote_style >= ENT_COMPAT) {
            $search[] = '&quot;';
            $replace[] = '"';

            if($quote_style == ENT_QUOTES) {
                $search[] = '&#039;';
                $replace[] = "'";
            }
        }

        return str_replace($search, $replace, $string);
    }
}

?>

La fonction ci-dessus a exactement le même comportement que la fonction officielle portant ce même nom.

Si jamais vous utilisez PostGreSQL, il va vous falloir protèger vos données nom pas avec mysql_real_escape_string() mais pg_escape_string() pour un champ texte et pg_escape_bytea() pour un champ de type bytea.

Attention : Bien sûr il est inutile d'utiliser mysql_real_escape_string(), pg_escape_string() et pg_escape_bytea() sur des champs de type numérique. Il est donc bien évident qu'aucun caractère ne sera précédé d'un antislash puisque la valeur sera logiquement une valeur numérique.
Cependant assurez-vous bien au préalable que la valeur est bien un numérique avec is_numeric().