Ввод текста HTML и использование ввода в качестве переменной в скрипте (tcl) / sql (sqlite) - PullRequest
0 голосов
/ 21 апреля 2010

Я очень ОЧЕНЬ новичок во всей этой паутине. И я просто очень смущен в целом. По сути, я хочу сделать ввод через текст с использованием HTML и добавить его в базу данных, таблица trans. Должно быть просто, но я потерялся.

    <li>Transaction Number</li>
    <li><input type=|text| name=|tnumber| </li> // do i need to use value?
    <li>Employee Name</li>
    <li><input type=|text| name=|ename| </li>
    <li><input type=|SUBMIT| value=|Add|></li>


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

Они оба находятся в одном файле, и в базе данных есть только два поля для простоты. Здесь я вижу, что tnumber и ename не объявлены как переменные. Так как мне сделать так, чтобы ввод текста был назначен соответствующим переменным?

1 Ответ

3 голосов
/ 22 апреля 2010

Вам нужен пакет ncgi (в Tcllib), который вы можете использовать для декодирования значений в форме и извлечения их в переменные. Для этого у вас будет веб-страница с такой формой:

<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>

(Я не буду вдаваться в подробности написания формы на веб-странице.)

Затем в вашей программе (addTransaction.tcl) вы делаете что-то вроде этого:

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

Обратите внимание, что я изменил имена переменных, чтобы они отличались от имен в веб-форме. Это показывает, что они не обязательно должны быть одинаковыми . Следует также отметить, что вы можете сделать поле номера транзакции необязательным (указать значение по умолчанию через второй необязательный аргумент для ncgi::value), а также, возможно, было бы лучше создать идентификаторы транзакций в базе данных (но это еще один отдельный вопрос; в этом ответе я сосредоточился на том, как подключиться из Интернета к SQLite).

Более интересен тот факт, что приведенный выше код не содержит атак с использованием SQL-инъекций. Однако всякий раз, когда вы берете содержимое базы данных и отправляете его обратно в Интернет, вам нужно быть осторожным, иначе вы оставите открытые XSS-атаки. Именно тогда полезен html пакет (снова Tcllib), так как он позволяет вам генерировать правильный вывод без риска с минимальными усилиями. Но это другой вопрос ...

...