【问题标题】:mysqli_fetch_assoc() expects parameter 1 to be mysqli_result, string given in while-loopmysqli_fetch_assoc() 期望参数 1 是 mysqli_result,字符串在 while 循环中给出
【发布时间】:2020-02-04 14:25:26
【问题描述】:

我目前有这个代码,但它给了我错误mysqli_fetch_assoc() expects parameter 1 to be mysqli_result, string given on line 22

代码是这样的:

1   $servername = "localhost";
2   $user = "root";
3   $pass = "";
4   $db = "mafioso";
5
6   $con = mysqli_connect($servername, $user, $pass, $db);
7
8   $cash_utbetaling[0] = 50000000;
9   $cash_utbetaling[1] = 40000000;
10  $cash_utbetaling[2] = 30000000;
11  $cash_utbetaling[3] = 20000000;
12  $cash_utbetaling[4] = 10000000;
13
14  $kuler_utbetaling[0] = 25;
15  $kuler_utbetaling[1] = 20;
16  $kuler_utbetaling[2] = 15;
17  $kuler_utbetaling[3] = 10;
18  $kuler_utbetaling[4] = 5;
19
20  $i = 0;
21  $result = mysqli_query($con, "SELECT * FROM daily_exp ORDER BY exp DESC LIMIT 5");
22  while($row_best = mysqli_fetch_assoc($result)) {
23    
24    $acc_id = $row_best['acc_id'];
25
26    $sql = "SELECT * FROM accounts WHERE ID='".$acc_id."'";
27    $query = mysqli_query($con, $sql) or die (mysqli_error());
28    $row_top5 = mysqli_fetch_assoc($query);
29    
30    $result = "UPDATE accounts SET money = (money + ".$cash_utbetaling[$i]."), 
      bullets = (bullets + ".$kuler_utbetaling[$i].")  WHERE ID = ".$acc_id."";
31    mysqli_query($con, $result) or die("Bad query: $result");
32
33    $i++;
34  }

我似乎找不到错误,我在另一个文件中运行相同的代码并且没有问题。

【问题讨论】:

标签: php sql mysqli while-loop


【解决方案1】:

你正在覆盖$result

// This is supposed to be
//  a mysqli_result object ----------v-----v
while($row_best = mysqli_fetch_assoc($result)) 
{
    // some code
    // $result is now a string. Next iteration will raises the warning
    $result = "UPDATE accounts SET ...";
}

因此,您需要为变量指定不同的名称。命名查询 $result 不是最佳选择。


旁注。

您的内部查询容易受到 SQL 注入的攻击。一个应该使用准备好的语句而不是连接字符串。

例如:

// prepare the query
$query = "SELECT * FROM accounts WHERE ID=?";
if ($stmt = mysqli_prepare($con, $query)) {

    // bind the param
    mysqli_stmt_bind_param($stmt, "s", $acc_id);

    // execute the query
    mysqli_stmt_execute($stmt);

    // get the result. Of course, avoir using the same variable name, again :)
    $result = mysqli_stmt_get_result($stmt);
}

有关使用 mysqli 准备语句的更多信息,请阅读official documentation@YourCommonSense 编写的tutorials

【讨论】:

  • mysqli 的官方文档。呸!我更喜欢链接到 YCS 的教程,这是关于 MySQLi 的最正确和最新的在线文档。
  • @Dharman 我不认识他们。如果您认为它们确实比官方文档更好,请编辑我的答案并提供链接
  • 我会把它留在 cmets 中:phpdelusions.net/mysqli/examples
【解决方案2】:

这里的主要问题是您调用 SQL 查询变量的名称与您在 while 循环中使用的结果相同。你在第 30 行用一个字符串覆盖它:

30    $result = "UPDATE accounts SET money = (money + ".$cash_utbetaling[$i]."), 
      bullets = (bullets + ".$kuler_utbetaling[$i].")  WHERE ID = ".$acc_id."";

简单的答案是这是一个错字,但你犯了更多错误。

mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$con = mysqli_connect("localhost", "root", "", "mafioso");
$con->set_charset('utf8mb4');


$cash_utbetaling[0] = 50000000;
$cash_utbetaling[1] = 40000000;
$cash_utbetaling[2] = 30000000;
$cash_utbetaling[3] = 20000000;
$cash_utbetaling[4] = 10000000;
$kuler_utbetaling[0] = 25;
$kuler_utbetaling[1] = 20;
$kuler_utbetaling[2] = 15;
$kuler_utbetaling[3] = 10;
$kuler_utbetaling[4] = 5;
$i = 0;

$result = mysqli_query($con, "SELECT * FROM daily_exp ORDER BY exp DESC LIMIT 5");
$daily_exp = $result->fetch_all(MYSQLI_ASSOC);

// prepare update
$stmt = $con->prepare('UPDATE accounts SET money = (money + ? ), bullets = (bullets + ? ) WHERE ID=?');

foreach ($daily_exp as $row_best) {
    $stmt->bind_param('sss', $cash_utbetaling[$i], $kuler_utbetaling[$i], $row_best['acc_id']);
    $stmt->execute();
    $i++;
}
  1. 您需要启用错误报告而不是使用or die (mysqli_error()),因为缺少参数,这将永远无法工作。
  2. 不要使用 while 循环来检查结果。一次获取所有记录或使用foreach 循环结果要好得多。如果您使用我的建议,那么您很可能会完全避免您的错字。
  3. 您必须使用准备好的语句。在您的代码中,值是整数和常量,但我假设您会在某些时候使用变量输入,这意味着您需要使用占位符和参数。
  4. 循环内的 SELECT 查询没有执行任何操作,因此我将其从答案中删除。
  5. 您应该努力避免 N+1 查询问题。仅在可能的情况下尝试在一个查询中执行相同操作。

【讨论】:

    猜你喜欢
    • 2012-04-21
    • 2022-12-31
    • 2015-04-01
    • 2012-07-06
    • 1970-01-01
    • 2015-10-09
    • 1970-01-01
    • 1970-01-01
    • 2017-10-03
    相关资源
    最近更新 更多