2009-10-14 6 views
1

J'essaie d'essayer de récupérer certaines valeurs d'un utilisateur en utilisant un widget QLineEdit. Quand un QPushButton déclenche un événement cliqué, je veux que le texte soit récupéré de tous les widgets QLineEdit et stocké dans une base de données MySQL locale. Cependant, lorsque j'essaie d'utiliser une substitution de chaîne dans l'instruction insert, les valeurs ne sont pas remplacées. Voici ma déclaration sql:Python/PyQT QString ne va pas insérer dans la base de données MySQL

sql = 'INSERT INTO jobs (incident_id, organization, organization_poc, media_type) VALUES ("%s", "%s", "%s", "%s")' % (self.edi_IncidentID.text(), self.edi_OrganizationAffected.text(), self.edi_OrganizationContact.text(), self.edi_MediaType.text()) 

Toutes les variables self.edi_xxx ne sont que des widgets QLineEdit. Quand un bouton est enfoncé, ce qui suit est tiré:

self.connect(btn_Submit, QtCore.SIGNAL('clicked()'), self.submitForm) 

Tout soumettre fait est de créer un objet de base de données et écrire les valeurs à la base de données. Cependant, pour le débogage, j'imprime l'instruction SQL construite et cela sort: INSERT INTO jobs (incident_id, organisation, organisation_poc, media_type) VALUES ("", "", "", "").

J'ai également essayé d'utiliser la fonction str() pour convertir une chaîne QString en une chaîne mais la même chose se produit.

Toute aide serait grandement appréciée :)?

L

EDIT: Voici le code complet moins les importations:

class Database(): 
def __init__(self): 
    self.db_host = "localhost" 
    self.db_user = "***********" 
    self.db_pass = "***********" 
    self.db_name = "incidents" 

def openConn(self): 
    self.db = MySQLdb.connect(self.db_host, self.db_user, self.db_pass, self.db_name) 

def closeConn(self): 
    self.db.close() 

def writeValues(self, sql): 
    self.openConn() 
    self.cursor = self.db.cursor() 
    self.cursor.execute(sql) 
    self.cursor.fetchone() 
    self.closeConn() 

class NewIncidentForm(QtGui.QWidget): 
def __init__(self, parent=None): 
    QtGui.QWidget.__init__(self, parent) 

    self.setWindowTitle('New Incident') 

    lbl_IncidentID = QtGui.QLabel('Incident ID:') 
    lbl_MediaType = QtGui.QLabel('Media Type:') 
    lbl_OrganizationAffected = QtGui.QLabel('Organization Affected:') 
    lbl_OrganizationContact = QtGui.QLabel('Organization Point of Contact: ') 

    self.edi_IncidentID = QtGui.QLineEdit() 
    self.edi_MediaType = QtGui.QLineEdit() 
    self.edi_OrganizationAffected = QtGui.QLineEdit() 
    self.edi_OrganizationContact = QtGui.QLineEdit() 


    btn_Submit = QtGui.QPushButton('Submit') 

    grid = QtGui.QGridLayout() 
    grid.setSpacing(10) 

    grid.addWidget(lbl_IncidentID, 1, 0) 
    grid.addWidget(self.edi_IncidentID, 1, 1) 

    grid.addWidget(lbl_MediaType, 3, 0) 
    grid.addWidget(self.edi_MediaType, 3, 1) 

    grid.addWidget(lbl_OrganizationAffected, 4, 0) 
    grid.addWidget(self.edi_OrganizationAffected, 4, 1) 

    grid.addWidget(lbl_OrganizationContact, 5, 0) 
    grid.addWidget(self.edi_OrganizationContact, 5, 1) 

    grid.addWidget(btn_Submit, 15, 0) 

    self.sql = 'INSERT INTO jobs (incident_id, organization, organization_poc, media_type) VALUES ("%s", "%s", "%s", "%s")' % (self.edi_IncidentID.text(), self.edi_OrganizationAffected.text(), self.edi_OrganizationContact.text(), self.edi_MediaType.text()) 
    self.connect(btn_Submit, QtCore.SIGNAL('clicked()'), self.submitForm)   

    self.setLayout(grid) 
    self.resize(350, 300) 

def submitForm(self): 
    db = Database() 
    db.writeValues(self.sql) 

app = QtGui.QApplication(sys.argv) 
qb = NewIncidentForm() 
qb.show() 
sys.exit(app.exec_()) 
+0

Pouvez-vous poster plus de code? Jusqu'à présent, cela peut être tout et rien. D'ailleurs si j'étais vous je changerais le code puisque vous pouvez avoir une attaque d'injection de SQL à la DB en obtenant en tant qu'entrée: sql = 'INSERT dans des travaux (incident_id, organisation, organisation_poc, type_médias) VALEURS ("% s ","% s ","% s ","% s ") '% ( " "," "," ","); DELETE jobs; ") – mandel

+0

a ajouté le reste du code .. et il être vulnérable à l'injection SQL si elle pouvait écrire quelque chose dans la base de données: P –

Répondre

1

: D QString ont __str__ fonctions alors essayez ceci:

self.sql = 'INSERT INTO jobs (incident_id, organization, organization_poc, media_type) VALUES ("%s", "%s", "%s", "%s")' % (''.join(self.edi_IncidentID.text()), ''.join(self.edi_OrganizationAffected.text()), ''.join(self.edi_OrganizationContact.text()), ''.join(self.edi_MediaType.text())) 

ajouté ''.join()

Ou QString doit f8()

donc changer self.edi_IncidentIS.text() à:

self.edi_IncidentIS.text().toUtf8() 

instruction entier:

self.sql = 'INSERT INTO jobs (incident_id, organization, organization_poc, media_type) VALUES ("%s", "%s", "%s", "%s")' % (self.edi_IncidentID.text().toUtf8(), self.edi_OrganizationAffected.text().toUtf8(), self.edi_OrganizationContact.text().toUtf8(), self.edi_MediaType.text().toUtf8()) 
1

La raison est très simple:

self.sql devrait être en def submitForm (auto):

pas dans def init (auto, parent = aucun):

car otherweise c'est nul!

1

l'autre partie qui manque pour le programme est la fonction commit() d'avoir des données stockées ou autocommit (true) à la mendicité du script

def closeConn(self): 
self.db.close() 
self.db.commit() 

def submitForm(self): 
db = Database() 
self.sql = 'INSERT INTO jobs (incident_id, organization, organization_poc, media_type) VALUES ("%s", "%s", "%s", "%s")' % (self.edi_IncidentID.text(), self.edi_OrganizationAffected.text(), self.edi_OrganizationContact.text(), self.edi_MediaType.text())  
db.writeValues(self.sql) 
Questions connexes