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 :

Contrôle apostrophes inutile ?


Sujet :

PHP & Base de données

  1. #1
    Membre du Club
    Femme Profil pro
    Développeur Web
    Inscrit en
    Juillet 2012
    Messages
    49
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Transports

    Informations forums :
    Inscription : Juillet 2012
    Messages : 49
    Points : 42
    Points
    42
    Par défaut Contrôle apostrophes inutile ?
    Bonjour,

    Au travail, je suis chargée de réparer les bugs d'une application web que je n'ai pas conçus, développée avec ExtJs pour préciser.

    Mon bug d'aujourd'hui : quand du texte avec apostrophe est enregistré en BDD, les apostrophes doublent.

    Normalement quand on enregistre du texte avec apostrophe en bdd on doit faire ça pour éviter les erreurs sql :

    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    $v = str_replace("'", "''", $v);

    Cependant c'est cette ligne qui fait que les apostrophes doublent, quand j’enlève cette ligne sa marche nickel !

    Le php exécute ensuite une procédure stockée SQL Server, voici l'extrait qui traite les données de type texte :

    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    begin transaction
    -- Astuce pour récupérer une donnée text : créer une table temporaire
    create table #ttTexte (Id int,Texte text)
    insert into #ttTexte (Id,Texte) select 1,@sval
    set @PDef = N'@pDate datetime'
    set @SQL = 'update ' + @Col_Table_Nom + ' set ' + @Col_Colon_Nom +
    '=Texte from #ttTexte WHERE Id = 1 and IdDate = @pDate '
    execute sp_executesql @SQL, @PDef, @pDate = @idDate
    drop table #ttTexte
    end

    Je pense que c'est cette partie de code qui empêche qu'une apostrophe vienne causé des erreurs SQL.

    Ma question est... pourquoi ? Le fait de mettre le texte dans une table temporaire avant l'insertion empêche les erreurs SQL dus aux apostrophes ?

    Je ne comprend pas, quelqu'un pourrait-il m'expliquer ?

    Après quelqu'un va me dire, "mais osef tant que sa marche!" Mais non.

    J'aime bien comprendre comment ça marche et surtout apprendre Smiley smile

    Merci d'avance !

  2. #2
    Membre confirmé
    Homme Profil pro
    nope
    Inscrit en
    Décembre 2012
    Messages
    122
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : nope

    Informations forums :
    Inscription : Décembre 2012
    Messages : 122
    Points : 466
    Points
    466
    Par défaut
    Citation Envoyé par July171292 Voir le message

    Normalement quand on enregistre du texte avec apostrophe en bdd on doit faire ça pour éviter les erreurs sql :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $v = str_replace("'", "''", $v);
    oui et non, perso j'ai plus tendance à le faire avec des fonctions existantes (par exemple l'escape string de mysql http://php.net/manual/fr/function.my...ape-string.php ), dans le cas d'un SQL server l'équivalent doit bien exister quelque part, donc oui pour l'intention, mais pas forcément pour la méthode.

    Après fouille rapide mysql_real_escape_string n'a pas l'air d'avoir d'équivalent pour MS SQL Server, donc ta méthode est correcte, mais ce n'est pas la seule possible

    Citation Envoyé par July171292 Voir le message

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    begin transaction
    -- Astuce pour récupérer une donnée text : créer une table temporaire
    create table #ttTexte (Id int,Texte text)
    insert into #ttTexte (Id,Texte) select 1,@sval
    set @PDef = N'@pDate datetime'
    set @SQL = 'update ' + @Col_Table_Nom + ' set ' + @Col_Colon_Nom +
    '=Texte from #ttTexte WHERE Id = 1 and IdDate = @pDate '
    execute sp_executesql @SQL, @PDef, @pDate = @idDate
    drop table #ttTexte
    end
    pour cette procédure stockée je n'ai pas l'impression qu'elle fasse quoique ce soit avec les quotes, n'y aurait il pas par exemple un trigger qui lui fait l'échappe avant les inserts ? je pense plutot que c'est de ce coté là qu'il faut regarder

    Bilan : si le traitement est fait quelque part pas la peine de le faire 2 fois, pour ce qui est de savoir où, moi je pencherai plus vers un trigger qui lui s’exécute automatiquement au niveau de la base, et n'est pas appelé via PHP.

  3. #3
    Rédacteur

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2002
    Messages
    608
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mars 2002
    Messages : 608
    Points : 1 561
    Points
    1 561
    Par défaut
    Doubler l'apostrophe est inutile ici parce qu'on ne récupère pas directement le contenu de la variable pour la mettre dans une chaîne sql.

    Si j'écris :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $sql = "update latable set texte='c'est du texte' where id = 1";
    Ca va planter parce que 'c'est du texte' contient une apostrophe donc la requête n'est pas syntaxiquement correcte, ce qu'on corrige en doublant l'apostrophe.

    Mais la procédure stockée fait un truc équivalent à :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $sql = "update latable set texte = (select texte from autretable where id=1) where id = 1";
    Ici peu importe ce que renvoie (select texte from autretable where id=1). Les apostrophes ne doivent pas être doublées.

Discussions similaires

  1. Codes de contrôle des imprimantes
    Par hetzel dans le forum Langages de programmation
    Réponses: 3
    Dernier message: 21/03/2003, 17h17
  2. [ActiveX] Propriété "Picture" dans un contrôle util
    Par Ricou13 dans le forum VB 6 et antérieur
    Réponses: 3
    Dernier message: 14/12/2002, 15h59
  3. Réponses: 2
    Dernier message: 03/12/2002, 11h42
  4. [contrôle] dbDateTimePicker ???
    Par Fizgig dans le forum Composants VCL
    Réponses: 2
    Dernier message: 28/11/2002, 15h45
  5. [Kylix] Contrôle DBGrid
    Par KThrax dans le forum EDI
    Réponses: 1
    Dernier message: 10/05/2002, 14h18

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