在wordpress插件中进行多个数据库调用(PHP CRUD)

时间:2014-03-03 14:29:11

标签: php mysql wordpress

我有两个来自一个简单插件的代码,它们彼此独立工作但不能一起工作。

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;
}

1 个答案:

答案 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();

本质上,此代码在将新条目插入数据库后刷新成功页面。这应该允许您的表包含新记录。