使用预准备语句

时间:2016-05-19 21:39:05

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

我的数据库包含一个名为'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.

而用户通过'select'语句(下拉列表)传递时间。

如果'开启'和'关闭'是标量(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和$ closing的值每天都相同。

但是,当'打开'和'关闭'本身就是数组时,就像'day'一样, 我获得了一个mysqli_stmt_execute错误('Array to string conversion'),因此没有任何内容存储到DB中。

我用不同的代码构造做了很多测试。我诊断出问题是我无法传递mysqli_stm_execute($ stmt)多个数组。我没有选择如何解决这个问题。

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

我希望问题很明确。

1 个答案:

答案 0 :(得分:0)

解决:

我不得不循环绑定:

  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

所述