Foreach循环未按预期工作-提交表单时自定义表和引用

时间:2017-10-31 作者:Mg10

我有两个自定义表,我想提交一个带有redskabs表名称的表单,以引用我的registereringer表。但我对foreach在这个示例中的工作方式感到困惑。

CREATE TABLE $table_registreringer 
    (
        reg_id INT UNSIGNED NOT NULL AUTO_INCREMENT,
        dato TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
        billedeURL VARCHAR(80) NOT NULL,
        fiske_vaegt INT NOT NULL,
        fiske_laengde INT NOT NULL,         
        reg_user_id BIGINT UNSIGNED NOT NULL,
        reg_redskabs_id INT UNSIGNED NOT NULL,
        PRIMARY KEY  (reg_id),
        FOREIGN KEY  (reg_user_id) REFERENCES wp_users(id),
        FOREIGN KEY  (reg_redskabs_id) REFERENCES $table_redskaber(redskabs_id)
)

CREATE TABLE $table_redskaber 
    (
        redskabs_id INT UNSIGNED AUTO_INCREMENT NOT NULL,
        redskabs_navn CHAR (20),
        PRIMARY KEY  (redskabs_id)
)
这是我的注册号。php页面

global $wpdb;

if ( isset( $_POST[\'submit\'] ) ){
$current_user = wp_get_current_user();
$dato = $_POST[\'dato\'];
$billedeURL = $_POST[\'billedeURL\'];
$fiske_vaegt = trim( $_POST[\'fiske_vaegt\'] );
$fiske_laengde = trim( $_POST[\'fiske_laengde\'] );
// I Don\'t know how to connect the chosen name to the correspondent ID so that I can use the foreign key and post my registration --  
$redskabsID = $wpdb->get_row( $wpdb->prepare("SELECT redskabs_id, redskabs_navn FROM wp_redskaber WHERE redskabs_id = %d", $redskabsID) );

echo $wpdb->show_errors();
$registrering = $wpdb->insert( 
$wpdb->prefix . \'registreringer\',
    array(
        \'reg_id\'            => \'\',
        \'dato\'              => $dato,
        \'billedeURL\'        => $billedeURL,
        \'fiske_vaegt\'       => $fiske_vaegt,
        \'fiske_laengde\'     => $fiske_laengde,
        \'reg_user_id\'       => $current_user->ID,
        \'reg_redskabs_id\'   => $redskabsID
        ),
    array(
        \'%d\',
        \'%d\',
        \'%s\',
        \'%d\',
        \'%d\',
        \'%d\',
        \'%d\'
        )
    );

}
表格

<form method="post">
    <h3>Registering af din fangst</h3>
    <p><label>længden</label></p>
    <p><input type="number" value="" name="fiske_laengde" id="fiske_laengde" />cm</p>
    <p><label>vægten</label></p>
    <p><input type="number" value="" name="fiske_vaegt" id="fiske_vaegt" />kg</p>
    <p><label>Billede</label></p>
    <p><input type="string" value="" name="billedeURL" id="billedeURL" /></p>
    <p><label>dato</label></p>
    <p><input type="datetime-local" name="dato" value="<?php echo date("Y-m-d\\TH:i:s",time($dato)); ?>"/></p>
    <p><label>Fangst udstyr</label></p>
    <p><input type="radio" value="1" name="redskaber[]" /></p>
    <p><input type="radio" value="2" name="redskaber[]" /></p>
    <p><input type="radio" value="3" name="redskaber[]" /></p>
我的单选按钮的foreach代码

<?php 

    $results = $wpdb->get_results( "SELECT redskabs_id, redskabs_navn FROM `wp_redskaber`" );

    $_POST[\'results\'];

    foreach ( $_POST[\'results\'] as $redskaber ) 
    {
        echo $redskaber;
    }

1 个回复
最合适的回答,由SO网友:Jacob Peattie 整理而成

所以你问题的第一部分就是如何获取wp_redskaber 进入单选按钮。正如您所尝试的,使用$wpdb->get_results(); 查询表。默认情况下,每一行都是一个对象,因此您可以这样输出它:

global $wpdb;

$results = $wpdb->get_results( "SELECT * FROM wp_redskaber" );

foreach ( $results as $redskaber ) {
    echo sprintf( 
        \'<label><input type="radio" name="redskabs_id" value="%s"> %s</label>\', 
        esc_attr( $redskaber->redskabs_id ), 
        $redskaber->redskabs_navn
    );
}
因为get_results() 返回一个对象数组,使用对象表示法获取每列的id和名称:$redskaber->redskabs_id, 和$redskaber->redskabs_nav.

所以我循环了每个结果,并为每个结果创建了一个单选按钮输入。单选按钮应具有相同的name, 但价值观不同。在这种情况下,我给了他们名字redskabs_id. 请注意,我使用了sprintf() 将列值放入HTML。我发现这比打开和关闭字符串或PHP标记更简洁,但您可以按自己喜欢的方式进行操作。

因此,在提交表单时,您可以使用$_POST[\'redskabs_id\'].

因此,在第二段代码中$redskabsID 收件人:

$redskabsID = $_POST[\'redskabs_id\'];
$wpdb->insert() 将正确地为您的SQL转义它,因此您在那里是安全的,但是为了进行一些额外的验证,您可能需要确认它是一个带有absint():

$redskabsID = absint( $_POST[\'redskabs_id\'] );
将ID插入reg_redskabs_id 柱您不需要做任何特殊的事情来链接它们。只要该列中的ID与wp_redskaber 您可以匹配它们的表。

如果你在做一些验证并且想绝对确定$redskabsID 是中的有效IDwp_redskaber 表中,可以使用$wpdb->get_col(), 然后将其与提交的值进行比较:

global $wpdb;

$valid_redskabs_ids = $wpdb->get_col("SELECT redskabs_id FROM wp_redskaber");

if ( ! in_array( $_POST[\'redskabs_id\'], $valid_redskabs_ids ) ) {
    // Invalid redskabs_id submitted. Handle error here.
}

结束