0

フォームフィールドがnullの場合、データを投稿しないようにphpに指示することは可能ですか?

現在、insert.php ページの投稿変数は次のようになっています。

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

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

フォーム フィールドが空または null の場合、$fname $lname を投稿しないようにします。これを行うための最良の方法は何ですか?

現在、更新を送信すると、それらのフィールドが空の場合、何も挿入されていない場合、テーブル全体が空の行で更新されます。

4

5 に答える 5

0
$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 に貼り付ける前に、値を適切にエスケープすることを忘れないでください。

于 2013-10-04T23:04:54.473 に答える
0

各フィールドに次のようなものを使用できます。

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

$fnameフォーム フィールドが存在しない場合、または入力が空の場合、これは null に設定されます。それ以外の場合は、元の値が使用されます。

アップデート

null ではないフィールドのみを更新する場合は、ロジックを追加する必要があります。

if($fname !== null && $lname !== null) {
    // update both
}
else if($fname !== null) {
    // update just fname
}
else if($lname !== null) {
    // update just lname
}
于 2013-10-04T22:36:54.227 に答える
-1

フォームの検証が必要です。簡単な解決策では、空のフィールドを 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 インジェクションなどの名前を許可しない、より厳密な検証規則を実装することを決定できます。この場合、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.JamesonJackson- PitersonJOHnsmIthなど。より厳密な検証ルールについては、公式 PHP 正規表現マニュアルを確認してください。

于 2013-10-05T05:47:25.193 に答える