使用变量时的 Wordpress 数据库查询 ($wpdb) 错误

Posted

技术标签:

【中文标题】使用变量时的 Wordpress 数据库查询 ($wpdb) 错误【英文标题】:Wordpress database query ($wpdb) errors when using variables 【发布时间】:2012-08-28 14:16:50 【问题描述】:

我在 WordPress MultiSite 上有一个名为“ihn_2_frm_item_metas”的自定义 WordPress 表,用于表单条目。

数据库表截图在这里:https://www.dropbox.com/s/ex54qxxohkexg5t/mysql.png

现在,有两个条目。每个条目都有自己唯一的“item_id”(在这种情况下,Bob Marley 的条目的 id 为 10,Molly Dolly 的条目的 id 为 9)。这些条目也对应于实际的 WordPress 用户(他们的用户名是他们的电子邮件地址,他们的密码是“test”)。条目 ID 与其 WordPress 用户 ID 不同。

我已使用密码“test”以“bob@marley.com”身份登录。

在博客的主页上,我只想为当前登录的用户显示“meta_value”列中的所有项目。

我想分两步完成:

    查找当前登录用户的电子邮件地址(“bob@marley.com”)。 在匹配的电子邮件地址的同一行中找到该用户的表单条目 (10) 的“item_id”。

这是我想出的代码:

    global $wpdb;
    global $current_user;
    get_currentuserinfo();
    $email = $current_user->user_email;

    $id = $wpdb->get_var( " SELECT item_id FROM ihn_2_frm_item_metas WHERE meta_value = $email " );
    $client_meta = $wpdb->get_results(" SELECT * FROM ihn_2_frm_item_metas WHERE item_id = $id " );

    echo '<p> $email is a ' . gettype($email) . '</p>';
    echo '<p> $id is a ' . gettype($id) . '</p>';
    echo '<p>The current logged in user is ' . $email . '.</p>';
    echo '<p>The current form entry id is ' . $id . '.</p>';
    echo "<ul>";

    foreach ($client_meta as $value) 
        echo '<li>' . $value->meta_value . '</li>';
    

    echo "</ul>";

我有两个gettype() 语句只是为了确认我的两个变量$email$id 都是字符串。

这是我的代码的输出:

$email 是一个字符串。

$id 是 NULL。

当前登录用户是 bob@marley.com。

当前的表单条目 id 是。

请注意,$idNULL。让我感到困惑的是,当我将$id 变量更改为此(将变量$email 替换为'bob@marley.com')时:

$id = $wpdb->get_var( " SELECT item_id FROM ihn_2_frm_item_metas WHERE meta_value = 'bob@marley.com' " );

我的输出正是我需要的:

$email 是一个字符串。

$id 是一个字符串。

当前登录用户是 bob@marley.com。

当前表单条目 id 为 10。

鲍勃 马利 bob@marley.com 测试 8

我哪里出错了?

【问题讨论】:

【参考方案1】:

您在$email 上省略了单引号:

$id = $wpdb->get_var( " SELECT item_id FROM ihn_2_frm_item_metas WHERE meta_value = '$email' " );
//---------------------------------------------------------------------------------^^^^^^^^

这会导致查询出现语法错误。我不熟悉 WordPress 如何处理这些错误,但它在不成功的查询中返回 NULL

如果您不需要实际知道item_id 的值,除了在后续查询中使用它,我想您可以使用IN() 子查询将它们组合成一个语句:

$client_meta = $wpdb->get_results("
  SELECT * FROM ihn_2_frm_item_metas WHERE item_id IN (
    SELECT item_id FROM ihn_2_frm_item_metas WHERE meta_value = '$email'
  )
");

【讨论】:

完美解决了这个问题。非常感谢!

以上是关于使用变量时的 Wordpress 数据库查询 ($wpdb) 错误的主要内容,如果未能解决你的问题,请参考以下文章

传入 Python 列表时的非法变量名称/编号

在wordpress中使用ajax进行MySQL选择查询

在 Wordpress 自定义帖子类型循环中使用 ACF 分类字段作为变量

保护 wordpress - 如何使用 wodb->prepare() 函数

变量为 false 时的 where 子句不会将其考虑到 SQL 查询中?

使用变量时的 GraphQL 错误请求