2011-08-06 51 views
0

被告知,我必須驗證我的形式,這樣沒有人可以砍我的數據庫,然後我做了一些變化,這是在加入了mysql_real_string()形式提交空值數據庫

$query="INSERT INTO allymccoist (id, firstname, lastname, email, date) 
VALUES (NULL, '".$firstname."', '".$lastname."', '".$email."', '".mysql_real_escape_string($new_date)."')"; 

$firstname = mysql_real_escape_string($_POST['firstname']); 
$lastname = mysql_real_escape_string($_POST['lastname']); 
$email = mysql_real_escape_string($_POST['email']); 
$datepicker = mysql_real_escape_string($_POST['date']); 

,因爲這樣做,什麼都沒有,雖然日期似乎是雖然

OK發送發送到0​​名姓或 電子郵件

是否有任何可能導致您從代碼中看到的內容?

+0

檢查你使用的是變量的值 - 確保他們實際上在他們的數據。並且不要使用'mysql_real_escape_string'和字符串混搭來玩,它會使代碼非常難以閱讀。使用[支持參數化的API](http://bobby-tables.com/php.html) – Quentin

+0

您的代碼是按照這個順序嗎?在中,首先查詢定義 - >然後定義$ firstname,$ lastname?如果是這樣,那是你的問題。 – NSSec

回答

0

如果你確信這些數據實際上被設置(您的var_dump $ _POST陣列檢查),那麼請確保您有使用mysql_real_escape_string(),因爲它會返回FALSE,否則之前活躍的連接:

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

因此,您可以在每個值中輸入FALSE。

$link = mysql_connect('mysql_host', 'mysql_user', 'mysql_password')or die(mysql_error()); 
mysql_select_db('database_name', $link) or die('cannot select database '.mysql_error()); 

$firstname = mysql_real_escape_string($_POST['firstname']); 
$lastname = mysql_real_escape_string($_POST['lastname']); 
$email = mysql_real_escape_string($_POST['email']); 
$datepicker = mysql_real_escape_string($_POST['date']); 

你會更好,完全使用prepared statements,所以你不必擔心SQL注入。

另外,我建議你不要在字段ID的插入查詢中使用NULL。如果你的表格被我猜到了,並且ID是帶有AutoIncrement的主鍵,那麼你不需要在查詢中輸入它,因爲它會被引擎自動填充。

對於wheter它是更好地使用準備好的語句或mysql_escape_string()和檢查該資源mysql_real_escape_string vs prepared statements

+0

我只需要這樣做: $ query = $ dbh-> prepare(「INSERT INTO allymccoist(id,firstname,lastname,email,date) VALUES('」。$ firstname。「','」 。$ lastname。「','」。$ email。「','」。$ new_date。「')」); – Gezzamondo

+0

我不會建議使用準備好的語句來完成像這個查詢這樣簡單的事情,而且我當然不會建議使用它來簡單地避免需要跳過參數 – adlawson

+0

作爲即時通訊新的php我有點擔心有人用數據庫駭客sql injestions ...將方法我當前使用與mysql_real_esape_string()是否足夠的保護? – Gezzamondo

0

丟失數據的問題很可能是達米安建議。建立一個連接,然後使用mysql_real_escape_string()。部分連接是必需的,以便mysql_real_escape_string()可以考慮連接的當前字符集。

此外,與sprintf()函數(full details on sprintf)結合使用時,mysql_real_escape_string()是完全安全的。 sprintf()最重要的是設置正確的類型說明符,以便值正確轉換。通常,對於整數,您將使用%d。對於浮動使用%f。對於字符串和日期值使用%s。

所以對於你的程序代碼應該看起來像(注:如達明表明,離開id列的查詢):

/* Read form data. */ 
    $firstName = $_POST['firstname']; 
    $lastName = $_POST['lastname']; 
    $email = $_POST['email']; 
    $date = $_POST['date']); 

    /* Your form validation code here. */ 

    /* Your db connection code here. */ 

    /* Setup and run your query. */ 
    $query = sprintf("INSERT INTO allymccoist (firstname, lastname, email, date) 
      VALUES ('%s', '%s', '%s', '%s')", 
      mysql_real_escape_string($firstName), 
      mysql_real_escape_string($lastName), 
      mysql_real_escape_string($email), 
      mysql_real_escape_string($date)); 

    $result = mysql_query($query); 

    /* Check for errors with query execution. */ 
    if (!$result) echo("Query Error! Process aborted.");