简体   繁体   中英

How do I send input from form to sqlite3 database

I want to create a program to registrar guests at a office. The thing I get stuck on is sending the input from the registration form to the database.

When I runt my program I get the following error:

Traceback (most recent call last):
  File "/home/ronny/Desktop/registratieinc/app.py", line 59, in <module>
    main()
  File "/home/ronny/Desktop/registratieinc/app.py", line 52, in main
    create_table(conn, sql_create_guests_table)
  File "/home/ronny/Desktop/registratieinc/app.py", line 32, in create_table
    c.execute(sql,guests)
sqlite3.ProgrammingError: Incorrect number of bindings supplied. The current statement uses 4, and there are 402 supplied.

My Python code:

from flask import Flask, render_template, url_for, request, redirect
from datetime import datetime
import sqlite3 
from sqlite3 import Error

app = Flask(__name__) 

# hier maak ik de db aan en een connectie
def create_connection(db_file):
    connection = None;
    try:
        conn = sqlite3.connect(db_file)
        print(sqlite3.version)
    except Error as e:
        print(e)

    return conn 

# hier roep ik de functie voor de db aan en maak ik een db file "gast.db"
if __name__ == '__main__':
    create_connection("gast.db") 

# hier maak ik de table aan voor de db (moet ik nog aanpassen voor sqlite3)


def create_table(conn, guests):

    sql = """ INSERT INTO guests(voor_naam,achter_naam,bedrijfs_naam,datum)
              VALUES(?,?,?,?) """ 

    c = conn.cursor()
    c.execute(sql,guests)
    return cur.lastrowid


def main():
    database = r"gast.db"

    sql_create_guests_table = """ CREATE TABLE IF NOT EXISTS guests (
                                        id integer PRIMARY KEY,
                                        voor_naam text NOT NULL,
                                        achter_naam text NOT NULL,
                                        bedrijfs_naam text NOT NULL,
                                        datum date NOT NULL

                                    ); """

    conn = create_connection(database)

    if conn is not None:
        # maak gast table
        create_table(conn, sql_create_guests_table)

    else:
        print("Error! cannot create the database connection.")


if __name__ == '__main__':
    main()


# hier zorg ik ervoor dat 
@app.route('/')
def index():
    return render_template("index.html")


# hier zorg ik ervoor dat de input uit het formulier naar de db gaat
@app.route('/my_form', methods=['POST'])
def my_form():
    if request.method == 'POST':
        c = conn.cursor()
        guest_vnaam = request.form.get('Voornaam')
        guest_anaam = request.form.get('Achternaam')
        guest_cnaam = request.form.get('Bedrijfsnaam')
        guest_datum = request.form.get('Datum')

        try:
            sql = ("INSERT INTO databasename.tablename (columnName,columnName,columnName,columnName Ci) VALUES (%s, %s, %s, %s)")
            c.execute(sql,(guest_vnaam, guest_anaam, guest_cnaam,  guest_datum))
            conn.commit() 
            #or "conn.commit()" (one of the two)
            return redirect('/')
        except:
            return 'Er ging iets fout met het opslaan van uw gegevens'

# hier run ik de app 
if __name__ == '__main__':
    app.run(debug=True)

And my HTML code:

{% block body %}

<form action="{{ url_for('my_form') }}" method="POST">
    <div class="container">
        <h1>Gasten registratie</h1>
        <p>Vul dit formulier in om te registreren</p>
        <hr>

        <label for="First-Name"><b>Voornaam</b></label>
        <input type="text" id="First-Name" placeholder="Vul hier uw voornaam in" name="Voornaam" required>

        <label for="Last-Name"><b>Achternaam</b></label>
        <input type="text" id="Last-Name" placeholder="Vul hier uw achternaam in" name="Achternaam" required>


        <label for="Company-name"><b>Bedrijfsnaam</b></label>
        <input type="text" id="Company-name" placeholder="Vul hier uw bedrijfsnaam in" name="Bedrijfsnaam" required>


        <label for="Date"><b>Datum</b></label>
        <input type="date" id="Date" placeholder="Selecteer de Datum" name="Datum" required />
        <hr>


        <p>In het kader van onze ISAE certificering registreren wij uw gegevens.</p>
        <p>Wij verwerken uw gegevens volgends de regels van het AVG.</p>
        <button type="submit" class="registerbtn">Registreren</button>
    </div>


</form>

{% endblock %}

If someone can help me, that'll be great.

Thanks in Advance.

Kind regards, Ronny

Here is a working copy of your Python Code : I also stylized this app for you and used CSS Grid. I also retrieve a guest listing when you register a new guest, to enhance this app for you. If you like please give me credit for answer. Thanks for your question.

from flask import Flask, render_template, url_for, request, redirect
from datetime import datetime
import sqlite3 
from sqlite3 import Error

app = Flask(__name__) 

# hier maak ik de db aan en een connectie
def insertGuest(guest_vnaam, guest_anaam, guest_cnaam,  guest_datum):
    database = "gast.db"
    tablename = "guests"
    con = sqlite3.connect(database)
    cur = con.cursor()
    cur.execute("INSERT INTO guests (voor_naam,achter_naam,bedrijfs_naam,datum) VALUES (?,?,?,?)", (guest_vnaam, guest_anaam, guest_cnaam, guest_datum))
    #sql = ("INSERT INTO database.tablename (columnName,columnName,columnName,columnName Ci) VALUES (%s, %s, %s, %s)")
    #cur.execute(sql,(guest_vnaam, guest_anaam, guest_cnaam,  guest_datum))
    con.commit()
    con.close()

def retrieveGuests():
     database = "gast.db"
     tablename = "guests"
     con = sqlite3.connect(database)
     cur = con.cursor()
     cur.execute("SELECT * FROM guests")
     guests = cur.fetchall()
     con.close()
     return guests

def create_connection(db_file):
    connection = None;
    try:
        conn = sqlite3.connect(db_file, check_same_thread=False)
        #conn = sqlite3.connect(db_file)
        print(sqlite3.version)
    except Error as e:
        print(e)
    return conn 

# hier roep ik de functie voor de db aan en maak ik een db file "gast.db"
if __name__ == '__main__':

   conn = create_connection("gast.db")
   c = conn.cursor()

# hier maak ik de table aan voor de db (moet ik nog aanpassen voor sqlite3)

def create_table(conn, guests):

 v1="test1"
 v2="test2"
 v3="test3"
 v4="dateTest4"
 c = conn.cursor()

 c.execute("CREATE TABLE IF NOT EXISTS guests (id INTEGER PRIMARY KEY, voor_naam TEXT NOT NULL,achter_naam TEXT NOT NULL,bedrijfs_naam TEXT NOT NULL,datum TEXT NOT NULL)")
 conn.commit()
 #c.close()

 #uncomment out the following lines of code if you want to insert test data
 #c.execute("INSERT INTO guests(voor_naam,achter_naam,bedrijfs_naam,datum) VALUES (?,?,?,?)",(v1,v2,v3,v4))
 #conn.commit()
 #conn.close()

 return c.lastrowid

def main():
    database = r"gast.db"

    conn = create_connection(database)
    c = conn.cursor()

    sql_create_guests_table = """ CREATE TABLE IF NOT EXISTS guests (
                                        id INTEGER PRIMARY KEY,
                                        voor_naam TEXT NOT NULL,
                                        achter_naam TEXT NOT NULL,
                                        bedrijfs_naam TEXT NOT NULL,
                                        datum TEXT NOT NULL
                                    ); """


    if conn is not None:
        # maak gast table
        create_table(conn, sql_create_guests_table)

    else:
        print("Error! cannot create the database connection.")

if __name__ == '__main__':
 main()

@app.route('/')
def index():
    return render_template("index.html")

@app.route('/my_form', methods=['POST', 'GET'])
def my_form():
    if request.method=='POST':
        guest_vnaam = request.form['Voornaam'] 
        guest_anaam = request.form['Achternaam']
        guest_cnaam = request.form['Bedrijfsnaam']
        guest_datum = request.form['Datum']

    try:
        insertGuest(guest_vnaam, guest_anaam, guest_cnaam,  guest_datum)
        guests = retrieveGuests()
        return render_template("index.html",guests = guests)
        #redirect('/')
    except:
        return 'Er ging iets fout met het opslaan van uw gegevens'

# hier run ik de app 
if __name__ == '__main__':
    app.run(debug=True)

Here is a retake of your Index.html also I put this file under a templates directory. Flask will locate it here.

<style>
  body{
    width:95%;
  }
    input{
    margin-top: 15;
    margin-bottom: 10;
  }
  h1 h2 h3 h4{
    font-size: 26px;
    font-weight: 700;
    color: #4c4c4c;
    text-align: center;
    padding-top: 10px;
    margin-top: 5px;
    margin-bottom: 5px;
  }
  .grid-container {
    display: grid;
    grid-template-columns: repeat(6, 1fr);
    grid-auto-rows: minmax(100px, auto);
    grid-gap: 1rem;
    grid-template-areas:
    'header header header header header header'
    'main main main right right right '
    'footer footer footer footer footer footer';
    background-color: rgb(75, 84, 91);
    padding: 10px;
    border-radius: 5%;
    } 

  .grid-container > .item1 {
    grid-area: header;
    background-color: rgba(239, 241, 74, 0.85);
    text-align: center;
    padding: 10px 10px ;
    font-size: 1em;
    box-shadow: 1px 1px 1px grey; 
    border: solid 2px rgb(0, 0, 0);
    border-radius: 5%;
    /* height:15rem;  */
    }

  .grid-container > .item2 {
    grid-area: main;
    background-color: rgba(187, 231, 172, 0.85);
    text-align: center;
    padding: 10px 0;
    font-size: 1em;
    box-shadow: 1px 1px 1px grey; 
    border: solid 2px rgb(0, 0, 0);
    border-radius: 5%;
    /* height:35rem; */
  }

  .grid-container > .item3 {
    grid-area: right;
    background-color: rgba(55, 238, 199, 0.85);
    text-align: center;
    /* margin: auto auto auto auto; */
    padding: 10px 0;
    font-size: 1em;
    box-shadow: 1px 1px 1px grey; 
    border: solid 2px black;
    border-radius: 5%;
    /* height:35rem; */
    }

    .grid-container > .item4 {
    grid-area: footer;
    background-color: rgba(26, 104, 238, 0.85);
    text-align: center;
    /* margin: auto auto auto auto; */
    padding: 10px 0;
    font-size: 1em;
    -webkit-border-radius: 8px/7px; 
    -moz-border-radius: 8px/7px; 
    border-radius: 8px/7px; 
    -webkit-box-shadow: 1px 1px 1px rgb(144, 102, 102); 
    -moz-box-shadow: 1px 1px 1px grey; 
    box-shadow: 1px 1px 1px grey; 
    border: solid 2px black; 
    color:white;
    /* height:5rem; */
    }
   .Glist{
    background-color: grey;
    color:white;
    border-radius: 5%;
   }
   table, th, td {
    border: 1px solid black;
  }
</style>


{% block body %}
<form action="{{ url_for('my_form') }}" method="POST">
    <div class="grid-container">
      <div class="item1"> 
      <h1 style="text-align:center">Gasten registratie</h1>
        <p style="text-align:center">Vul dit formulier in om te registreren</p>
        <!-- <hr> -->
      </div> 
        <div class="item2">
        <label for="First-Name"><b>Voornaam : </b></label>
        <input type="text" id="First-Name" placeholder="Vul hier uw voornaam in" name="Voornaam" required>

        <label for="Last-Name"><b>Achternaam : </b></label>
        <input type="text" id="Last-Name" placeholder="Vul hier uw achternaam in" name="Achternaam" required>
       </div>
       <div class="item3">
        <label for="Company-name"><b>Bedrijfsnaa : </b></label>
        <input type="text" id="Company-name" placeholder="Vul hier uw bedrijfsnaam in" name="Bedrijfsnaam" required>

        <label for="Date"><b>Datum : </b></label>
        <input type="date" id="Date" placeholder="Selecteer de Datum" name="Datum" required />
        </div>

        <!-- <hr> -->
        <div class="item4">
        <p>In het kader van onze ISAE certificering registreren wij uw gegevens.</p>
        <p>Wij verwerken uw gegevens volgends de regels van het AVG.</p>
        <button type="submit" class="registerbtn">Registreren</button>
        </div>
    </div>
</form>
<div class="Glist" >
    {%if guests%}
    <div class="guests" style="text-align:center;">
      <h2>Guests List</h2>
      <table style="width:100%;">
        {%for guest in guests%}
          <tr>
            <td>{{guest[0]}}</td><td>{{guest[1]}}</td><td>{{guest[2]}}</td><td>{{guest[3]}}</td><td>{{guest[4]}}</td>
          </tr>   
        {%endfor%}
      </table>
    </div>
    {%endif%}
    </div>
{% endblock %}

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM