大家好,我想知道他们是否是一种交叉检查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页面中,我有一个table
。 size
和category
以及SELECT OPTION然后我有amount
的输入字段,它使用jquery进行验证。
在我的 cartpage.php
中我发布了pid
,size
和category
然后我使用所有这些来查找价格(我没有发布价格,我使用的是pid,大小和类别找到它。)
现在的问题是,如果有人要更改value
或size
或两者的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();
}
?>
我希望我已经清楚地解释了这一点,如果没有,请发表评论,我会尝试重新解释这个问题。
由于
答案 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(无论您的情况如何)。 当然,您的真实代码会在此之前和之后继续,但它应该为您提供总体方向。