【发布时间】: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 页面中,我有一个 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();
}
?>
我希望我已经清楚地解释了这一点,如果没有,请发表评论,我会尝试重新表述这个问题。
谢谢
【问题讨论】:
-
你为什么不想使用一个简单的循环?
-
如何验证输入?对于简单的循环:
while ($row = $stmt->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->fetchAll(PDO::FETCH_ASSOC); foreach ($rows as $row) { //loop content }.
标签: php database validation pdo