2017-05-28 27 views
-1

我很困惑 - 我已經多次編寫相同的代碼,從來沒有這個問題。我對python的瞭解並沒有遠遠超出自我教導的東西,爲我的iOS應用程序構建一個rest框架。當我讓我的api調用來檢索這個特定路徑的一些數據時,MySQL不斷返回'錯誤',因爲由於某種原因,我傳遞的變量被作爲可選類型傳遞(我想--b/coz print語句打印:可選(1))爲什麼這個變量的類型可選...?

有人可以解釋這裏發生了什麼嗎?爲什麼這個相同的確切代碼在我的其他路徑中工作正常?我甚至嘗試將它作爲一個字符串。在我的iOS應用中使api調用的函數只接受一個字符串作爲參數......運行帶有硬編碼值的MySQL查詢總是有效的。

*****座板是我改名MySQLdb的escape_string *****

查詢功能:

def checkAnswers(gameId): 

    print("inside check answers function") 
    print(gameId) 

    id = str(gameId) 

    c, conn = connection() 

    data = c.execute("SELECT answer_one, answer_two FROM games WHERE game_id='%s'" % (thwart(id))) 

    if data: 
     return c.fetchall() 
    return "error" 

裏面的main.py文件的正確路徑下我有這樣的代碼片段:(打印(數據)始終打印「錯誤」)

print("inside check answers path") 
json = request.get_json() 

gameId = str(json["gameId"]) 

data = checkAnswers(gameId) 

print("answer data ----->") 
print(data) 
+1

檢查'checkAnswers'函數中'thwart(id)'的值。當你這樣做的時候,請改變你的代碼來使用'execute'方法的第二個參數,而不要在'%'中使用字符串格式。你的方式來打開一個巨大的安全漏洞。 – Matthias

+0

@matthias thwart(id)也打印可選(1),就像print(gameId)一樣。我不確定如何在不使用%的字符串格式的情況下執行此操作。感謝您的反饋至今 – user7804097

+1

關於主要問題:'thwart'似乎是您的功能。你應該知道它會返回什麼並獲得你真正想要的價值。關於'execute'的第二個參數:[閱讀'execute'的文檔](https://www.python.org/dev/peps/pep-0249/#id15) – Matthias

回答

0

execute沒有返回值,檢查它,沒有任何意義,只是檢查的fetchall空結果:

def checkAnswers(gameId): 
    print("inside check answers function") 
    print(gameId) 
    id = str(gameId) 
    c, conn = connection() 
    c.execute("SELECT answer_one, answer_two FROM games WHERE game_id=%s", (thwart(id),)) 
    return c.fetchall() 
+0

我的印象是它基本上會返回一個bool值。所以如果這是一個失敗的查詢,它會觸及'錯誤'消息。我在其他api調用中使用該邏輯,並且按預期工作@Daniel – user7804097

+0

@ user7804097:Python中的大多數函數和方法都不使用它們的返回值來指示成功與失敗。如果失敗了,他們只會引發異常。 – jwodder

+0

此外,這沒有奏效。它返回一個空集合,因爲它仍然使用可選變量類型進行搜索 – user7804097

0

這結束了一個錯誤的xcode [隊列所有iOS/xcode的損傷。儘管我在xcode中正確地將變量轉換爲字符串,但它是作爲可選項發送的......我所做的只是清理項目代碼並重新啓動xcode,並且它按預期工作..... 3小時,頭痛後來。什麼修復....

感謝所有人對此貢獻,因爲它基本上是一個無法回答的問題。

相關問題