私は、関数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;
}?>
ここでは何も検証しません。また、最初に '@ '演算子を取り除いて(適切なエラー処理を追加する) –
これを行うより良い方法は、[Doctrine](http://www.doctrine-project.org/ )、[Propel](http://propelorm.org/)、または [Eloquent](https://laravel.com/docs/5.3/eloquent)を参照してください。このようなものを使用しないと、とにかく同じことを辛くてひどく繰り返し実行することになります。 – tadman
**警告**: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