我有两个来自一个简单插件的代码,它们彼此独立工作但不能一起工作。
if(isset($_POST['submit'])){
if(has_presence($_POST['product_name'])){
insert_row_into_table('CAL_products');
show_errors();
if(has_presence($wpdb->last_query)) {
echo "Update Successful";
} else {
echo "Update Failed";
}
} else {
echo "The field 'Product Name' cannot be blank.";
}
}
这一个
$results_array = $wpdb->get_results("SELECT * FROM wpCMS_CAL_products ORDER BY id ASC");
echo build_table_from_results_array($results_array);
功能包含在底部。
我遇到的问题是,当页面加载时没有$ _POST,因此它跳过if语句并构建表。这个表格很好。
提交表单时,if语句返回true并且新值成功添加到数据库中,但是在刷新页面之前表格不会生成。如果构建表的代码放在if语句的顶部,那么它构建正常,但在页面刷新之前不包括新值。
是否可以在将结果填充到HTML表格之前将新项目添加到数据库表中?
function insert_row_into_table($table_name){
global $wpdb;
$prefix = $wpdb->prefix; //Define the wordpress table prefix
$table = $prefix . $table_name; //Build the table name
unset($_POST['submit']);
echo print_r($_POST);
$data = $_POST; //collect the data from post
$wpdb->insert( $table, $data ); //insert data into the table
}
function show_errors(){
echo $wpdb->show_errors();
echo $wpdb->print_error();
}
function has_presence($value) {
return isset($value) && $value !== "";
}
function build_table_from_results_array($results_array) {
$out = "";
$out .= "<table class=\"widefat\">";
$out .= "<thead>";
foreach($results_array[0] as $key => $element) {
if($key == "id") {
$out .= "<th class=\"id-column\">";
$out .= strtoupper($key);
$out .= "</th>";
} else {
$out .= "<th>";
$out .= ucwords(str_replace("_", " ", $key));
$out .= "</th>";
}
}
$out .= "</thead>";
$out .= "<tbody>";
$i = 0;
foreach($results_array as $key => $element){
if($i % 2 === 0) $extraclass= "alternate";
$out .= "<tr class=\"$extraclass\">";
$i++;
$extraclass="";
foreach($element as $subkey => $subelement){
$out .= "<td>$subelement</td>";
}
$out .= "<td><a href=\"#\">EDIT</a></td>";
$out .= "</tr>";
}
$out .= "</tbody>";
$out .= "</table>";
return $out;
}
答案 0 :(得分:1)
此类页面的一般模式是Post-Redirect-Get.例如,您可以将if(isset($ _ POST ['submit']))块拉出到名为processForm.php的单独文件中。表单的action参数更改为processForm.php。表单将$ _POST数据发送到processForm,它插入新的数据库记录,而processForm又将用户重定向回原始页面以获取结果。
如果您需要使用上述代码的单页解决方案,请在输出任何内容之前在文件的最顶部添加此代码。这将启动输出缓冲区,如果要使用header()命令重定向,通常是必需的。
ob_start();
然后编辑if(isset)块:
if(isset($_POST['submit'])){
if(has_presence($_POST['product_name'])){
insert_row_into_table('CAL_products');
show_errors();
if(has_presence($wpdb->last_query)) {
echo "Update Successful";
header("Location: index.php"); //change index.php to the current page
//header("Location: ".$from); //or use a variable
} else {
echo "Update Failed";
}
} else {
echo "The field 'Product Name' cannot be blank.";
}
}
最后,在脚本的最后添加它以关闭输出缓冲区:
ob_end_flush();
本质上,此代码在将新条目插入数据库后刷新成功页面。这应该允许您的表包含新记录。