簡體   English   中英

表單驗證。 $ _POST如果不是null可能嗎?

[英]Form validation. Is $_POST if NOT null possible?

如果表單字段為空,是否可以告訴php不要發布數據?

現在,我在insert.php頁面中的post變量如下所示:

fname = $_POST['firstname'];
lname = $_post['lasname'];

sql = "UPDATE profile SET first='.$fname.', last='.$lname.' WHERE id='.$id.'";

如果我的表單字段為空或為空,我希望不發送$ fname $ lname。 最好的方法是什么?

目前,當我提交更新時,如果這些字段為空,那么如果沒有插入任何內容,它們將使用空行更新整個表。

您可以在每個字段中使用類似的內容:

$fname = empty($_POST['firstname']) ? null : $_POST['firstname'];

如果表單字段不存在或輸入為空,這會將$fname設置$fname null。 否則,它將使用原始值。

更新資料

如果只想更新不為null的字段,則需要添加一些額外的邏輯:

if($fname !== null && $lname !== null) {
    // update both
}
else if($fname !== null) {
    // update just fname
}
else if($lname !== null) {
    // update just lname
}

Is it possible to tell php to NOT post data if the form field is null? 發布數據的不是PHP,而是單擊表單的Submit按鈕后的瀏覽器。 為了防止在字段為空時發生這種情況,您將必須使用客戶端(javascript),它首先會在提交表單之前驗證字段是否確實已填寫。

這就是我對您的問題的理解。 如果不想在$_POST變量為空時創建SQL查詢,則只需使用if條件或三元運算符。

我會這樣做:

$fname = isset($_POST['firstname']) && strlen($_POST['firstname']) > 0 ? $_POST['firstname'] : null;

這樣,如果設置了變量並且不為空,則將$ fname定義為$ _POST ['firstname']值,否則它將為null

順便說一句,如果您在雙引號( " )中工作,則無需使用點將值添加到$ sql字符串中。甚至,您的語法是錯誤的。這是一種可行的工作方式:

$sql = "UPDATE profile SET first='$fname', last='$lname' WHERE id='$id'";

應該使用這種SQL查詢生成。 它容易受到SQL注入的攻擊。 更好地使用PDOMySQLi參數化查詢。

而且,順便說一句,如果您想在值為空的情況下拒絕插入,則最好在創建MySQL表(將not null屬性分配給該列)時執行。 例如:

CREATE TABLE user(
    first VARCHAR(50) NOT NULL,
    last VARCHAR(50) NOT NULL
)

**編輯:如果我理解得很好,這是你想要的:

$valuesToAdd = "";
// Concatenate values to the query if they are defined
if (isset($_POST['firstname']) && strlen($_POST['firstname']) > 0) $valuesToAdd .= "first = '{$_POST['firstname']}',";
if (isset($_POST['lastname']) && strlen($_POST['lastname']) > 0) $valuesToAdd .= "last = '{$_POST['lastname']}',";
// Repeat for any other values...

// By default, the SQL string is empty
$sql = "";

// If changes were made...
if (strlen($valuesToAdd) > 0) {
    // Remove the last ","
    $valuesToAdd = substr($valuesToAdd, 0, strlen($valuesToAdd)-1);

    // Generate the SQL string with the values which will be added
    $sql = "UPDATE profile SET {$valuesToAdd} WHERE id='{$id}'";

    // echo $sql; die;
}


// Check if the SQL string is not empty
if (strlen($sql) > 0) {
    // Here the SQL has been generated, use it for a SQL query...
    // $con = mysql_connect(...); .....
}
$fname = $_POST['firstname'];
$lname = $_POST['lastname'];

$sets = array();

if(trim($fname)) {
  $sets[] = "first = '".mysql_real_escape_string($fname)."'";
}
if(trim($lname)) {
  $sets[] = "last = '".mysql_real_escape_string($lname)."'";
}

if($sets) {
  $sql = "UPDATE profile SET ".implode(", ", $sets)." WHERE id='".mysql_real_escape_string($id)."'";
}

在將值粘貼到SQL之前,請記住正確地轉義您的值。

您需要表單驗證。 簡單的解決方案不允許將空字段保存在db中,並防止SQL注入

簡單的解決方案

$fname = isset($_POST['firstname']) and nameIsValid($_POST['firstname'])
    ? $_POST['firstname'] : false;
$lname = isset($_POST['lastname']) and nameIsValid($_POST['lastname'])
    ? $_POST['lastname'] : false;

if (false === $fname or false === $lname) {
    // report about not valid form fields
} else {
    $dsn = 'mysql:dbname=yourdb;host=yourhost;charset=utf8';
    $dbh = new PDO($dsn, 'user', 'pass');
    $sql = "UPDATE profile SET first = :fname, last = :lname WHERE id = :id";

    $stmt = $dbh->prepare($sql);
    $stmt->execute(array(':fname' => $value, ':lname' => $lname, ':id' => $id));
}

/**
 * Validation names for empty values
 *
 * @param string $name First name or last name
 * @return bool
 */
function nameIsValid($name) {
    return '' !== $name;
}

但是要注意XSS-injection 例如,有人可以在您的db Fist名稱中保存:

<script>alert('Woohoo! You have vulnerability!');</script>

下次,當您打印用戶的名字時,每個人都會看到有關漏洞的消息:)

您可以決定實施更嚴格的驗證規則,不允許使用諸如“ asfyua23807 * ^ 2#”“-2 *&%$ 9837239askHF”或XSS-injections的名稱。 在這種情況下,您應該修改nameIsValid()函數。

安全解決方案:

/**
 * Validation names and prevent XSS-injections
 *
 * @param string $name First name or last name
 * @return bool
 */
function nameIsValid($name) {
    $pattern = '/^[\.a-z-]+$/i';
    return (bool) preg_match($pattern, $name);
}

此邏輯允許名稱包含Az。 -符號:J.Jameson, 傑克遜Piterson, 約翰· 史密斯 有關更嚴格的驗證規則,請查看PHP正則表達式官方手冊

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM