MYSQLI Prepared statement update statement with where in array

Posted

技术标签:

【中文标题】MYSQLI Prepared statement update statement with where in array【英文标题】: 【发布时间】:2021-05-24 13:56:53 【问题描述】:

我设法创建了一个准备好的语句,它使用 mysqli 准备好的语句和包含数组的 Where IN 语句更新 SQL 数据库表中的硬编码值。

我需要更新表 resetstatsstats_accid 列,基于变量 $arrayresetname 中获取的名称,使用表帐户中的值 $arrayresetid,这些名称存储在表 @987654326 的 username 列中@。

这是我的代码:

if ($totalacc > 0) 
    $in7 = str_repeat('?,', count($arrayidc) - 1) . '?';
    $types7 = str_repeat('s', count($arrayidc));
    $sql7 = "SELECT email,name,group_name,id FROM account WHERE name IN ($in7) AND NOT group_name = 'test'";
    $stmt7 = $mysqli->prepare($sql7);
    $stmt7->bind_param($types7, ...$arrayidc);
    $stmt7->execute();
    $result7 = $stmt7->get_result();
    while ($rowid7 = $result7->fetch_assoc()) 
        $arrayresetid = $rowid7['id'];
        $arrayresetname = $rowid7['name'];
        $arrayresetnamereplace = str_replace(" (resetted)", "", $arrayresetname);
        $arraynamereset[] = $arrayresetnamereplace;
    

    if ($stmt7 == true) 
        $in9 = str_repeat('?,', count($arraynamereset) - 1) . '?';
        $sql9 = "UPDATE resetstats SET statsfriendly = 1,stats_accid = ? WHERE username IN ($in9) ";
        $stmt9 = $mysqli->prepare($sql9);
        $arraynamereset[] = $arrayresetid;
        $stmt9->bind_param(str_repeat('s', count($arraynamereset)), ...$arraynamereset);
        $stmt9->execute();
        $stmt9->close();
    

示例数据表帐户:

id | name
865 | test name a
876 | test name b
888 | test name c

示例数据表 resetstats(更新前!):

statsid | username | statsfriendly | stats_accid
2 | test name a | 0 | 0
3 | test name b | 0 | 0
4 | test name c | 0 | 0

示例数据表 resetstats(更新后的预期输出!):

statsid | username | statsfriendly | stats_accid
2 | test name a | 1 | 865 
3 | test name b | 1 | 876 
4 | test name c | 1 | 888

【问题讨论】:

问题出在哪里还不是很清楚。也许如果您在一小部分数据上展示了您想要做什么? 我需要在这个准备好的语句中使用一个变量。更新 resetstats SET statsfriendly = 1,stats_accid = ? WHERE 用户名 IN ($in9) 。我现在使用的变量不是从表 resetstats 中的表帐户更新 ID。我不知道如何从中做一个例子? 如果您打开 mysqli 错误处理,您可能会发现最后一个 bind_param 失败,因为您提供的参数数量与查询中 ?s 的数量不匹配。我想你忘记了stats_accid = ? 参数。或者你可能没有忘记它,但你把它放在$arraynamereset 的末尾而不是它需要的开头。我猜$arraynamereset[] = $arrayresetid; 应该添加那个参数?所以实际上错误可能是 SQL 中的类型不匹配错误。而且它只会使用$arrayresetid的最后一个值! 你为什么要用两个查询来做这个?您可以使用与account 表连接的UPDATE 查询来做到这一点。 $arrayresetid 只是 SELECT 查询返回的最后一行的 ID。您的 UPDATE 会将每个人的 stats_id 设置为相同的 ID。 【参考方案1】:

您应该使用单个查询来完成此操作。

UPDATE resetstats AS r
JOIN account AS a ON r.username = REPLACE(a.name, ' (resetted)', '')
SET r.statsfriendly = 1, r.stats_id = a.id
WHERE a.name IN ($in7)

【讨论】:

谢谢!从来不知道sql可以这样!

以上是关于MYSQLI Prepared statement update statement with where in array的主要内容,如果未能解决你的问题,请参考以下文章

致命错误:未捕获的异常 'mysqli_sql_exception' 带有消息 'No index used in query/prepared statement'

为啥 MySQLi 库本身不支持命名参数?

Prepared SQL Statement Syntax

PDO vs MYSQLI,Prepared Statemens 和绑定参数

具有多个连接的 mysqli Prepared 语句不断返回 false [关闭]

使用 Prepared Statement 设置 LONG 数据类型