mysqli_fetch_assoc() 期望参数 1 为 mysqli_result,while 循环中给出的字符串
mysqli_fetch_assoc() expects parameter 1 to be mysqli_result, string given in while-loop
我目前有这段代码,但它给我错误 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 }
我似乎找不到错误,我是 运行 另一个文件中的相同代码,没有问题。
您正在覆盖 $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 ...";
}
所以你需要给你的变量起不同的名字。命名一个 query $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 or the tutorials written by @YourCommonSense
这里的主要问题是您将 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++;
}
- 您需要启用错误报告,而不是使用
or die (mysqli_error())
,因为缺少参数,这将永远行不通。
- 不要使用 while 循环遍历结果。一次获取所有记录或使用
foreach
循环结果要好得多。如果你采纳了我的建议,那么你很可能会完全避免输入错误。
- 您必须使用准备好的语句。在您的代码中,值是整数和常量,但我假设您会在某些时候使用变量输入,这意味着您需要使用占位符和参数。
- 循环内的 SELECT 查询没有执行任何操作,因此我将其从答案中删除。
- 你应该努力避免N+1查询问题。仅在可能的情况下尝试在一个查询中执行相同的操作。
我目前有这段代码,但它给我错误 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 }
我似乎找不到错误,我是 运行 另一个文件中的相同代码,没有问题。
您正在覆盖 $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 ...";
}
所以你需要给你的变量起不同的名字。命名一个 query $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 or the tutorials written by @YourCommonSense
这里的主要问题是您将 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++;
}
- 您需要启用错误报告,而不是使用
or die (mysqli_error())
,因为缺少参数,这将永远行不通。 - 不要使用 while 循环遍历结果。一次获取所有记录或使用
foreach
循环结果要好得多。如果你采纳了我的建议,那么你很可能会完全避免输入错误。 - 您必须使用准备好的语句。在您的代码中,值是整数和常量,但我假设您会在某些时候使用变量输入,这意味着您需要使用占位符和参数。
- 循环内的 SELECT 查询没有执行任何操作,因此我将其从答案中删除。
- 你应该努力避免N+1查询问题。仅在可能的情况下尝试在一个查询中执行相同的操作。