【问题标题】:INSERT multiple select arrays with prepared statements使用准备好的语句插入多个选择数组
【发布时间】:2016-09-16 23:56:40
【问题描述】:

我的数据库包含一个名为“opening_days_hours”的表:

CREATE TABLE IF NOT EXISTS opening_days_hours (
        ID_OpeningHours bigint(20) NOT NULL AUTO_INCREMENT,
        ID_Address bigint(20) NOT NULL,
        opening   time NOT NULL,
        closing   time NOT NULL,
        day       int(11) NOT NULL DEFAULT 0,
        INDEX (ID_Address),
        PRIMARY KEY (ID_OpeningHours),
        CONSTRAINT FK_Addresses_OpeningHours
        FOREIGN KEY (ID_Address) REFERENCES addresses(ID_Address) 
        ON DELETE CASCADE) ENGINE=InnoDB

每一天都包含一个且只有一个“开始”和“结束”时间。

“day”列值是从“checkbox”值中获取的

<input type="checkbox" id="sun" name="days[]" "<?php if (isset($days) && $days=="days") echo "checked"; ?>" value="1">
...same for mon, tue, wed, etc.

而时间是由用户通过“选择”语句(下拉菜单)传递的。

如果 'opening' 和 'closeing' 是标量(1 个值)并且 'day' 是定义为 'days[]' 的数组,则一切正常。为此,我使用准备好的语句:

$q = "INSERT INTO opening_days_hours
                    day,
                    opening,
                    closing
                    ID_Address
                    ) VALUES (?, ?, ?, ?)";

  $days = array();
  if(isset($_POST['days'])) {
     $days = $_POST['days'];
  }

  mysqli_stmt_bind_param($stmt, 'issi',
                        $days,
                        $opening,
                        $closing,
                        $ID_Address
                        );

   foreach ($days as $one) {
      mysqli_stmt_execute($stmt);
   }

使用此代码,我可以在名为“day”的列中每行存储一天,并且 $opening 和 $close 的值每天都相同。

但是,当 'opening' 和 'closeing' 本身是数组时,就像 'day' 一样, 我得到了一个 mysqli_stmt_execute 错误(“数组到字符串的转换”),因此没有任何内容存储到数据库中。

我用不同的代码结构做了很多测试。我诊断出问题是我不能通过 mysqli_stm_execute($stmt) 多个数组。我没有办法解决这个问题。

到目前为止,我发现的所有解决方案都在同一行中存储了许多值,但我不希望这样。我实际上需要每天存储一个开放时间和一个关闭时间,并将每一天存储在自己的行中。

我希望问题很清楚。

【问题讨论】:

    标签: php arrays mysqli drop-down-menu prepared-statement


    【解决方案1】:

    已解决:

    我不得不循环绑定:

      for ($i = 0; $i < count($days); ++$i)
      {
           mysqli_stmt_bind_param($stmt, "issi",
                                   $days[$i],
                                   $opening[$i],
                                   $closing[$i],
                                   $ID_Address
                              );
    
      mysqli_stmt_execute($stmt);
    }
    

    如前文所述stackoverflow explanation

    【讨论】:

      猜你喜欢
      • 2015-02-26
      • 1970-01-01
      • 2016-03-07
      • 1970-01-01
      • 1970-01-01
      • 2013-10-16
      • 1970-01-01
      • 1970-01-01
      • 2015-03-02
      相关资源
      最近更新 更多