如何与数据库交叉检查POST

时间:2013-07-27 07:48:51

标签: php database validation pdo

大家好,我想知道他们是否是一种交叉检查select选项的方法,这些选项会发布到带有database的其他页面,只是为了确保某人没有使用inspect元素更改任何内容或者萤火虫或任何开发者工具。

数据库表product

我的数据库看起来像这样,但它们中有超过400个数据。

pid   name   size            
1     grey   12 inch          
2     blue   16 inch     

数据库表category

pid    category
1        vans
2        nike

数据库表itemised

pid      price
1        30.00
2        50.00

item.php

在我的item.php页面中,我有一个tablesizecategory以及SELECT OPTION然后我有amount的输入字段,它使用jquery进行验证。

在我的 cartpage.php

我发布了pidsizecategory然后我使用所有这些来查找价格(我没有发布价格,我使用的是pid,大小和类别找到它。)

现在的问题是,如果有人要更改valuesize或两者的category。它们仍然会被发布,但显然可以找到价格wouldn't,因为数据库找不到这些值。

我如何展示我的价值类别示例 *类似于我显示尺寸的方式与我更改选择语句*

    <select id="Category" name="Category">
<?php
        dbconnect(); 
        $stmt = $conn->prepare("SELECT Name FROM Category WHERE pid=:id");
        $stmt->bindParam('id',$id);
        $stmt->execute();
        $i = 0;
        foreach ($stmt->fetchAll(PDO::FETCH_ASSOC) as $row ) {
        if ($i == 0) {

        echo '<option SELECTED value="'.$row['Name'].'">'.$row['Name'].'</option>
        ';
        }
        else {
        echo '<option value="'.$row['Name'].'">'.$row['Name'].'</option>';
        }
        $i++;
        }
    ?>
      </select>

我的问题 它们是否可以找出数据库中存在的内容,并且它与pid相关?如果不是,则不应添加该项目。

编辑添加我的购物车页面的样子Jim Martens 我添加了您在答案中显示的代码 //我在本页顶部开始会话。

<?php
    *jim matens your code starts here*
    if (isset($_GET['pid'])){
    $id = $_GET['ProdID'];

    $categoryID = (isset($_POST['Category']) ? intval($_POST['Category']) : 0);
    dbconnect();
    $stmt1 = $conn->prepare("SELECT CatID FROM Category WHERE pid=:id");
    $stmt1->bindParam('id',$id);
    $stmt1->execute();

    $isValid = false;
    $rows2 = $stmt1->fetchAll(PDO::FETCH_ASSOC);
    foreach ($rows2 as $row1) {
        if ($row1['CatID'] == $categoryID) {
            $isValid = true;
            break;
        }
    }

    }

      *My code starts here*
    if(isset($_POST['pid']) && isset($_POST['length']) && isset($_POST['Qty']) && isset($_POST['Category'])){   
        $pid = $_POST['pid'];
        $length = $_POST["length"];
        $qty = $_POST['Qty'];
        $Category = $_POST['Category'];
        $wasFound = false;

        $i = 0;
        // If the cart session variable is not set or cart array is empty
        if (!isset($_SESSION["cart_array"]) || count($_SESSION["cart_array"]) < 1) { 
            // RUN IF THE CART IS EMPTY OR NOT SET
            $_SESSION["cart_array"] = array(0 => array("item_id" => $pid, "length" => $length, "Category" => $Category, "quantity" => $qty));
        } else {
            // RUN IF THE CART HAS AT LEAST ONE ITEM IN IT
            foreach ($_SESSION["cart_array"]as $array_key=>$each_item) { 
                  if ($each_item['item_id'] == $pid  && $each_item['length'] == $length && $each_item['Category'] == $Category) {
                          $_SESSION["cart_array"][$array_key]['quantity']+=$qty;
                          $wasFound = true;

                      } // close if condition
                  } // close while loop
                // close foreach loop
               if ($wasFound == false) {
                   array_push($_SESSION["cart_array"], array("item_id" => $pid, "length" => $length, "Category" => $Category, "quantity" => $qty));

               }
        }
        header('Location: '.fetchinline($bpages).$currentFile);
        exit();
    }
    ?>

我希望我已经清楚地解释了这一点,如果没有,请发表评论,我会尝试重新解释这个问题。

由于

1 个答案:

答案 0 :(得分:0)

JavaScript验证是解决拼写问题等问题的好方法。但它既不是万无一失,也不能真正验证数据是否在语义上是正确的。因此,您需要将数据发送到PHP脚本。

该脚本现在首先验证它的完整性(正确的值类型等)。在此初始步骤之后,您将根据您的情况对数据库进行验证。如果我理解正确,您需要确保发送的类别是现有类别。有一种非常简单的方法可以实现这一点。

首先是你的表格。

<select id="Category" name="Category">
<?php
    dbconnect();
    // select the ID of the category as well (should be there anyway)
    $stmt = $conn->prepare("SELECT ID, Name FROM Category WHERE pid=:id");
    $stmt->bindParam('id',$id);
    $stmt->execute();
    $i = 0;
    $rows = $stmt->fetchAll(PDO::FETCH_ASSOC);
    foreach ($rows as $row) {
        if ($i == 0) { ?>
            <option selected="selected" value="<?php echo $row['ID']; ?>"><?php echo $row['Name']; ?></option>
        <?php } else { ?>
            <option value="<?php echo $row['ID']; ?>"><?php echo $row['Name']; ?></option>
        <?php
        }
        $i++;
    }
?>
</select>

对于输入的实际处理,您从数据库中读取所有categoryID,并检查所选ID(现在应该是整数)是否在其中。如果是,一切都很好,如果不是用户给出了无效的输入。

一个简单的例子:

$categoryID = (isset($_POST['Category']) ? intval($_POST['Category']) : 0);
dbconnect();
$stmt = $conn->prepare("SELECT ID FROM Category WHERE pid=:id");
$stmt->bindParam('id',$id);
$stmt->execute();

$isValid = false;
$rows = $stmt->fetchAll(PDO::FETCH_ASSOC);
foreach ($rows as $row) {
    if ($row['ID'] == $categoryID) {
        $isValid = true;
        break;
    }
}

ID代表类别ID(无论您的情况如何)。 当然,您的真实代码会在此之前和之后继续,但它应该为您提供总体方向。