2016-08-23 2 views
0

나는 내 웹 사이트의 형태에 문제가있다. 양식 값은 해당 데이터베이스의 갱신에 사용되는 매개 변수 인 $ _POST 값과 같습니다.

빈 양식 값을 업데이트하고 싶지 않습니다. 그러나 필자는 입력 영역을 의무화하고 싶지 않습니다.

즉, 업데이트하고 싶지 않은 입력 영역에 값을 입력 할 필요없이 특정 콘텐츠 만 업데이트 할 수 있습니다. 그러나 이것에 문제가 있습니다. 빈 양식 값이 업로드되므로 데이터베이스의 값이 공백 값으로 변경됩니다. 나는 SO와 인터넷을 통해 튜토리얼을 찾았고, 유일한 (기능적인) 것들은 입력 박스를 의무적으로 만드는 것들이다. 그건 내가 어떻게 작동 할 것인가가 아니기 때문에 적합하지 않습니다.

나는이 작업을 수행하는 가장 좋은 방법은 제출 단추가 설정되면 입력 영역의 "이름"특성을 javaScript를 통해 변경하는 것입니다. 값이 비어 있거나 null 인 경우 . 나는 이것을하는 법을 알지 못하며 이것이 가능한지 또는 최선의 방법인지를 알지 못한다.

(첫째, 형태 자바 스크립트)

<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 인젝션에 취약하다는 것을 알고 있습니다. 나는 모든 것을 준비하고 실행하기 위해 노력하고 있으며, 일단이 모든 것이 설정되면 웹 사이트가 온라인 상태가되기 전에 보안 문제를 조사 할 것입니다.

나는이 문제를 일주일 넘게 겪어 왔으며 그로부터 벗어나는 길을 찾지 못했습니다.

미리 감사드립니다.

편집

나는 내가 해결하는 사람을위한 두 개의 답을 선택할 수 바랍니다. 그들 둘 다 바로 저를 문제의 해결로 이끌었고, 각자 제가 저의 코드에서 구멍을 볼 수 있도록 도와주었습니다. 둘 다 선택할 수 없기 때문에 마지막 문제를 해결하는 데 도움을 준 사람을 선택했습니다. 정말 고마워요!

+2

제목에 이미 답변이 있습니다 :'if' : http://php.net/manual/en/control-structures.if.php 그리고 이미 스크립트의 다른 부분에서 사용하고 있으므로, 정신 블록은'query()'호출을 조건부로 만들기 위해 그것을 사용하지 못하도록합니까? –

+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"; 

그런 다음 쿼리를 실행할 수를 건너 뛰어, 동적 쿼리를 구축 할 수 있습니다. 변수 중 적어도 하나가 사용 가능한지 확인하는 것을 잊지 마십시오. 모두 비어 있으면 실행하지 마십시오.

그리고 코드가 매우 취약합니다.

$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

고맙습니다. 이것은 그것을했다. 문제는 $ p [ 'home']가 빈 값을 업데이트하지 않는 이유는 무엇입니까? 설명해 주시겠습니까? –

+0

내가이 권리를 가지고 있는지 보자. trim() 함수는 빈 공간을 없애고 $ p [home]이 비어 있다면 계산되지 않는다. 그게 맞습니까? –

+1

@PauloSoares 위 코드의 트림은 주석에서 알 수 있듯이 후행 쉼표 만 제거합니다. 계속해서 공간을 트리밍 할 필요가 없습니다. $ p [ 'home']이 빈 문자열이면 false로 평가되고 해당 부분은 생략됩니다. – Progrock

1

따로 보안 허점을 노려, 나는 보통이 같은 문자열, 뭔가를 만들 것 .

+0

이것은 꽤 많은 복제품입니다. http://stackoverflow.com/a/39111266/3392762 – Progrock

+0

게시물은 거의 같은 시간에 만들어졌으며 게시물이 처음 게시되었을 때 허용 된 답변에는'trim ()'. – Samsquanch

관련 문제