2016-11-01 10 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/ )、[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インジェクションのバグ](http://bobby-tables.com/)を作成したため、文字列の補間または連結を使用してこれを実行しないでください。 ** '$ _POST'や' $ _GET'データを直接クエリに入れないでください。誰かがあなたのミスを悪用しようとすると、非常に危険です。 – tadman

答えて

0

私は私が正しくあなたの問題を理解したいと考えています。あなたが間違っていたと思うのは、ポストリクエストで指定された金額がデータベースで利用可能な金額よりも大きい場合、一般的なチェックです。しかし、$ _POST ['record']が "output"の場合、これは試しに過ぎません。 $ _POST ['record']が「input」の場合、これをチェックしてはいけません。

だから、このコードの1行書き換える:

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

をしかし、私はあなたのコードが行われ、完全なリワークを必要としていることを、言わなければなりません。それだけではありません。上記のコメントを参照してください。

関連する問題