从数据库填充下拉列表

时间:2020-04-01 作者:Daniel Florian

我正在为我们的武术学校创建一个自定义插件,遇到了一个让我头痛的问题。毫无疑问,我遗漏了一些显而易见的东西,但之前从未真正以这种身份与Wordpress打过交道,所以我宁愿问大脑相信我做错了什么;)

以下代码工作正常,并生成下拉列表:

<?php
$servername = "localhost";
$username = "xxx";
$password = "xxx";
$dbname = "testing_db";

$conn = new mysqli($servername, $username, $password, $dbname);

?>
<html>
<body>

<select name="dojang">
        <option selected="selected">Choose…</option>
<?php 
$sql = mysqli_query($conn, "SELECT dojangName FROM wp_tmadm_dojangs");

while ($row = $sql->fetch_assoc()){
    $dojang = $row[\'dojangName\'];
    echo "<option value=\'$dojang\'>$dojang</option>";
}
?>
</select>
但以下内容在Wordpress中不起作用:

<select name="dojang">
    <option selected="selected">Choose…</option>

<?php 
global $wpdb;

$sql = $wpdb->mysqli_query("SELECT dojangName FROM wp_tmadm_dojangs");

while ($row = $sql->fetch_assoc()){
    $dojang = $row[\'dojangName\'];
    echo "<option value=\'$dojang\'>$dojang</option>";
}
?>

</select>
我是否未正确连接到数据库?我还缺什么吗?

感谢您的帮助。谢谢

编辑:抱歉,我在第二块粘贴了错误的代码-应该是mysql_query, 不get_results

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

如果那样的话testing_db 是你的WordPress数据库,那么你应该使用WordPresswpdb API/class 与自定义表中的数据交互(wp_tmadm_dojangs).

因此,如果您在“常规PHP”中就是这样做的,即使用本机PHP函数:

$sql = mysqli_query($conn, "SELECT dojangName FROM wp_tmadm_dojangs");

while ($row = $sql->fetch_assoc()){
    $dojang = $row[\'dojangName\'];
    echo "<option value=\'$dojang\'>$dojang</option>";
}
在WordPress中,这是一种方法:

$results = $wpdb->get_results( "SELECT dojangName FROM {$wpdb->prefix}tmadm_dojangs", ARRAY_A );
var_dump( $results ); // for debugging

foreach ( $results as $row ) {
    $dojang = $row[\'dojangName\'];
    echo "<option value=\'$dojang\'>$dojang</option>";
}
请检查$wpdb->get_results() (或wpdb::get_results()) reference 有关函数语法、参数等的详细信息,但我可以从上述示例中告诉您:

  1. $wpdb->get_results() 返回查询表中的行数组,默认情况下,每一行都是一个PHP对象,每一列都是对象中的一个属性,例如。$row->dojangName.

    然而,在代码中,您可以看到我使用了ARRAY_A 常量,它将每一行作为关联数组,表列作为数组键,例如。$row[\'dojangName\'].

    但不管它是对象还是关联数组,该值当然是相应数据库列中的(原始)值。

    如果要从数据库表中检索单个列/字段,则可以使用$wpdb->get_col() 它返回索引数组中的列值,即。array( 0 => \'value\', 1 => \'value2\', 2 => \'value3\', ... ).

    我推测您的WordPress数据库(表)前缀为wp_, 而不是硬编码前缀,您应该使用$wpdb->prefix 获取前缀。

So使用$wpdb->get_col(), 我举的例子是:

$results = $wpdb->get_col( "SELECT dojangName FROM {$wpdb->prefix}tmadm_dojangs" );
var_dump( $results ); // for debugging

foreach ( $results as $dojang ) {
    echo "<option value=\'$dojang\'>$dojang</option>";
}
顺便说一句,请确保在将数据库值呈现给用户之前转义这些值。E、 g。echo \'<option value="\' . esc_attr( $dojang ) . \'">\' . esc_html( $dojang ) . \'</option>\';