Search code examples
pythonmysqlmysql-connector

mysql.connector.errors.ProgrammingError: 1210 - whenever I do a 2-digit query - works fine with 1 digits


My code:

import threading
import tkinter as tk
import pip
import time
import mysql.connector
from time import sleep
global score
global countdown

en = 1
score = 0
countdown = 1
print("Hiya!")

mydb = mysql.connector.connect(
    host="",
    user="",
    password="",
    database='',
    auth_plugin='mysql_native_password'
)

mycursor = mydb.cursor(prepared=True)
#MYSQL Commands!

#Læser en af de 3 værdier fra MYSQL-databasen
def læsVærdi(command):
    mycursor.execute(command)
    råVærdi = mycursor.fetchone()
    værdi = float("{}".format('%.2f' % råVærdi))
    return værdi

#De Tre læs-MySQL-værdi-commands
læsTidMål = "SELECT tidMål FROM bois WHERE id = 1" #Læser Timerens Slutmål
læsTidScoreNu = "SELECT tidSCoreNu FROM bois WHERE id = 1"
læsStopKnap = "SELECT stopKnap FROM bois WHERE id = 1" #Læser hvilket stadie knappen er i (start/stop)



#Opdaterer en af de 2 værdier fra MYSQL-databasen
def opdaterVærdi(command,id,nyeVærdi):
    nyeVærdi = float(nyeVærdi)
    mycursor.execute(command,(nyeVærdi,id))
    mydb.commit()

#De To opdater-MySQL-værdi-commands
opdaterTidScoreNu = "UPDATE bois SET tidScoreNu = %s WHERE id = %s"
opdaterSlutScore = "UPDATE bois SET score = %s WHERE id = %s"


#Tjekker om pinkoden matcher, returnerer 1 hvis den gør, returnerer 0, hvis ikke.
def pinkodeTester(pinkode):
    pinkode = str(pinkode)
    mycursor.execute("select id,adresse,name,pinkode_brugt,score FROM bois where id= %s",(pinkode))
    myresult = mycursor.fetchall() #Henter alle rows, hvor id = pinkoden
    row_count = mycursor.rowcount #Tjekker hvor mange, der er
    print(row_count)

    if pinkode == 1:
        print("da id 1 bliver brug til at gemme tiden, kan den desværre ikke bruges")
    elif row_count == 1:
        return(1)
    elif row_count != 1:
        return(0)

def timer(id):  # id er den bruger, der skal have gemt sin score på sig,tælder op mod tidsmålet og returnerer scoren til sidst
    f = pinkodeTester(id)
    if f == 1:
        tidsMål = læsVærdi(læsTidMål)
        stopKnap = læsVærdi(læsStopKnap)
        i = 0
        while (i != tidsMål) and (i <= tidsMål) and (stopKnap != 0): #mangler en function, der læser fra arduinoen og ser, om der er blevet trykket på knappen
            i = float(i + 0.01)
            tidsMål = læsVærdi(læsTidMål)
            stopKnap = læsVærdi(læsStopKnap)
            score = str("{}".format('%.2f' % i))  # Omdanner i til en string, der har 2 decimaler, så den kan bruges i kommanden
            opdaterVærdi(opdaterTidScoreNu, 1, i)  # Gemmer score's værdi på databasen - admin portalen (og timeren) bruger dette til at tælde ned
            time.sleep(0.01)
        if (i != tidsMål):  # hvis spillet stoppes, sendes scoren tilbage or funktionen stoppes
            return (score)
        else:  # Ellers, returneres scoren også
            return (score)



a = pinkodeTester(10)
print(a)

The problem is with the pinkodeTester funktion.

I have 10 rows with ID's going from 1-10, where 1 is used for permanent storage.

Whenever I use pinkodeTester(2-9) it works fine, but at exactly 10 it doesn't work. I have tried with other 2 digit values, and it returns the same error message.

Full error message:

Traceback (most recent call last):
  File "C:/Users/Mandem/Downloads/Test-uden-admin-i-servo (1).py", line 87, in <module>
    a = pinkodeTester(10)
  File "C:/Users/Mandem/Downloads/Test-uden-admin-i-servo (1).py", line 55, in pinkodeTester
    mycursor.execute("select id,adresse,name,pinkode_brugt,score FROM bois where id= %s",(pinkode))
  File "C:\Users\Mandem\AppData\Local\Programs\Python\Python38-32\lib\site-packages\mysql\connector\cursor.py", line 1208, in execute
    raise errors.ProgrammingError(
mysql.connector.errors.ProgrammingError: 1210: Incorrect number of arguments executing prepared statement

The prepared statement is of course

"SELECT id,adresse,name,pinkode_brugt,score FROM bois WHERE id = %s"

Now is it possible, that it for some reasons interprets the double digits as two single characters? Or something alike? If not, I simply cannot think of what could be the problem if it functions with single digit queries.


Solution

  • Please use the correct format for a single value tuple:

    mycursor.execute("select id,adresse,name,pinkode_brugt,score FROM bois where id= %s",(pinkode,))