【问题标题】:Session and mysql_query doesn't insert data to table会话和 mysql_query 不向表中插入数据
【发布时间】:2015-10-29 08:42:54
【问题描述】:

Mysql_query 在下订单时会向“orders”表插入数据,但不会向“order_detail”表插入数据。

它应该从 Session 'cart' 中获取数据,但似乎失败了。

为了简单起见,我去掉了一些 html 代码,只是留下了按钮,但应该没关系。

<?php
require_once('connect_to_db.php');
include("includes/functions.php");
session_start();

if ($_REQUEST['command'] == 'update') {
    $customerid = mysql_insert_id();
    $date = date('Y-m-d');
    $result = mysql_query("insert into orders values('', '$date', '$customerid')");
    $orderid = mysql_insert_id();

    $max = count($_SESSION['cart']);
    for ($i=0; $i<$max; $i++) {
        $pid = $_SESSION['cart'][$i]['productid'];
        $q = $_SESSION['cart'][$i]['qty'];
        $price = get_price($pid);
        mysql_query("insert into order_detail values ($orderid,$pid,$q,$price)");
    }
    die('Thank You! your order has been placed!');
}
?>

<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<script language="javascript">
function validate(){
    var f=document.form1;
    f.command.value='update';
    f.submit();
}
</script>
</head>
<body>
<form name="form1" onsubmit="return validate()">
<input type="hidden" name="command" />
<input type="submit" value="Place Order" />
</form>
</body>
</html>

这是我将数据存储到会话“购物车”的方式

function addtocart($pid,$q){
        if($pid<1 or $q<1) return;

        if(is_array($_SESSION['cart'])){
            if(product_exists($pid)) return;
            $max=count($_SESSION['cart']);
            $_SESSION['cart'][$max]['productid']=$pid;
            $_SESSION['cart'][$max]['qty']=$q;
        }
        else{
            $_SESSION['cart']=array();
            $_SESSION['cart'][0]['productid']=$pid;
            $_SESSION['cart'][0]['qty']=$q;
        }
    }

【问题讨论】:

  • 会话中的值是否正确存储??
  • a) 您的脚本中没有错误处理。 mysql_connectmysql_select_dbmysql_query 可能会失败,在这种情况下它们会返回 FALSE。在这种情况下,mysql_error() 可以告诉您更多关于实际错误的信息。 b)您可能想检查 $max 实际上是什么,例如通过将其打印在您的模具中(消息)。 c) mysql_* 扩展在即将发布的 php 版本 7 中已弃用并删除,最好使用pick another API 连接到您的 MySQL 服务器
  • 请注意,您使用的旧 mysql_* 扩展在 PHP 5.5 版(当前版本)中已弃用,并且正在从版本 7(下一个版本)中删除。您需要迁移到使用 mysqli_* 扩展或 PDO
  • 我添加了用于将数据存储到会话的代码,Niranjan。我的数据库连接运行良好,Volker,$max 似乎总是打印值 1。
  • 在查询中添加引号:insert into order_detail values ('$orderid','$pid','$q','$price'); BTW:您应该考虑控制查询中可能出现的错误:if (!mysql_query(...)) die(mysql_error()) 或类似的东西。

标签: php mysql session


【解决方案1】:
  1. 在 HTML 中,每个表单都应该有方法(“GET”或“POST”)或操作(文件),以防您使用相同的文件(本例),只需将文件名放在那里即可。
  2. 在这种情况下,在 PHP 中您不应该使用请求,而是使用 post 或 get,因为请求同时处理两者,使用 post 或 get 可能会快一点。
  3. 您可以在没有 javascript 的情况下优化您的 html 文件,这个 javascript 不是必需的。
  4. 您应该避免使用 mysql_query 而是使用 PDO(数据对象)。
  5. 我猜 orderid 和 productid 是一样的,你应该只用一个。
  6. 您应该在第二个查询中添加 ''。
  7. 您应该将表中的列命名为:“INSERT INTO table_name (column1, column2, column3,...) VALUES (value1, value2, value3,...)”,检查您是否没有添加更多mysqlDb 中的表无法处理的值。

试试下面的代码,它可能会更好,但是设置文件名并设置列名。那里

<?php
require_once('connect_to_db.php');
include("includes/functions.php");
session_start();

if (isset($_POST['update'])) {
    $customerid = mysql_insert_id();
    $date = date('Y-m-d');
    $result = mysql_query("INSERT INTO orders (column1,column2,column3) VALUES('', '$date','$customerid')");
    $orderid = mysql_insert_id();

    $max = count($_SESSION['cart']);
    for ($i=0; $i<$max; $i++) {
        $pid = $_SESSION['cart'][$i]['productid'];
        $q = $_SESSION['cart'][$i]['qty'];
        $price = get_price($pid);
        mysql_query("INSERT INTO order_detail (column1,column2,column3,column4) VALUES('$orderid','$pid','$q','$price')");
    }
    die('Thank You! your order has been placed!');
}
?>

<html xmlns="http://www.w3.org/1999/xhtml">
 <head>
 </head>
 <body>
  <form name="form1" method="POST" action="<?php echo $_SERVER['SCRIPT_NAME']; ?>">
   <input type="submit" name="update" value="Place Order" />
  </form>
 </body>
</html>

【讨论】:

  • 这并没有改善,而且一些明显的错误仍然存​​在。
  • 例如:两次使用同一个变量。
  • 第 7 步几乎解决了它,我试图插入 4 个值,但表有 5 列。我从表中删除了一列,现在它正在插入。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-02-01
  • 1970-01-01
  • 1970-01-01
  • 2023-04-07
  • 2014-01-30
相关资源
最近更新 更多