【问题标题】:Mysqli multi query PHPMysqli 多查询 PHP
【发布时间】:2013-09-23 16:31:52
【问题描述】:

我想用 php mysqli 函数来查询这个:

SET @rownum = 0, @rank = 1, @prev_val = NULL;
SELECT @rownum := @rownum + 1 AS row,
    @rank := IF(@prev_val!=score,@rownum,@rank) AS rank,
    userid,
    @prev_val := score AS score
FROM (
    SELECT userid, sum(amount) as score 
    from leads WHERE date(time) >= '2013-08-15'
    group by userid
) exodus_entries 
 ORDER BY rank asc LIMIT 0,100;

我尝试使用 mysqli_query(link, query);功能,但没有运气,有什么帮助吗?

【问题讨论】:

  • 尝试使用mysqli::multi_query,因为您的查询实际上是多个语句
  • 我正在尝试这个:$query = mysqli_multi_query($cxn,$sqll); $result = mysqli_store_result($cxn);而 ($row = mysqli_fetch_row($result)) { echo $row[1] 。 "
    ";但是 mysqli_fetch_row 返回错误。
  • mysqli_fetch_row() 期望参数 1 为 mysqli_result,给定布尔值
  • 在这种情况下,请显示您的 (php) 代码。您已经可以尝试将mysqli_multi_query(.....); 更改为mysqli_multi_query(.....) or die (mysqli_error());。这应该告诉你是否有任何 mysql 错误,否则会被静默忽略。

标签: php mysqli multi-query


【解决方案1】:

无需使用多查询,每次使用多查询时都会冒security problems 的风险。

用户变量@rownum、@rank、@prev_val 的值将在第二个查询中保持有效,只要您在同一连接中运行这两个查询。

所以只需运行mysqli_query("SET ...");,然后分别运行mysqli_query("SELECT...");。这样做要简单得多,并且至少可以避免一种安全风险。

关于您的错误:

mysqli_fetch_row() expects parameter 1 to be mysqli_result, boolean given 

总是检查 mysqli_query() 的返回值。如果有错误,它将返回 false。当然你不能运行mysqli_fetch_row(false);

【讨论】:

  • 太棒了。这在任何 API 或论坛上几乎都没有记录。我不知道这是否是一个“明显”的解决方案,但我一直在寻找这个解决方案超过 2 天。
  • @Michael,请阅读本手册页的第一段:dev.mysql.com/doc/refman/5.6/en/user-variables.html 它并没有字面上说设置用户变量会持续到会话的其余部分,但这就是发生的事情,它就是如果您有疑问,肯定很容易测试。
猜你喜欢
  • 1970-01-01
  • 2011-08-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-05-05
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多