2011-11-22 2 views
1

내 변수 sqlConditions는 사용자가 해당 필드에 텍스트를 입력 할 때 추가한다고 가정합니다. 나는 이것을 체크하기 위해 "if (isset ($ _ POST [ 'example']))"라고 쓰지만, 이것은 각 변수의 추가를 멈추는 것처럼 보이지 않는다.mysql/php 스크립트에서 구문이 무시됩니다?

예를 들어 사용자 만 "LASTNAME"필드에 텍스트를 삽입하는 경우 $ 쿼리 변수를 반환해야는 :

UPDATE students SET lastname = whateveruserputin 

그러나, 그것은 다음과 같습니다

UPDATE students SET lastname = test , firstname = , major = , gpa = 

어떻게 이걸 고쳐 줘!? 나는이 코드가 작동하도록하고 싶다. 미리 감사드립니다.

코드 :

//connect to server 

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

$id=$_POST['id']; 
$lastname=$_POST['lastname']; 
$firstname=$_POST['firstname']; 
$color=$_POST['color']; 
$number=$_POST['number']; 

    //need id to be filled and need at least one other content type to change 
    if(empty($id) || empty($lastname) and empty($firstname) and empty($color) and empty($number)) 
{ 

     echo "<font color='red'>Invalid Submission. You did not enter an ID or did not input an additional form element. </font><br/>"; 

} 

else // if all the fields are filled (not empty) 
{ 

$sqlConditions = array(); 

    if(isset($_POST['lastname'])){ 
    $lastName = filter_var($_POST['lastname'], FILTER_SANITIZE_STRING); 
    $sqlConditions[] = 'lastname = ' . $lastName; 
    } else { 
    $lastName = ''; 
    } 

if(isset($_POST['firstname'])){ 
    $firstName = filter_var($_POST['firstname'], FILTER_SANITIZE_STRING); 
    $sqlConditions[] = 'firstname = ' . $firstName; 
    } else { 
    $firstName = ''; 
    } 

    if(isset($_POST['color'])){ 
    $color = filter_var($_POST['color'], FILTER_SANITIZE_STRING); 
    $sqlConditions[] = 'color = ' . $color; 
    } else { 
    $color = ''; 
    } 

if(isset($_POST['number'])){ 
    $number = filter_var($_POST['number'], FILTER_SANITIZE_STRING); 
    $sqlConditions[] = 'number = ' . $number; 
    } else { 
    $number= ''; 
    } 
print $sqlConditions; 

$query = 'UPDATE students SET ' . join (' , ', $sqlConditions); 
print $query; 

    insert data to database  
    //$query = mysql_query("UPDATE students SET lastname = '$lastname', firstname = '$firstname', color = '$color', number = '$number' 
    //WHERE id = '$id'"); 
    //if (!query) 
    //{ 
    //die('Error: ' . mysql_error()); 
    //} 


    // Close connection to the database 
    mysql_close($con); 

} 

} 
+2

... 나를 되 찾는 ... – djdy

+2

변수는 * 설정할 수 있지만 아직 빈 문자열을 포함 할 수 있습니다. – webbiedave

답변

4

isset는 충분하지 않다; 예를 들어,뿐만 아니라 !empty 검사를 추가 : 당신이 원하는 것을 더 잘 반영 할 코드에서 주석 위해서는,

if(isset($_POST['lastname']) && !empty($_POST['lastname']) 

편집을
또한, 당신의 if 문은 아마되어야합니다 :

//need id to be filled and need at least one other content type to change 
if(empty($id) && (empty($lastname) || empty($firstname) || empty($color) || empty($number)) 

여기에 대한 의견에 대한 몇 가지 개선 * 및 개정과 코드의 문자열에 따옴표를 추가 :

<?php 

//connect to server 

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

$id=$_POST['id']; 
$lastname=$_POST['lastname']; 
$firstname=$_POST['firstname']; 
$color=$_POST['color']; 
$number=$_POST['number']; 

    //need id to be filled and need at least one other content type to change 
    if(empty($id) && (empty($lastname) || empty($firstname) || empty($color) || empty($number)) 
    { 
     echo "<font color='red'>Invalid Submission. You did not enter an ID or did not input an additional form element. </font><br/>"; 
    } 
    else // if all the fields are filled (not empty) 
    { 
     $sqlConditions = array(); 

     if(isset($lastname) && !empty($lastname)){ 
      $lastName = filter_var($lastname, FILTER_SANITIZE_STRING); 
      $sqlConditions[] = "lastname = '" . $lastname . "'"; 
     } 
     else 
     { 
      $lastName = ''; 
     } 

     if(isset($firstname)) 
     { 
      $firstName = filter_var($firstname, FILTER_SANITIZE_STRING); 
      $sqlConditions[] = "firstname = '" . $firstname . "'"; 
     } 
     else 
     { 
      $firstName = ''; 
     } 

     if(isset($color) && !empty($color)) 
     { 
      $color = filter_var($color, FILTER_SANITIZE_STRING); 
      $sqlConditions[] = "color = '" . $color . "'"; 
     } 
     else 
     { 
      $color = ''; 
     } 

     if(isset($number)) 
     { 
      $number = filter_var($number, FILTER_SANITIZE_STRING); 
      $sqlConditions[] = "number = '" . $number . "'"; 
     } 
     else 
     { 
      $number= ''; 
     } 
     print $sqlConditions; 

     $query = 'UPDATE students SET ' . join (' , ', $sqlConditions); 
     print $query; 

     //insert data to database  
     //$query = mysql_query("UPDATE students SET lastname = '$lastname', firstname = '$firstname', color = '$color', number = '$number' 
     //WHERE id = '$id'"); 
     //if (!query) 
     //{ 
     //die('Error: ' . mysql_error()); 
     //} 

     // Close connection to the database 
     mysql_close($con); 
    } 
} 

*을 이미 변수에 대한 모든 $_POST 항목을 정의하기 때문에, 다시 컬렉션에 계속 할 필요가 없습니다.

+1

+1 그러나 실제로는'if (! empty ($ _ POST [ 'lastname']))'를'empty '로 설정하면 설정되지 않은 변수에 대한 경고를 자동으로 표시하지 않습니다. – webbiedave

+0

감사. 추가되는 각 항목에 따옴표를 어떻게 추가 할 수 있는지 알고 있습니까?UPDATE 학생이 필요합니다 SET lastname = 'UPDATE 학생 대신 whateveruserputin'SET 성 = whateveruserputin –

+0

'$ sqlConditions [] = "lastname = '". $ lastName. " '"또는 그 이상 :'$ sqlConditions [] = "lastname ='". mysql_real_escape_string ($ lastName). " '";' – webbiedave

0

변수가 설정되었지만 변수가 설정되어 있지만 어쩌면 비어 있는지 여부 만 확인하고 있습니다.

Isset()은 변수에 False, 0 또는 빈 문자열을 포함하지만 NULL이 아닌 값이 있는지 확인합니다.

Empty() 함수는 변수에 빈 값 (0, NULL 또는 False)이 있는지 확인합니다.

예 :

$lastName = mysql_real_escape_string($lastName); 
$sqlConditions[] = "lastname = '$lastName'"; 

이 ... 변수가 비어있는 경우에도 문제를 해결하고 좀 더 확인하기 위해 코드를 확보 :

<?php 
$var = 0; 

if (empty($var)) { 
    echo 'it is empty since it has value 0 '; 
} 
if (isset($var)) { 
echo '$var is set though it is empty'; 
} 
?> 
1

난 당신이 코딩 방법을 사용하는 것이 좋습니다 SQL 주입 공격 (아주 좋습니다 !!!)

+2

아니요. 적절한 조언이 아닙니다. 'addslashes'를 피하십시오. 이스케이프를 위해 항상 데이터베이스 제공 메커니즘을 사용하십시오 (특정 케이스에서는'mysql_real_escape_string'이지만 실제로는 매개 변수화 된 쿼리와 함께 PDO를 사용해야합니다). – webbiedave

+0

@webbiedave 좋습니다, 좋은 지적입니다. 그러나이 사용자에게는 빠른 도움이 필요합니다. 그렇지 않으면 우리가 그녀에게 프레임 워크 (예를 들어 –

+0

)를 사용하도록 권장 할 수 있습니다. @ NomikOS - 프레임 워크에 동의했지만 먼저 걷는 방법을 배우고 실행해야합니다. "왜"의 첫 손을 배우는 것이 실제 PHP를 가릴 지 모르는 무언가를 선택하기 전에 필수적이라고 생각합니다. – stealthyninja

관련 문제