2010-04-09 156 views
1

我的代碼是假設保存一年像1999到MySQL數據庫,但它不會。它會檢查用戶是否輸入了唯一的號碼,並且至少有4個數字,或者沒有正確輸入,但不會保存正確的年份?我該如何解決這個問題。PHP表單驗證提交問題?

這裏是PHP代碼。

if(isset($_POST['year']) && intval($_POST['year']) && strlen($_POST['year']) == 4) { 
    $year = mysqli_real_escape_string($mysqli, $purifier->purify(htmlentities(strip_tags($_POST['year'])))); 
} else if($_POST['year'] && strlen($_POST['year']) < 4) { 
    echo '<p class="error">year is not correct!</p>'; 
} else if($_POST['year'] == NULL) { 
    // do something 
} 

這裏是代碼將要去的地方。

if (mysqli_num_rows($dbc) == 0) { 
      $mysqli = mysqli_connect("localhost", "root", "", "sitename"); 
      $dbc = mysqli_query($mysqli,"INSERT INTO users (user_id, year) 
             VALUES ('$user_id', '$year')"); 
    } 

    if ($dbc == TRUE) { 
      $dbc = mysqli_query($mysqli,"UPDATE users 
             SET year = '$year' 
             WHERE user_id = '$user_id'"); 

      echo '<p class="changes-saved">Your changes have been saved!</p>'; 

    } 

    if (!$dbc) { 
      print mysqli_error($mysqli); 
      return; 
    } 

這裏是代碼在一起。

if (isset($_POST['submit'])) { 

if(isset($_POST['year']) && intval($_POST['year']) && strlen($_POST['year']) == 4) { 
    $year = mysqli_real_escape_string($mysqli, $purifier->purify(htmlentities(strip_tags($_POST['year'])))); 
} else if($_POST['year'] && strlen($_POST['year']) < 4) { 
    echo '<p class="error">year is not correct!</p>'; 
} else if($_POST['year'] == NULL) { 


    if (mysqli_num_rows($dbc) == 0) { 
      $mysqli = mysqli_connect("localhost", "root", "", "sitename"); 
      $dbc = mysqli_query($mysqli,"INSERT INTO users (user_id, year) 
             VALUES ('$user_id', '$year')"); 
    } 

    if ($dbc == TRUE) { 
      $dbc = mysqli_query($mysqli,"UPDATE users 
             SET year = '$year' 
             WHERE user_id = '$user_id'"); 

      echo '<p class="changes-saved">Your changes have been saved!</p>'; 

    } 

    if (!$dbc) { 
      print mysqli_error($mysqli); 
      return; 
    } 


    } 

} 

問題必須在這一行上。

if(isset($_POST['year']) && intval($_POST['year']) && strlen($_POST['year']) == 4) { 
$year = mysqli_real_escape_string($mysqli, $purifier->purify(htmlentities(strip_tags($_POST['year'])))); 
+0

好了,它「不會保存正確的一年」,但什麼*不*它做什麼? - 打印錯誤?保存錯誤的值? – 2010-04-09 03:04:40

+0

它只是不會保存它應該做的正確的一年。 – TaG 2010-04-09 03:05:23

+0

感謝您使用DB代碼更新您的問題,但我仍然沒有看到兩個代碼塊是如何與海誓山盟相關的?你是否在第一個代碼塊之後立即調用if(mysqli_num_rows($ dbc)== 0)? – klabranche 2010-04-09 03:22:52

回答

0

你似乎在傳遞到$一年你的表單元素你今年轉義字符串值,但你似乎並沒有做任何事的(至少是你展示)?

將代碼放入數據庫的代碼在哪裏?

喜歡的東西:

$ mysqli->查詢( 「插入表格 (的ColumnName)VALUES( '$年')」;

編輯後更新您的代碼示例:

如果您的年份爲null,則正在運行代碼到DB。更改您的代碼,如David/Josh所示:-)

1

首先,檢查wha t在$_POST['year']中發送,error_log($_POST['year']);echo $_POST['year'];在邏輯陳述上方的某處。其次,你實際上並沒有用那個代碼寫的任何查詢,只是一個$year變量,我猜你正試圖去消毒。

第三,看起來您的if/else聲明鏈中存在邏輯錯誤。

試試這個。

if (isset($_POST['submit'])) 
{ 

if(isset($_POST['year']) && intval($_POST['year']) && strlen($_POST['year']) == 4) { 
    $year = mysqli_real_escape_string($mysqli, $purifier->purify(htmlentities(strip_tags($_POST['year'])))); 
} else if($_POST['year'] && strlen($_POST['year']) < 4) { 
    echo '<p class="error">year is not correct!</p>'; 
} else if($_POST['year'] == NULL) { 

} else { 
    if (mysqli_num_rows($dbc) == 0) { 
      $mysqli = mysqli_connect("localhost", "root", "", "sitename"); 
      $dbc = mysqli_query($mysqli,"INSERT INTO users (user_id, year) 
             VALUES ('$user_id', '$year')"); 
    } 

    if ($dbc == TRUE) { 
      $dbc = mysqli_query($mysqli,"UPDATE users 
             SET year = '$year' 
             WHERE user_id = '$user_id'"); 

      echo '<p class="changes-saved">Your changes have been saved!</p>'; 

    } 

    if (!$dbc) { 
      print mysqli_error($mysqli); 
      return; 
    } 


    } 

} 
+0

這甚至沒有工作,所以我用print_r它只顯示值。 – TaG 2010-04-09 03:27:40

+0

這並沒有工作ahhhhhhhhhhhhhhhhhhhhhhh:哦,謝謝。 – TaG 2010-04-09 03:46:05

+0

然後開始調試。將'error_log'添加到各行,並確定它不在做你打算做的事情。 – 2010-04-09 03:48:42

1

如果$ _POST [「year」] == NULL,則只運行查詢。你確定這就是你想要做的?

第一個塊也許更改爲類似:

if(isset($_POST['year']) && intval($_POST['year']) && strlen($_POST['year']) == 4) { 
    $year = mysqli_real_escape_string($mysqli, $purifier->purify(htmlentities(strip_tags($_POST['year'])))); 
} else if($_POST['year'] && strlen($_POST['year']) < 4) { 
    echo '<p class="error">year is not correct!</p>'; 
} 

if (isset($year)) { 
+0

是的那部分代碼如果字段留空。 – TaG 2010-04-09 03:32:31

+0

這沒有工作:( – TaG 2010-04-09 03:43:16

0

我覺得大衛有它的權利。試着改變你上面所提供的全部代碼:

if (isset($_POST['submit'])) 
{ 
    if(isset($_POST['year']) && intval($_POST['year']) && strlen($_POST['year']) == 4) { 
     $year = mysqli_real_escape_string($mysqli, $purifier->purify(htmlentities(strip_tags($_POST['year'])))); 
    } else if($_POST['year'] && strlen($_POST['year']) < 4) { 
     echo '<p class="error">year is not correct!</p>'; 
    } else { 
     // echo 'Year is blank' or whatever you like here 
    } 

    // if $_POST['year'] was entered correctly, $year will now 
    // have an assigned value and the mysql query will exit 
    if (isset($year)) { 
     if (mysqli_num_rows($dbc) == 0) { 
       $mysqli = mysqli_connect("localhost", "root", "", "sitename"); 
       $dbc = mysqli_query($mysqli,"INSERT INTO users (user_id, year) 
              VALUES ('$user_id', '$year')"); 
       // uncomment below to see the query 
       // echo "INSERT INTO users (user_id, year) VALUES ('$user_id', '$year')"; 
     } 
     // I'd suggest changing this if ($dbc) { to: 
     else { 
       $dbc = mysqli_query($mysqli,"UPDATE users 
              SET year = '$year' 
              WHERE user_id = '$user_id'"); 
       // uncomment below to see the query 
       // echo "UPDATE users SET year = '$year' WHERE user_id = '$user_id'"; 
       echo '<p class="changes-saved">Your changes have been saved!</p>'; 
     } 
     if (!$dbc) { 
       print mysqli_error($mysqli); 
       return; 
     } 


     } 
    } 
} 

此外,考慮到這兩個原來的查詢是的獨立的內部if塊,而不是if-else語句,有可能以某種方式,無論是查詢被竟然被執行。上面的代碼將其更改爲if-else語句,因此至少有一個查詢會執行。無論如何,我相信這是原始代碼的意圖。

如果它仍然不起作用,請取消註釋行以回顯查詢並查看實際發送到數據庫的內容。

0

您肯定正在過硬消毒數據:

if(isset($_POST['year']) && intval($_POST['year']) && strlen($_POST['year']) == 4) { 

精細。這是很好的看到,如果值是在提交的數據確實存在,以及是否有某種領域數值的,但是......

$year = mysqli_real_escape_string($mysqli, $purifier->purify(htmlentities(strip_tags($_POST['year'])))); 

如果所有的效果,以確保沒有什麼非數字在那裏,那麼爲什麼不乾脆做這樣的事情:

$year = null; 
if (isset($_POST['year'])) { 
    $year = preg_replace('/\D/', '', $_POST['year']) // replace anything non-numeric with nothing 
    if ($year < 1000) { 
     $year = null; 
    ) 
} 

這擺脫任何企圖HTML或SQL或JavaScript注入的,保證你有純數字數據,也可以確保您至少得到了4位數的年份,以及y10k,y100k等等。

的$今年已經消毒後,那麼你可以把它粘到數據庫這樣的:

if (!isnull($year)) { 
    $sql = <<<EOF 
INSERT INTO users (user_id, year) 
VALUES ($user_id, $year) 
ON DUPLICATE KEY UPDATE 
    year=VALUES(year); 
EOF; 
    $stmt = mysqli_query($sql) or die("Query error: " . mysqli_error()): 
}