PHP 8中出现的“TypeError: implode(): Argument #2 ($array) must be of type ?array, string given”错误

3
<div class="form-group col-md-8" id="my" style="display: none;">
    <label>Choose Vpn Server</label>
    <div class="row">
        <?php
            $sqlUrl4 = "SELECT * FROM vpn_networks";
            $result4 = myQuery($sqlUrl4);

            while ($row4 = myFetchArray($result4)) {
        ?>
        <div class="col-sm-4 text-center">
            <label>
                <input type="checkbox" name="vpn_network[]" value="<?php echo $row4['id'];?>" id="iptv" />
                <?php echo $row4['title'];?>
            </label>
        </div>
        <?php
                    }
                ?>
    </div>
</div>

$vpn1 =implode(',', $_POST['vpn_network']?? '');

错误:

Fatal error: Uncaught TypeError: implode(): Argument #2 ($array) must
be of type ?array, string given in
C:\xampp\htdocs\ideology\partnerprocess.php:22 Stack trace: #0
C:\xampp\htdocs\ideology\partnerprocess.php(22): implode(',', '') #1
{main} thrown in C:\xampp\htdocs\ideology\partnerprocess.php on line
22

你的 $_POST['vpn_network'] 是数组还是字符串? - Fikfattt
4
'' 绝对不是一个数组,这就是为什么您会收到错误信息“...必须是数组类型,而不是字符串...”,同时请确保 $_POST['vpn_network'] 是一个数组。作为快速解决方案:将 '' 改为 [] - Definitely not Rafal
是的,这是一个数组。 - Muhammad Yahya Imran
执行 "print_r($_POST['vpn_network'])" 并在此处发布结果 - emandt
print_r 不起作用。 - Muhammad Yahya Imran
Passing parameters to implode() in reverse order is deprecated - NVRM
3个回答

7

$_POST['vpn_network'] ?? '' 的意思是该值既可以是您提交的数组,也可以是字符串。更好的做法是使用 $_POST['vpn_network'] ?? []

您真的不应该信任表单中提交的值。请检查每个假设。如果您期望一个数组,则检查它是否为数组。

$vpn_network = isset($_POST['vpn_network']) && is_array($_POST['vpn_network']) ? $_POST['vpn_network'] : [];
$vpn1 =implode(',', $vpn_network);

你也可以使用 过滤器扩展。它提供了许多过滤器,可以验证来自表单的数据。

7
传统签名(自 PHP 7.4.0 起已弃用,自 PHP 8.0.0 起已移除):
implode(array $array, string $separator): string

使用这个代替:
 implode(string $separator, array $array): string

来源:https://www.php.net/manual/zh/function.implode.php

1
这样一个优雅的回答,直截了当地解决了我在传统应用程序中遇到的问题!谢谢! - bizna

1

1
请分享更多关于如何解决问题的细节。错误信息已经告诉我们第二个参数必须是一个数组,而仅仅将文档链接作为解决问题的唯一部分并不是在StackOverflow上回答问题的好方法。 - Nico Haase
虽然这个链接可能回答了问题,但最好在此处包含答案的基本部分并提供参考链接。如果链接页面更改,仅有链接的答案可能会失效。-【来自审查】 - Simas Joneliunas
我给出了答案,但方式不对... - Thanasis

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接