[mysqltcl] Erreur d'insert
#1
Bonjour à tous,

Encore une énigme pour ma part, toujours sur le mysqltcl via Eggdrop
Cette fois-ci, mon soucis vient d'un d'une requête:
- création dans la table

Explications:
J'ai une commande .xtopic (elle me permet crée le topic via l' eggdrop et ainsi l'ajouté à la table topic SQL)

Or, si jamais dans mon [lrange $arg 1 end] (puisque mon chan = [string tolower [lindex $arg 0]]) il y a le caractère: ' (apostrophe) il refuse toute action sur la commande et me demande de me reporté à ma doc mySQL

Code :
bind dcc - xtopic dcc:xtopic
proc dcc:xtopic {hand idx arg} {
if {[matchattr $hand n] || [matchattr $hand A]} {
set chan [string tolower [lindex $arg 0]]
set topic  [lrange $arg 1 end]
if {$chan=="" || ![string match #* $chan] || $topic==""} { putddc $idx "\2.xtopic\2 <#channel> <topic text>"; return 0 }
if [isvalidchan $chan] {
service:connect
mysqlsel $::mysqlink "INSERT INTO topic (chan, topic, auteur) VALUES ('$chan', '[join $topic]', '$hand')"
service:deconnect
putlog "#\2$hand\2# .xtopic ~> \($chan\) [join $topic]"
} else { putdcc $idx "\2Error\2 le salon déclaré n'existe pas"; return 0 }
} else { avertdcc $hand }
}
 

Merci de toute réponse que vous allez faire ainsi que votre lecture
Répondre Avertir
#2
Yep simon,

Je connais pas trop le mysql mais de mémoire tu fait un apostrophe au début et tu le ferme qu'a la fin il me semble si je ne dit pas de conneries..
Mais je pense que j'ai tord
Répondre Avertir
#3
C'est pas sa le soucis Fred,
C'est si jamais j'utilise le char ' (apostrophe) dans l'insert INTO sa me sort une erreur,
Exemple:

.xtopic #test Bonjour pour de l'aide -> #Aide

Et la le Eggdrop me dis poliment d'aller me faire foutre puisque il ne comprends pas 'aide
En gros il prends 'aide pour une colone de la table topic

Et je cherche quelques par si il y a une solution
Répondre Avertir
#4
Ce qui est normal, c'est du MySQL. Il faut protéger les apostrophes.
Donc:
tcl
set topic [join [lrange $arg 1 end]]
regsub -all -- \\\' $topic \\\\\' topic


Répondre
#5
Encore un grand merci à toi Crazy !
Répondre Avertir
#6
Bien que la solution de CrazyCat est totalement fonctionnel...

Je suggère la fonction ::mysql::escape proposer par mysqltcl qui le fait est qui est plus rapide:

Citation :::mysql::escape ?handle? string
Returns the content of string, with all special characters escaped, so that it is suitable for use in an SQL statement. This is simpler (faster) than using a general regexp or string map. If handle is specified C-API function mysql_real_escape_string is used. This is the recommended usage because in this case current character set is respected.

source site officiel : http://www.xdobry.de/mysqltcl/mysqltcl.html#22
Répondre Avertir
#7
Bien vu, je mettrai à jour le wiki dès que possible.
Répondre
#8
(10/07/2013, 11:23)CrazyCat a écrit : Bien vu, je mettrai à jour le wiki dès que possible.

Je me suis permis de le faire. J’espère l'avoir fais correctement.

http://wiki.eggdrop.fr/Mysqlescape


EDIT (hors topic) :
On rajouterai pas ::mysql::insertid ?
Je vois souvent dans des codes un Insert, suivis d'un select pour prendre le ID, suivis -par fois- d'un Update/Insert ID.
Répondre Avertir
#9
Nickel pour la page Mysqlescape, j'ai juste déplacé le lien vers la page officielle dans le chapitre "voir aussi".
Tu peux ajouter le insertid, ça ne me pose aucun souci, bien au contraire.
Répondre


Atteindre :


Utilisateur(s) parcourant ce sujet : 1 visiteur(s)
Tchat 100% gratuit -Discutez en toute liberté