会话中有多个值,但只有第一个进入数据库

时间:2014-02-16 01:06:19

标签: php mysql session

我有一个通过向购物车中的产品添加选项而构建的会话。 (工作正常的部分没有在这里描述。)

这些选项会进入类似的会话:$_SESSION['options'.$id]在调用前面的代码块之前识别$id

我想在下面的代码中将会话中的每个项目作为数据库表中的新行插入。

foreach($_SESSION['options'.$id] as $option)
{

    echo $option;
    $statement = "INSERT INTO KC_OrderOptions (orderNumber, optionName, productID) VALUES (:orderNumber, :optionName, :productID)";

    $query = $db->prepare($statement);

    $results = $query->execute(array(
        ":orderNumber"      => $orderNumber,
        ":optionName"       => $option,
        ":productID"        => $item
    ));
}

现在我已经建立了会话,行echo $option;显示以下内容:

Swedish Fish AssortedSmooth n Melty Mints LargeNonpareils Milk ChocolateJelly Belly Sour Assorted

只将Swedish Fish Assorted放入数据库。如何进行循环并将每个项目添加到数据库?

1 个答案:

答案 0 :(得分:1)

代码看起来正确;最可能的罪魁祸首是数据库表中的一个错误键,它阻止(例如)现有的orderNumber多个行。可能是orderNumber是主键的情况,这肯定会导致后续插入失败。

关于预准备语句,以及@Sean在上面的注释中提到的内容,没有必要为循环的每次迭代重新准备相同的语句(尽管你当然可以,但它效率较低)。一次准备语句然后使用不同的绑定参数反复执行它的优点是MySQL可以在内部进行优化以获得更好的性能。

此类代码可能如下所示:

$statement = $db->prepare("INSERT INTO KC_OrderOptions (orderNumber, optionName, productID) VALUES (:orderNumber, :optionName, :productID)");

foreach($_SESSION['options'.$id] as $option)
{
    $statement ->execute(array(
        ":orderNumber"      => $orderNumber,
        ":optionName"       => $option,
        ":productID"        => $item
    ));
}

当然,这是一个可能没有太多优化的例子,但这样做可能被视为最佳实践。