나는 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/)와 같은 ORM을 사용하는 것입니다.), [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 injection bug] (http://bobby-tables.com/)를 만들었 기 때문에 문자열 보간이나 연결을 사용하여 **이를 수행하지 마십시오. **'$ _POST' 또는'$ _GET' 데이터를 쿼리에 직접 입력하지 마십시오. 실수로 누군가를 악용하려고 시도하면 매우 위험 할 수 있습니다. – tadman