2016-11-01 3 views
-2

나는 insert 함수를 가지고 있으며 주어진 POST 값을 검사하여 데이터베이스에 삽입합니다. 먼저 요청 수량이 데이터베이스에서 사용 가능한지 확인합니다. 성공하면 데이터베이스에 요청을 삽입합니다. 그렇지 않으면 오류 메시지가 표시됩니다.입력 및 출력 유효성 검사를 향상시키는 방법

수량을 수령 할 수는 있지만 수 량을 추가 할 수는 없습니다. 이 문제를 어떻게 해결할 수 있습니까? 아니면 유효성 검사를 개선 할 수 있습니까?

코드 :

<?php 

require_once('./database/connect_bd.php'); 

function insert(){ 

    $dbc = connection(); 

    $returnn = array(); 
$errors = array(); 
    $admin; 
    $product; 
    $record; 
    $amount; 

if($_POST['product'] == ""){ 
     $errors[] = 'The product field is required!'; 
    }else{ 
     $product = $_POST['product']; 
    } 
    if($_POST['admin'] == ""){ 
     $errors[] = 'The admin field is required!'; 
    }else{ 
     $admin = $_POST['admin']; 
    } 
if($_POST['record'] == ""){ 
     $errors[] = 'The field record is required'; 
    }else{ 
     $record = $_POST['record']; 
    } 
if(empty($_POST['amount'])){ 
     $errors[] = 'The field amount is required'; 
    }else{ 
     $amount = $_POST['amount']; 
    } 
if(empty($erros)){ 
     $query = "select SUM(ret.amount) AS amount, 
      ret.product_name, 
      ret.id_product 
      from(SELECT 
      SUM(p.amount) AS AMOUNT, 
       p.record_type, 
       p.id_product, 
       c.name AS name_product, 
       c.image 
       FROM stock p JOIN administrator u 
          ON u.id_admin = p.id_admin 
          JOIN register_products c 
          ON c.id_product = p.id_product 
          WHERE p.record_type = 'input' 

          GROUP BY     
          p.record_type, 
          p.id_product, 
          c.name, 
          c.image 
          UNION 
          SELECT 
          -SUM(p.amount) AS AMOUNT, 
          p.record_type, 
          p.id_product, 
          c.name AS name_product, 
          c.imagem 
          FROM stock p JOIN administrator u 
          ON u.id_admin = p.id_admin 
          JOIN register_products c 
          ON c.id_product = p.id_product 
          WHERE p.record_type = 'output' 

          GROUP BY     
          p.record_type, 
          p.id_product, 
          c.name, 
          c.image)ret 
          WHERE ret.id_product = $product 
          group by ret.name_product, 
          ret.id_product"; 

    $result = @mysqli_query($dbc, $query); 

      $row = mysqli_fetch_array($result); 

      $amount_db = $row['amount']; 

if($amount_db >= $amount || mysqli_num_rows($result) == 0){ 


     $query = "INSERT INTO stock(id_stock, amount, record_type, id_admin, id_product, dt_drive) VALUES (NULL, $amount,'$record', '$admin' ,'$product',CURRENT_TIMESTAMP)"; 

    $result = @mysqli_query($dbc, $query); 

if($result){ 
      $returnn[] = 'successfully completed registration'; 

     }else{ 
      $errors[] = 'Some error occured while registering the stock!'; 
     } 
}else{ 

     //stock error 
     echo"<script>alert('Value Exceeds amount in stock'); history.go(-1)</script>"; 
    } 


    }else{ 

     $return = $errors; 

    } 

    return $returnn; 
}?> 
+1

여기에서는 아무 것도 검증하지 않습니다. 또한, 처음에 @ 연산자를 없애고 적절한 오류 처리를 추가해야합니다. –

+0

더 좋은 방법은 [Doctrine] (http://www.doctrine-project.org/)와 같은 ORM을 사용하는 것입니다.), [Propel] (http://propelorm.org/) 또는 [Eloquent] (https://laravel.com/docs/5.3/eloquent). 당신이 그런 식으로 뭔가를 사용하지 않으면 어쨌든 똑같은 일을 고통스럽고 나쁘게 구현하는 데 몇 주를 소비 할 것입니다. – tadman

+0

** 경고 ** : mysqli를 사용할 때 [매개 변수화 된 쿼리] (http://php.net/manual/en/mysqli.quickstart.prepared-statements.php)와 ['bind_param'] (http://php.net/manual/en/mysqli-stmt.bind-param.php)를 사용하여 사용자 데이터를 쿼리에 추가하십시오. ** 심각한 [SQL injection bug] (http://bobby-tables.com/)를 만들었 기 때문에 문자열 보간이나 연결을 사용하여 **이를 수행하지 마십시오. **'$ _POST' 또는'$ _GET' 데이터를 쿼리에 직접 입력하지 마십시오. 실수로 누군가를 악용하려고 시도하면 매우 위험 할 수 있습니다. – tadman

답변

0

내가 정확하게 문제를 이해 바랍니다. 당신이 잘못했다고 생각하는 것은 사후 요청에 주어진 금액이 데이터베이스에서 사용 가능한 금액보다 큰 경우 일반 점검입니다. 하지만 $ _POST [ 'record']가 "output"인 경우에만 시도 할 수 있습니다. $ _POST [ 'record']가 "input"이면 이것을 검사해서는 안됩니다.

그래서이 코드 한 줄 다시 작성 :

if(($amount_db >= $amount && $_POST['record'] == 'ouput') || mysqli_num_rows($result) == 0){ 

을하지만 코드가 수행 완전한 재 작업이 필요하다고 말하고있다. 그 하나의 라인 만이 아닙니다. 위의 주어진 의견을 참조하십시오.

관련 문제