2010-04-21 22 views
0

Je suis très très nouveau sur ce site web. Et je suis juste très confus en général. Fondamentalement, ce que je veux faire est de prendre une entrée via le texte en utilisant HTML et en ajoutant cette entrée à la base de données, table trans. Devrait être simple mais je suis perdu. Ils sont tous deux dans un même fichier et il n'y a que deux champs dans la base de données pour simplifier les choses. Ce que je peux voir ici, c'est que tnumber et ename ne sont pas déclarés comme variables. Alors, comment puis-je faire pour que l'entrée de texte soit affectée aux variables respectives?Saisie de texte HTML et utilisation de l'entrée comme variable dans un script (tcl)/sql (sqlite)

+0

J'ai corrigé les erreurs évidentes dans votre code; ils ne se rapportaient pas à la question de savoir comment coupler le formulaire au code Tcl. –

+0

Vous devez fournir un peu plus d'informations. En particulier, dans quel environnement envisagez-vous de faire ce traitement? (par exemple, CGI?) –

+0

oui, ce serait CGI –

Répondre

3

Vous recherchez le ncgi package (dans Tcllib), que vous pouvez utiliser pour décoder les valeurs dans le formulaire et les extraire en variables. Pour ce faire, vous auriez une page Web avec une forme comme ceci:

<form method="POST" action="/cgi-bin/addTransaction.tcl"> 
    <li>Transaction Number: <input type="text" name="tnumber"> 
    <li>Employee Name:  <input type="text" name="ename"> 
    <li><input type="submit" value="Add"> 
</form> 

(. Je ne vais pas aller dans beaucoup plus de profondeur avec les détails de la rédaction d'un formulaire sur une page Web)

Ensuite, , dans votre programme (addTransaction.tcl) vous faites quelque chose comme ceci:

package require ncgi 
package require sqlite3 

ncgi::parse 

set xact [ncgi::value "tnumber"] 
set name [ncgi::value "ename"] 

sqlite3 db $::env(ROOT)/database.db 
db eval {INSERT INTO trans VALUES ($xact, $name)} 
db close 

Notez que j'ai changé les noms des variables à différentes de celles du formulaire en ligne. Ceci est pour montrer qu'ils n'ont pas besoin d'être les mêmes. Quelques autres choses à noter sont que vous pouvez rendre le champ de numéro de transaction facultatif (fournir un argument par défaut via le deuxième argument optionnel à ncgi::value) et il peut également être préférable de générer des identifiants de transaction dans la base de données (mais c'est une autre question distincte; Je me suis concentré dans cette réponse sur la façon de coupler à partir du web dans SQLite). Il est plus intéressant de noter que le code ci-dessus est exempt d'attaques par injection de code SQL. Cependant, chaque fois que vous enlevez le contenu de la base de données et que vous le renvoyez sur le Web, vous devez faire attention à nouveau ou laisser des attaques XSS ouvertes. C'est là que le html package (Tcllib à nouveau) est utile, car il vous permet de générer une sortie correcte sans danger avec un effort minimal. Mais c'est une autre question ...