Si possible, utilisez le module Ruby DBI, et au lieu d'essayer de citer vos chaînes, utilisez paramétrés préparé les requêtes, comme ceci:
dbh = DBI.connect("DBI:Mysql:test:localhost", "testuser", "testpass")
sth = dbh.prepare("INSERT INTO people (id, name, height) VALUES(?, ?, ?)")
File.open("people.txt", "r") do |f|
f.each_line do |line|
name, height = line.chomp.split("\t")
sth.execute(nil, name, height)
end
end
Citation seront traitées correctement pour vous, et les injections sera chose du passé.
Édition: Notez que cet exemple montre nil étant passé comme premier paramètre à exécuter(). Cela correspond au premier? dans la requête, et est traduit en "NULL" par le module DBI. Les autres paramètres sont également correctement cités et insérés dans la requête.
Pourquoi même insérer un champ id? Avec un design normal, cela serait automatiquement incrémenté. –
Ce n'est qu'un exemple. Mais notez que le premier paramètre à execute() est simplement nul, et le paramètre correspondant dans la requête (le premier point d'interrogation) est pour id. "id" est inséré comme NULL dans cet exemple. – greyfade
Je voulais connaître la même chose que l'OP, mais je voulais juste écrire des instructions SQL dans un fichier, donc je suppose que les instructions préparées sont hors de la table alors? Pourrais-je (ab) utiliser .inspect pour échapper des chaînes? – Jan