【问题标题】:How to share connection_id between 2 queries?如何在 2 个查询之间共享 connection_id?
【发布时间】:2014-03-09 04:09:45
【问题描述】:

我需要同时执行两条SQL语句,因为第一条语句中的connection_id()会在Mysql视图wp_statistics_benchmarks中使用。

没有connection_id()wp_statistics_benchmarks 是一个空视图。以下 SQL 工作正常并获得结果:

replace into wp_params (`view_name` , `param1_val`, `connection_id`) 
                values ('benchmarks', 484         , connection_id())
;

select * from wp_statistic_benchmarks;

但是,要使用 wordpress,以下代码不起作用:

$mysqli  = new mysqli(.....);

$results = $this->_wpdb->query("
     replace into wp_params (`view_name`, `param1_val`, `connection_id`) 
                values ('benchmarks', $connected_from, $mysqli->thread_id);

     select * FROM `wp_statistic_benchmarks`;"
);

如何将这两个 mysql 代码转换为 Wordpress wpdb 查询?

【问题讨论】:

  • 你不能使用 mysqli->multi_query 函数吗?你真的必须使用 wpdb 吗?
  • 如果this 没有解决您的问题,那么您需要向我们展示wp_statistic_benchmarks 的定义,因为您确实似乎对问题的真正含义感到困惑。

标签: php mysql wordpress


【解决方案1】:

使用 wpdb 对象两次。

$this->_wpdb->query('replace into ...'); 
$rows = $this->_wpdb->get_results('select ...')

让我换一种说法,select * from wp_stat ...replace into wp_params ... 从您原来的“mysql 代码”是单独的语句,没有任何彼此的关系。

认为您需要按顺序运行它们,而实际上您可以在那些 replace into 和 select 语句之间喝杯咖啡甚至环游地球,它们仍然可以同样的事情。如果不是这种情况,那么您的问题缺少提供良好答案所需的信息,因为 wp_params 不是 wordpress 中的标准表,视图也不是。我不认为你理解你的问题。

此外,按照我的建议运行它们与您的“mysql 代码”等效。此外,$wpdb->query 返回受影响的行数或 false,因此您将永远能够使用 $wpdb->query() 运行 select 语句来检索一组元组。

【讨论】:

  • 这样,两个查询的connection_id的值是不同的。我也需要它们。
  • 看看你的问题。 替换 ...; 从 wp_statistic_benchmarks 中选择 *; - 第二个查询没有以任何方式使用 connection_id()。
  • 视图是通过连接一个带有connection_id的表来创建的
  • 您的回复表明您完全对问题感到困惑,并且正在寻找解决问题的人,而不是了解问题所在。 Write that down in your copy book now
  • 这里是wp_params的来源,connection_id是View的过滤器。 mysqlperformanceblog.com/2010/05/19/…
【解决方案2】:

如何将这两个 mysql 代码转换为 Wordpress wpdb 查询?

你不能。那是因为您使用的是wpdb,它只支持每个->query() 调用的一个 查询。但是,如果您将 Mysqli 与wpdb 一起使用,您可以使用它的multi_query() 方法 wpdb。方法如下:

要使用多个查询,您需要确保 wpdb 使用 Mysqli(例如,在您的 Wordpress 配置中将 USE_EXT_MYSQL 常量定义为 FALSE)。

然后您可以从 wpdb 对象中获取mysqli 实例,可以使用反射或辅助类/模块:

abstract class wpdb_dbh extends wpdb
{
    static function from(wpdb $wpdb) {
        return $wpdb->dbh;
    }
}

然后无需创建新实例即可使用 Mysqli:

$mysqli = wpdb_dbh::from($this->_wpdb);

由于这是一个有效的Mysqli 实例,您可以运行multi query

但是仅仅获得与wpdb 相同的Mysqli 实例可能在这里使用它可能是最重要的事情,否则你需要打开一个与new mysqli(...) 的额外连接,你需要阻止它。

另外注意$mysqli->thread_idconnection_id() 的合适替代品,遵循相同的格式/编码。无论如何,您应该可以直接使用connection_id(),所以我实际上没有太多理由访问thread_id 成员,但这可能只是因为您尝试了一些替代方法,而我只是过于谨慎了。

【讨论】:

    【解决方案3】:

    ';'查询分隔符纯粹是一种 SQL shell 便利,不是 MySQL 方言的一部分,所以你的代码不起作用是正确的。

    这是实际的替换代码:

    $mysqli = new mysqli(.....);
    $this->_wpdb->query(
         "replace into wp_params
        (`view_name`, `param1_val`, `connection_id`) 
        values ('benchmarks', $connected_from, $mysqli->thread_id)");
    $results = $this->_wpdb->query("select * FROM `wp_statistic_benchmarks`");
    

    这和上面Ярослав的回答一样。

    更新:

    如果您的代码仍然无法正常工作,您可能需要在 Wordpress 中 enable persistent connections

    更新 2:

    第二个查询的 select 语句和 * 速记所有列选择器之间缺少空格。有趣的是,这可能会或可能不会给您带来问题,它似乎不会打扰我的 MySQL 5.5 命令行 shell。

    【讨论】:

      【解决方案4】:

      如果我了解您的要求(并且我不了解 wordpress),您将在 wp_params 中插入一行,其中包含名为 connection_id 的列。我会假设这个值在桌子上是唯一的。我很想向表中添加一个整数自动增量 id 字段,然后获取该值(最后插入 id)。然后在从视图中选择时在 WHERE 子句中使用此 id。

      【讨论】:

        猜你喜欢
        • 2012-06-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-04-05
        • 1970-01-01
        • 1970-01-01
        • 2020-08-24
        相关资源
        最近更新 更多