使用数组更新表时遇到问题

时间:2013-05-01 11:36:45

标签: php mysql

在试图了解其工作原理后,我决定要求我提供一些如何做到这一点的提示。

首先让我说我几乎没有经历过这样的事情。我刚刚通过查看代码收集了一些逻辑,我几乎已经完成了我的项目,除了我遇到的这个问题。

这是原始代码(我仍然在代码中使用另一个地方,这似乎工作正常)。

function showCart() {
global $db;
$cart = $_SESSION['cart'];
if ($cart) {
    $items = explode(',',$cart);
    $contents = array();
    foreach ($items as $item) {
        $contents[$item] = (isset($contents[$item])) ? $contents[$item] + 1 : 1;
    }
    $output[] = '<form action="kurv.php?action=update" method="post" id="cart">';
    $output[] = '<table>';
    foreach ($contents as $id=>$qty) {
        $sql = 'SELECT * FROM varetabel WHERE varenr = '.$id;
        $result = $db->query($sql);
        $row = $result->fetch();
        extract($row);
        $output[] = '<tr>';
        $output[] = '<td><a href="kurv.php?action=delete&varenr='.$id.'" class="r">Slet</a></td>';
        $output[] = '<td>'.$varenavn.'</td>';
        $output[] = '<td>DKK '.$pris.'</td>';
        $output[] = '<td><input type="text" name="qty'.$id.'" value="'.$qty.'" size="3" maxlength="3" /></td>';
        $output[] = '<td>DKK '.($pris * $qty).'</td>';
        $total += $pris * $qty;
        $output[] = '</tr>';
        $_SESSION['items'] = $contents; // Antal forskellige varer.
        $_SESSION['qty'] = $qty;
    }
    $output[] = '</table>';
    $output[] = '<p>Pris total: <strong>DKK '.$total.'</strong></p>';
    $output[] = '<div><button type="submit">Opdatér kurv</button></div>';
    $output[] = '</form>';
} else {
    $output[] = '<p>Kurven er tom.</p>';
}
return join('',$output);

}

全局$ db连接到数据库等,没有大问题,然后有一个包含这个函数:

    function fetch () {
    if ( $row=mysql_fetch_array($this->query,MYSQL_ASSOC) ) {
        return $row;
    } else if ( $this->size() > 0 ) {
        mysql_data_seek($this->query,0);
        return false;
    } else {
        return false;
    }
}

现在,我试图使用相同的方法从这段代码中获取数组并使用以下代码将它们放入我的数据库中:

session_start();
global $db;
$items = $_SESSION['items'];
$cart = $_SESSION['cart'];
$qty = $_SESSION['qty'];

if(isset($_SESSION['email'])) { // IF LOGGED IN

$sql = mysql_query("SELECT * FROM antalstabel ORDER BY ordrenr DESC LIMIT 1") or die(mysql_error());
$row = mysql_fetch_assoc($sql);
$maxordrenr = $row['ordrenr'];
$nextnumber = $maxordrenr + 1;
$antal = count($items); // COUNTS DIFFERENT ITEMS IN CART.
$maxplusantal = $maxordrenr + $antal;
$varenrplaceholder = 0;

for ($i = $maxordrenr; $i <= $maxplusantal; $i++) {

$sql = mysql_query("INSERT INTO antalstabel (ordrenr, varenr) VALUES ('$nextnumber','$varenrplaceholder')") or die(mysql_error());
$nextnumber--;
$varenrplaceholder++;

}

$varenrplaceholder = 0;

if ($cart) {
$items = explode(',',$cart);
$contents = array();

foreach ($items as $item) {

$contents[$item] = (isset($contents[$item])) ? $contents[$item] + 1 : 1;

}

foreach ($contents as $id=>$qty) {

$sql = 'UPDATE antalstabel SET varenr = '.$id.' and antal = '.$qty.' WHERE ordrenr = '.$nextnumber.' and varenr = '.$varenrplaceholder.'';
$result = $db->query($sql);
$row = $result->fetch();
extract($row);
$varenrplaceholder++;

}
}

但它似乎没有正常工作,代码确实运行,但它不会使用数组的值更新表格。

我完全错了,或者任何人都可以帮我解决这个问题,我知道要问很多。

我自己的代码创建具有相同ID的X行,具体取决于购物车中有多少不同的商品,我正在尝试更新我刚创建的那些现有行,我认为这些值仍然在数组中showCart()函数。

提前谢谢

3 个答案:

答案 0 :(得分:1)

    $sql = 'SELECT * FROM varetabel WHERE varenr = '.$id;
    $result = $db->query($sql);

您没有检查query()返回的成功/失败状态。如果出现错误,大多数MySQL函数都会返回false,例如WHERE子句中的拼写错误的表名或无效的表达式。

我不知道$ id是什么,但是您应该检查$ sql字符串以查看它是否有效(将其复制并粘贴到mysql客户端会话中进行测试)。

并且您应该始终检查$ result不是false。见http://php.net/mysql_error

答案 1 :(得分:0)

您的代码行有错误

foreach ($contents as $id=>$qty) {

$sql = 'UPDATE antalstabel SET varenr = '.$id.',antal = '.$qty.' WHERE ordrenr = '.$nextnumber.' and varenr = '.$varenrplaceholder.'';
$varenrplaceholder++;

}

$select_query='SELECT * FROM varetabel WHERE varenr = '.$id;
$result = $db->query($select_query);
$row = $result->fetch();
extract($row);

答案 2 :(得分:0)

您似乎正在创建大量虚拟记录,然后进行更新。我希望你只需要插入,但想知道这是否与更新后的提取有关。

然而,我怀疑停止查询工作的主要原因是,在将$ items设置为爆炸的$ cart之前计算$ items的数量。

我已经完成了以下操作,使用db类

中方法的假定名称
<?php
session_start();
global $db;
$items = $_SESSION['items'];
$cart = $_SESSION['cart'];
$qty = $_SESSION['qty'];

if(isset($_SESSION['email'])) 
{ // IF LOGGED IN

    if ($cart) 
    {
        $sql = "SELECT MAX(ordrenr) AS ordrenr FROM antalstabel";
        $result = $db->query($sql) or die($db->error());
        if ($row = $result->fetch())
        {
            $maxordrenr = $row['ordrenr'];
            $nextnumber = $maxordrenr + 1;
            $items = explode(',',$cart);
            $antal = count($items); // COUNTS DIFFERENT ITEMS IN CART.
            $maxplusantal = $maxordrenr + $antal;
            $varenrplaceholder = 0;

            for ($i = $maxordrenr; $i <= $maxplusantal; $i++) 
            {
                $sql = "INSERT INTO antalstabel (ordrenr, varenr) VALUES ('$nextnumber','$varenrplaceholder')";
                $db->query($sql) or die($db->error());
                $varenrplaceholder++;
            }

            $varenrplaceholder = 0;
            $contents = array();

            foreach ($items as $item) 
            {
                $contents[$item] = (isset($contents[$item])) ? $contents[$item] + 1 : 1;
            }

            foreach ($contents as $id=>$qty) 
            {
                $sql = "UPDATE antalstabel SET varenr = $id and antal = $qty WHERE ordrenr = $nextnumber and varenr = $varenrplaceholder";
                $result = $db->query($sql) or die($db->error());
                $row = $result->fetch();
                extract($row);
                $varenrplaceholder++;
            }
        }
    }
}
?>