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

Php 会话中有多个值,但只有第一个值将进入数据库,php,mysql,session,Php,Mysql,Session,我有一个会话,它是通过向购物车中的产品添加选项来构建的。(此处未描述工作正常的部件。) 这些选项进入如下会话:$\u会话['options.$id],其中在调用前面的代码块之前识别$id 我想在下面的代码中插入会话中的每一项作为数据库表中的新行 foreach($_SESSION['options'.$id] as $option) { echo $option; $statement = "INSERT INTO KC_OrderOptions (orderNumber, o

我有一个会话,它是通过向购物车中的产品添加选项来构建的。(此处未描述工作正常的部件。)

这些选项进入如下会话:
$\u会话['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$选项显示以下内容:

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

它只将
瑞典鱼类分类
放入数据库。如何循环并将每个项目添加到数据库中?

代码看起来是正确的;最可能的罪魁祸首是数据库表中的一个错误键,该键阻止(例如)多个具有相同
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
    ));
}

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

数据库表是什么样子的?是否存在可能会阻止插入多个具有相同
orderNumber
productID
的行的键关系?为什么在循环中有
$statement=“INSERT…”
&
$query=$db->prepare($statement);
将它们移到
foreach()的外部/之前
loop.@futureal--不,没有!@Sean--如果我把选项去掉,我该怎么向数据库中添加选项呢?在评论之前先阅读这个问题……它将帮助我们大家解决问题。谢谢。@futureal--我收回它!这就是问题所在,订单号被定义为键。我在表格中添加了一个
id
列并使之成为主要的。运行脚本,它工作得很好!请在回答位置!