2010-10-12 67 views
1

我需要一些想法,使我的代碼更清潔一個簡單的數據庫一個非常簡單的應用程序。我有以下想法,但它不能很好地工作。這是我在做什麼:在代碼中組織MySQL查詢的正確方法?

我在頁面上有很多查詢(佔用大量的空間和源代碼看起來凌亂。我想有一個他們在另一個PHP文件,我可以調用索引通過包括

除了我遇到了一個問題,我有一個查詢,看起來像這樣的外部PHP頁面上

Queries.php:。

$RegisterQuery = sprintf("INSERT INTO `testdb`.`users` (
                  `user_id`, 
                  `username`, 
                  `password`, 
                  `First Name`, 
                  `Last Name`, 
                  `email`) 
        VALUES (
          NULL, 
          '%s', 
          '%s', 
          '%s', 
          '%s', 
          '%s' 
          );", 
        mysql_real_escape_string($username), 
        mysql_real_escape_string($password), 
        mysql_real_escape_string($first_name), 
        mysql_real_escape_string($last_name), 
        mysql_real_escape_string($email)); 

這樣做的問題是,即使我沒有用mysql_query()查詢$RegisterQuery它拋出一堆關於使用mysql_real_escape_string()以及無法連接的MySQL警告。當我甚至不查詢數據庫時,我不明白它是如何做到這一點的!

話又說回來,我可以很容易忽略這些警告...

我只是不知道我在做正確這個在這種情況下,我主要是想詢問是否有這樣做還是應該更好的方法我只是忽略了警告?

您的反饋非常感謝!提前致謝。

回答

3

我建議使用參數化的查詢(例如經由庫MySQLi或PDO)。

你沒有逃跑的字符串,如果他們的參數查詢。這使得代碼更加清晰,並且使編寫安全代碼變得更加容易,因爲如果您始終使用參數化查詢,那麼您很可能會留下SQL注入漏洞。

+0

+1每次調用mysql_real_escape_string都是數據庫服務器上的命中。參數化查詢是標準解決方案。 – 2010-10-12 18:26:17

+0

我可以在哪裏瞭解有關參數化查詢的更多信息?我會誠實地說,我從來沒有聽說過他們。谷歌搜索幾乎沒有返回。 =( – Tek 2010-10-12 18:51:19

+0

@Tek:檢查出http://stackoverflow.com/questions/60174/best-way-to-stop-sql-injection-in-php – 2010-10-12 18:58:12

2

功能mysql_real_escape_string需要一個數據庫連接。從php.net開始:

使用mysql_real_escape_string()之前需要MySQL連接,否則會生成級別爲E_WARNING的錯誤,並返回FALSE。如果未定義link_identifier,則使用最後一個MySQL連接。

如果沒有數據庫連接存在,它會返回false,因此沒有逃脫被完成,返回值是不是您所期望的。

1

我認爲你需要重新考慮你的解決方案。雖然你可能認爲在源代碼中使用這些查詢是「麻煩」的,但是當代碼的一個未來維護者每次想要檢查數據庫邏輯時必須切換到不同的文件時,具體點。

至於mysql_real_escape_string的錯誤,該函數使用MySQL服務器,因爲它需要相對於活動數據庫連接的字符集轉義字符串。

0

mysql_real_escape_string使得數據庫服務器的呼叫。

與其說mysql_real_escape_string當你建立查詢,調用它執行查詢之前。

但是,理想情況下,您應該使用參數化查詢。