Wordpress:将插件中的表单提交到不同的数据库和表

时间:2017-07-18 21:41:21

标签: php mysql wordpress forms plugins

首先,感谢所有花时间阅读这个问题的人。我之前从未使用过这项服务,期待您能给予我任何支持。

我目前正在尝试创建一个处理单个教师可用性的表单。当前表单的示例图像如下所示: Current Form

上面的表单位于插件目录中。这样做的目的是能够在网站上显示当前可用性,但通过管理面板进行更新。我前面的表格示例如下所示:Front-end Table

我的问题是,我无法获取表单将值提交给数据库。我可能做错了,需要有人来指导我。

我目前的插件:

/* DESCRIPTION: ADDS PGB TIMESLOTS LINK TO ADMIN DASHBOARD MENU */

add_action('admin_menu', 'pgb_timeslots');
function pgb_timeslots() {
    $page_title = 'PGB Timeslot Management';
    $menu_title = 'PGB Timeslots';
    $capability = 'edit_posts';
    $menu_slug = 'pgb_timeslots';
    $function = 'pgb_timeslot_options';
    $icon_url = '';
    $position = 2;

    add_menu_page( $page_title, $menu_title, $capability, $menu_slug, $function, $icon_url, $position );
}

function pgb_timeslot_options() {

  include('sp-db-connect.php'); //Student Portal DB Connection

if (isset($_POST['Update'])) {
        $size = count($_POST['ID']);

        $i = 0;
        while ($i < $size) {
            $mon = $_POST['1'][$i];
            $tues = $_POST['2'][$i];
            $wed = $_POST['3'][$i];
            $thurs = $_POST['4'][$i];
            $fri = $_POST['5'][$i];
            $sat = $_POST['6'][$i];
            $sun = $_POST['7'][$i];
            $id = $_POST['ID'][$i];

            $timetable_update_stmt = $db->prepare('
            UPDATE
                timetable
            SET
                `1` = '.$mon.',
                `2` = '.$tues.', 
                `3` = '.$wed.', 
                `4` = '.$thurs.', 
                `5` = '.$fri.', 
                `6` = '.$sat.', 
                `7` = '.$sun.' 
            WHERE 
                timeid = '.$id.' 
            LIMIT 
                1
            ');
            $timetable_update_stmt->execute();
            ++$i;
        }
        // NEED TO SET NOTIFICATION STATUS
        echo '<p>Update Completed</p>';
    }
echo '<style>
/* --- The Table Structure --- */
table {
  border-collapse: separate;
  border-spacing: 0;
}
table tr th,
table tr td {
  border-right: 1px solid #bbb;
  border-bottom: 1px solid #bbb;
  box-shadow: 2px 2px 1px #e5dfcc;
}
table tr th:first-child,
table tr td:first-child {
  border-left: 1px solid #bbb;
}
table tr th {
  border-top: 1px solid #bbb;
}

/* top-left border-radius */
table tr:first-child th:first-child {
  border-top-left-radius: 6px;
}

/* top-right border-radius */
table tr:first-child th:last-child {
  border-top-right-radius: 6px;
}

/* bottom-left border-radius */
table tr:last-child td:first-child {
  border-bottom-left-radius: 6px;
}

/* bottom-right border-radius */
table tr:last-child td:last-child {
  border-bottom-right-radius: 6px;
}

/* -- The Stlyes -- */
input[type="text"] {
    width: 100%;
}

th, td{
  padding: 8px 8px;
}
th{
  background: #E5E6EB;
  color: #111;
}
td{
  background: #EFF1F6;
}
</style>';

    echo '<h1>PGB Timeslot Management</h1>
<p>This page allows you to update the available timeslots for PGB. If you enter 0, it means not available, 1 means available weekly, and 2 means available fortnightly.</p>
<section class="timeslots">
<form name="timeslots" method="POST">
<table>
    <tbody>
        <tr>
            <th>Slots</th>
            <th>Mon</th>
            <th>Tue</th>
            <th>Wed</th>
            <th>Thu</th>
            <th>Fri</th>
            <th>Sat</th>
            <th>Sun</th>
        </tr>';

    $count = 1;
    $sql = 'SELECT * FROM timetable';
    $result = mysqli_query($sp_db, $sql) or die($sp_db->error);

    while ($row = mysqli_fetch_assoc($result)) {

        echo '<tr>';
        $halftime = "";

        if (strpos($row['timeid'], 'h') !== false) {                                                
            $halftime = "1";
            $chopme = chop($row['timeid'],"h");
            $nextslot = $chopme+1;
        } else {                                                
            $halftime = "0";                                            
            $chopme = $row['timeid'];
            $nextslot = $row['timeid']+1;
        }

        if ( $halftime == "0" ) {
            //starts on the hour
            echo "<td>".$chopme.":00 - ".$chopme.":30</td>";
        } else {
            //starts on the half hour
            echo "<td>".$chopme.":30 - ".$nextslot.":00</td>";
        }


        echo '<input type="hidden" name="ID[]" value="'.$row['timeid'].'">';                                    
        for ($i = 1; $i <= 7; $i++) {
            // 1 through 7 = Mon through Sun
            echo '<td><input type="text" name="'.$i.'[]" id="'.$row['timeid'].'" value="'.$row[$i].'"></td>';
        }

        echo '</tr>';
        $count++; 

    } 


    echo '</tbody>
</table>
<input type="submit" name ="Update" value="Update" />
<p>Once you have changed the values for availability above, click the update button.</p>
</form>
</section>
</div>
            </div>';

}

上面的代码不会向数据库提交任何内容,而是呈现一个空白屏幕,就像没有要显示的管理内容一样。单击提交按钮后,它不会重新加载表单或将数据保存到数据库。从前端表上的数据库中提取值时,我会根据显示的值转换输出。 0 =满,1 =每周,2 =每两周等。

我在这里完全错过了什么?

编辑:

我以为我会提供当前的表格结构,以便您可以看到我目前正在使用的内容:

CREATE TABLE `timetable` (
  `ID` int(11) NOT NULL COMMENT 'Primary ID',
  `timeid` varchar(4) NOT NULL COMMENT 'Time-Slot',
  `1` int(1) NOT NULL COMMENT 'Monday',
  `2` int(1) NOT NULL COMMENT 'Tuesday',
  `3` int(1) NOT NULL COMMENT 'Wednesday',
  `4` int(1) NOT NULL COMMENT 'Thursday',
  `5` int(1) NOT NULL COMMENT 'Friday',
  `6` int(1) NOT NULL COMMENT 'Saturday',
  `7` int(1) NOT NULL COMMENT 'Sunday'
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

'timeid'由7,7h,8,8h,9,9h等组成.'h'让我知道插槽是在半小时标记处开始的。然后我使用下面的代码将它们转换为前端的可读时间格式:

<table>
    <tbody>
        <tr>
            <th>Slots</th>
            <th>Mon</th>
            <th>Tue</th>
            <th>Wed</th>
            <th>Thu</th>
            <th>Fri</th>
        </tr>
<?php

    include('sp-db-connect.php'); // DB Connection

    $count = 1;
    $sql = 'SELECT * FROM timetable';
    $result = mysqli_query($sp_db, $sql) or die($sp_db->error);

    while ($row = mysqli_fetch_assoc($result)) {

        echo '<tr>';
        $halftime = "";

        if (strpos($row['timeid'], 'h') !== false) {                                                
            $halftime = "1";
            $chopme = chop($row['timeid'],"h");
            $nextslot = $chopme+1;
        } else {                                                
            $halftime = "0";                                            
            $chopme = $row['timeid'];
            $nextslot = $row['timeid']+1;
        }

        if ( $halftime == "0" ) {
            //starts on the hour
            echo "<td>".$chopme.":00 - ".$chopme.":30</td>";
        } else {
            //starts on the half hour
            echo "<td>".$chopme.":30 - ".$nextslot.":00</td>";
        }

        for ($i = 1; $i <= 5; $i++) {
            // 1 through 5 = Mon through Fri
            if ($row[$i] == '0' ) {
                $row[$i] = 'Full';
            } elseif ($row[$i] == '1' ) {
                $row[$i] = '<a href="booking-confirmation/?d='.$i.'&t='.$row['timeid'].'&f=1" title="Book Now" rel="nofollow">Weekly</a>';
            } else {
                $row[$i] = '<a href="booking-confirmation/?d='.$i.'&t='.$row['timeid'].'&f=2" title="Book Now" rel="nofollow">Every 2 weeks</a>';
            }
        }

        for ($i = 1; $i <= 5; $i++) {
            // 1 through 5 = Mon through Fri
            echo "<td>".$row[$i]."</td>";
        }

        echo '</tr>';
        $count++; 

    } 


?>
    </tbody>
</table>

我不想创建功能齐全的计划程序/计划。我需要在前端显示时隙,然后指出它们是否可用。我理解你关于格式化的逻辑,只需要在数据库中存储不可用的数据。我不太确定如何使用'booking_start'和'booking_end'变量来获取数据。

用户将点击将重定向到预订表格的时间段。该时间段将传递到新页面以供他们确认。时间段不会改变。我不需要获取具体的日期等。我需要的是每周设置的时间段以及它们是否可用。如果有人在特定日期采用时间段,那么我只需将其标记为已满。原因是,如果某人确实在一天中占用了那个位置,那么他们将不断拥有该位置。

它基本上是音乐学费槽。学生每周都会预订一个插槽并拥有相同的插槽。当新学生想要查看我的可用性时,他们只需知道我有哪些插槽等,哪些插槽已满。

1 个答案:

答案 0 :(得分:0)

不是答案,但想利用格式化选项......

好的,我们知道所有插槽mon-fri,7.00 - 23.00都存在,所以我们不需要存储它们。我们只需要存储那些不可用的。所以我们的表格看起来像这样:

( user_id INT NOT NULL
, booking_start DATETIME NOT NULL
, booking_end DATETIME NOT NULL
, PRIMARY KEY (user_id,booking_start)
)

这是否是最终设计取决于你,但它至少是标准化的,而你目前的设计并非如此。