【问题标题】:Add To Basket Script - some design help, please添加到篮子脚本 - 请提供一些设计帮助
【发布时间】:2009-08-27 13:08:47
【问题描述】:

我正在编写一个脚本,让用户将物品放入他们的购物篮。到目前为止它非常复杂,我想与某人讨论一下,看看他们是否可以提出更好的设计或整理当前的设计。这是我的代码,它运行得不是很好(即有我还没有解决的错误),用 cmets 来表明我的意图:

<?php
session_start();
include_once("db_include.php5");
doDB();


if(!$_GET["productid"] || !$_GET["qty"]) {
//the user has entered the address directly into their address bar, send them away (if=1 to let me know where the script branched)
header("Location:index.php5?if=1");
exit();
}

**//do select query to verify item id is valid, in case they entered data into the query string or the item has been removed from db**
$check_sql = "SELECT * FROM aromaProducts1 WHERE id='".$_GET["productid"]."'";
$check_res = mysqli_query($mysqli, $check_sql) or die(mysqli_error($mysqli));

if(mysqli_num_rows($check_res) == 0) {
**//item doesn't exist, redirect user**
header("Location:index.php5?if=2");
exit();
} else if(mysqli_num_rows($check_res) != 0) {
**//item exists
//do select query to check for item id already in basket - if this item is already in the table associated with the user's session id (which will be added every time an item is), then we want to change the quantity only**
$duplicate_sql = "SELECT qty FROM sessionBasket WHERE product_id='".$_GET["productid"]."' AND usersessid='".$_SESSION["PHPSESSID"]."'";
$duplicate_res = mysqli_query($mysqli, $duplicate_sql) or die(mysqli_error($mysqli));

if(mysqli_num_rows($duplicate_res) != 0) {
**//item in basket - add another - fetch current quantity and add new quantity**
$basketInfo = mysqli_fetch_array($duplicate_res);
$currQty = $basket_info["qty"];
$add_sql = "UPDATE sessionBasket SET qty='".($_GET["qty"]+$currQty)."' WHERE usersessid='".$_SESSION["PHPSESSID"]."'AND product_id='".$_GET["productid"]."'";
$add_res = mysqli_query($mysqli, $add_sql) or die(mysqli_error($mysqli));

if($add_res !== TRUE) {
**//wasn't updated for some reason - this is where my script currently breaks**
header("Location:basketfailredirect.php5?error=add");
exit();
} else if($add_res === TRUE) {
**//was updated - send them away**
header("basket.php5?res=add");
exit();
}


} else if(mysqli_num_rows($duplicate_res) == 0) {
**//no existing items in basket, so we want to add the current item info associated with the user's id/session id**

**//fetch product id, passed in query string from the product info page**
$productid = $_GET["productid"];

**//sanitize possible inputs, if set - notes is a field added to the product info page for custom products, and we want to sanitize it if it's set - note that check_chars_mailto() is a function I have in the db_include file**
$notes = isset($_GET["notes"])?trim(mysqli_real_escape_string(check_chars_mailto($_GET["notes"]))):"";
**//if the user is logged in, their userid is stored in the session variable**
$userid = $_SESSION["userid"]?$_SESSION["userid"]:"";
**//not sure about the keep alive option - i.e. store basket contents even if the user doesnt register/sign in, but keeping the option there**
$alive = $_SESSION["alive"]?$_SESSION["alive"]:"no";


**//insert query**
$insert_sql = "INSERT INTO sessionBasket (userid, usersessid, date_added, keep_alive, product_id, qty, notes) VALUES (
'".$userid."',
'".$_SESSION["PHPSESSID"]."',
now(),
'".$alive."',
'".$productid."',
'".$_GET["qty"]."',
'".htmlspecialchars($notes)."')";
$insert_res = mysqli_query($mysqli, $insert_sql) or die(mysqli_error($mysqli));

if($insert_res === TRUE) {
**//success**
header("Location:basket.php5?res=add");
exit();
} else if($insert_res !== TRUE) {
**//fail**
header("Location:basketfailredirect.php5?error=add2");
exit();
}
}
}
?>

这对我来说非常复杂 - 我想允许空字段,如果可用则添加用户 ID(我的 UPDATE 查询中缺少该用户 ID)......这是距离一个好的设计一百万英里,还是什么?

另外,当我尝试将商品添加到购物篮时,我现在收到一个错误:内部服务器错误 500。我怀疑这是由于编码错误,因为我的搜索结果和产品视图页面正常工作并且它们使用相同的服务器并且与此脚本相同的数据库。

【问题讨论】:

  • 哎呀。我的眼睛受伤了...首先:将编写代码作为代码放入编辑器中。第二:尝试给我们一些尽可能需要的代码来帮助您解决问题......这只是 InformationOverflow
  • 我打算把它编辑成一个代码框,呵呵,对不起。我知道这是一个很长的脚本,但我需要对策略以及这段代码是否应该工作有一个普遍的看法,所以我觉得有必要把它全部看完。

标签: php mysql shopping-cart shopping


【解决方案1】:

您应该考虑使用 PHP 的内置伪面向对象样式。

您或许还应该考虑使用 PHP 框架,例如 Zend 或 CakePHP。即使您不使用 PHP 框架,您仍然应该能够通过 php 的类和接口对象以面向对象的方式创建代码。

通过将此代码分离到类和函数中,您将大大简化您(和我们的)调试,无论是现在还是将来您要编辑代码时。

【讨论】:

  • 我对编程很陌生,所以升级到面向对象是我宁愿在这个项目上避免的延迟。目前我在程序风格上相处得很好,但我会记住这个建议。在这个项目之后,我确实想提升我对我正在使用的所有语言的知识和应用,而 OOP 似乎是下一个合乎逻辑的举措。
猜你喜欢
  • 1970-01-01
  • 2014-04-18
  • 1970-01-01
  • 2011-08-24
  • 2012-11-27
  • 1970-01-01
  • 1970-01-01
  • 2023-04-01
  • 1970-01-01
相关资源
最近更新 更多