我有两个自定义表,我想提交一个带有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;
}
最合适的回答,由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.
}