【问题标题】:How to cross check POST with database如何交叉检查 POST 与数据库
【发布时间】:2013-07-27 07:48:50
【问题描述】:

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

数据库表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、大小和类别来查找它。)

现在的问题是,如果有人要将 value 更改为 sizecategory 或两者兼而有之。它们仍然会被发布,但显然价格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();
    }
    ?>

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

谢谢

【问题讨论】:

  • 你为什么不想使用一个简单的循环?
  • 如何验证输入?对于简单的循环:while ($row = $stmt-&gt;fetch(PDO::FETCH_ASSOC)) { // loop content }
  • @JimMartens 输入我正在这样做if (!/^[1-9]\d?$/.test(Qty)){ alert('Quantity should not be below 1 or null'); return false; // don't continue }
  • @JimMartens 好吧,我不需要循环选择选项。不明白这一点,因为我在那个问题中的工作很好。我正在展示它以防有人想知道我的选择选项是什么样的
  • @SarahJames 虽然在 JavaScript 中进行验证可能会节省时间,但它并非万无一失。您必须始终在服务器端进行验证。想象一下如果我关闭 JavaScript 会发生什么。对于循环:我的建议不会更改您的代码,它只会使其性能有效。现在,您获取结果集中每一行的所有行。另一种方法是:$rows = $stmt-&gt;fetchAll(PDO::FETCH_ASSOC); foreach ($rows as $row) { //loop content }.

标签: php database validation pdo


【解决方案1】:

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>

对于输入的实际处理,您从数据库中读取所有类别ID,并检查所选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(无论是哪种情况)。 当然,您的真实代码会在此之前和之后继续,但它应该为您提供大致方向。

【讨论】:

  • 我已编辑问题以添加我如何添加到购物车。在该编辑中,我添加了您的代码,但问题是,如果我将类别选择选项中的值设为空,然后单击添加到购物车。在我的购物车中,它会复制现有商品
  • @SarahJames 参数 :id 是您的 pid(可见)。选择的 ID 是类别的 ID。我假设您有一个 pid(程序 ID?),并且对于每个 pid,您都有一堆具有自己的名称和 ID 的类别。
  • 我的类别表为pid,它是来自产品表的外键。 CatID 是类别 ID,sizeprice。我不明白你在这里的意思"The selected ID is the ID of the category. I assumed that you have a pid (Program ID?) ",是的,对于每个 pid,它们都有很多类别和名称,每个类别名称都拥有唯一的 ID,即 CatID
  • 如果您想查看该网站。你也许能更好地理解它
猜你喜欢
  • 1970-01-01
  • 2013-07-26
  • 1970-01-01
  • 1970-01-01
  • 2012-07-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-03-06
相关资源
最近更新 更多