2016-08-23 7 views
0

私は私のウェブサイトのフォームに問題がありました。フォームの値は、対応する$ _POST値と同じです。これは、データベースの更新に使用されるパラメータです。

空のフォーム値を更新したくありません。しかし、私は入力領域に義務を負わせたくありません。

つまり、更新したくない入力領域に値を入力する必要がなく、特定のコンテンツのみを更新することができます。しかし、私はこれに問題があります。空のフォーム値がアップロードされているため、データベースの値は空白の値に変更されています。私はSOやインターネット上でチュートリアルを探しましたが、唯一の(機能的な)ものは、入力ボックスを義務的なものにするものです。それは私が働くつもりではないので、合わない。

送信ボタンが設定されている場合、入力領域の「名前」属性を空白に変更するか、Java Scriptを使用して値を空にするかnullにするかはわかりません。私はこれを行う方法を知らないし、これが可能かどうか、または最善の方法を知っていない。ここで

が問題に私の現在のコードです:

(最初、フォームANジャバスクリプト)

<script> 
function validade(){ 
    var formId = document.getElementById("configForm"); 
    var allInputs = formId.getElementsByTagName("input"); 
    var input, i; 

    for (i=0; input = allInputs[i]; i++){ 
     if (input.value == null || input.value == "") { 
      input.name = ""; 
     } 
    } 
} 

<form method="post" action="" id="configForm"> 
<label for="home">Home:</label> 
<br> 
<input type="text" id="home" name="home"> 
<br> 
<label for="apendix">Apêndice:</label> 
<br> 
<input type="text" name="apendix"> 
<br> 
<label for="about">Sobre:</label> 
<br> 
<input type="text" name="sobre"> 
<br> 
<label for="contato">Contato:</label> 
<br> 
<input type="text" name="contato"> 
<br><br> 
<input type="submit" value="Carregar" name="submit"> 
</form> 

<?php require_once('editaForma.php'); ?> 

(第二に、データベースクエリや$ _POSTの値:)

<?php //credentials 
if (isset($_POST["submit"])){ 
    $server = 'hypotetical'; 
    $user = 'hypotetical'; 
    $pw = 'hypotetical'; 
    $BD = 'hypotetical'; 

    //estabelece a conexão 
    $conn = mysqli_connect($server, $user, $pw, $BD); 
    if (!$conn) { 
     die ('<span style="color: #FF0000;">"connection failed: "</span>' . mysqli_connect_error()); 
    } 

    $home = $_POST["home"]; 
    $apendix = $_POST["apendix"]; 
    $sobre = $_POST["sobre"]; 
    $contato = $_POST ["contato"]; 

    $query = "UPDATE form SET 
    home= '$home', 
    apendix= '$apendix', 
    sobre= '$sobre', 
    contato= '$contato' 
    WHERE id='1'"; 



    //$query = "INSERT INTO form (home, apendix, sobre, contato) VALUES ('$home', '$apendix', '$sobre', '$contato')"; 

    if (mysqli_query($conn, $query)){ 
     echo "Alterações feitas com sucesso"; 
    } else { 
     echo "ERRO!" . $query . "<br>" . mysqli_error($conn); 
    } 

    mysqli_close($conn); 
} 
?> 

はい、私はDBがSQLインジェクションを受けやすいことを知っています。私はすべてを稼働させようとしていますが、これがすべて設定されたら、ウェブサイトがオンラインになる前にセキュリティ上の問題を調べます。

私はこの問題を1週間以上抱いていて、それを解決する方法は見つけられません。

ご連絡いただきありがとうございます。

EDIT

私は私が解決するもののために2つの答えを選択することができることを望みます。どちらも問題の解決に導かれ、それぞれが私のコードの穴を見るのを助けました。私は両方を選ぶことができないので、私は最後の問題を解決するために私を助けた人を選んだ。すべてありがとう!

+2

あなたのタイトルにはすでに答えがあります: 'if':http://php.net/manual/en/control-structures.if.phpそしてあなたは既にあなたのスクリプトのどこかでそれを使っているので、メンタルブロックは 'query()'コールを条件付きで使用するのを妨げますか? –

+2

"それを稼働させようとする"という言い訳を止め、準備されたステートメントを使い始める。彼らは作成するよりも多くの問題を修正します。規律ある方法でそれらを使用すると、追跡に時間がかかります。この場合、文字通り2行のコードが追加され、このコードが不注意に生産に入る場合は、傷つく世界を救うことができます。コードは、あなたが見ていないときに行う傾向があります。 – tadman

+0

愚かな音がする場合は申し訳ありません。私は混沌としたやり方でコードを学習しています。それにもっと力を入れ、準備された陳述を学ぶでしょう。ありがとうございました。 –

答えて

1

あなたは、クエリを実行することができ、空の値

$p = &$_POST; //make $p refer to $_POST 

$query = "UPDATE from SET "; 

if($p['home']) $query .= " home = '$p[home]' ,"; 
if($p['apendix']) $query .= " apendix = '$p[apendix]' ,"; 
if($p['sobre']) $query .= " sobre = '$p[sobre]' ,"; 
if($p['contato']) $query .= " concato = '$p[contato]' ,"; 

$query = trim($query, ','); //remove any trailing comma 
$query = "WHERE id = 1"; 

をスキップすることにより、動的にクエリを構築します。ああ、少なくとも1つの変数が利用可能であることを確認することを忘れないでください。それらがすべて空の場合、実行しないでください。

そして、あなたのコードは非常に脆弱です。脇のセキュリティホールを睨ん

+0

ありがとうございます。これはそれでした。問題は、$ p ['home']が空白の値を更新しないのに対して、$ homeは空白の値を更新しない理由は分かりません。説明してもらえますか? –

+0

私はこの権利があるかどうかを見てみましょう、trim()関数は空のスペースを削除するので、$ p [home]は空であれば計算されません。そうですか? –

+1

@PauloSoares上記のコードのトリムは、コメントが示唆するように、末尾のカンマを削除するだけです。スペーストリミングは行われません。 $ p ['home']が空の文字列であれば、それはfalseと評価され、その部分は省略されます。 – Progrock

1

、私は通常の文字列を構築するだろう、このような何か:最後にコンマでクエリを構築

$home = $_POST["home"]; 
$apendix = $_POST["apendix"]; 
$sobre = $_POST["sobre"]; 
$contato = $_POST ["contato"]; 

$query = "UPDATE form SET "; 
if(!empty($home)) { 
    $query .= "home= '$home',"; 
} 
if(!empty($apendix)) { 
    $query .= "apendix= '$apendix',"; 
} 
if(!empty($sobre)) { 
    $query .= "sobre= '$sobre',"; 
} 
if(!empty($contato)) { 
    $query .= "contato= '$contato',"; 
} 

// strip off any extra commas on the end 
$query = rtrim($query, ','); 

$query .= "WHERE id='1'"; 

はまた、あなたがする必要がある場合は、後で簡単に、より多くのオプションを追加することができます。

+0

これはかなりクローンです。http://stackoverflow.com/a/39111266/3392762 – Progrock

+0

投稿はほぼ同じ時刻に投稿され、投稿が最初に投稿されたときに受け入れられた回答には 'trim( ) '。 – Samsquanch

関連する問題