【问题标题】:Construct http_build_query with PDO and Select使用 PDO 构造 http_build_query 并选择
【发布时间】:2022-01-17 13:52:39
【问题描述】:

我正在尝试创建一个 http_build_query 数组,但它插入了一些不同的字符,这是我的代码:

function Conectar(){
    try{
        $opcoes = array(PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES UTF8');
        $con = new PDO("mysql:host=localhost; dbname=*****;", "*****", "*****", $opcoes);
        $con->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

        return $con;
    } catch (Exception $e){
        echo 'Erro: '.$e->getMessage();
        return null;
    }
}

$pdo = Conectar();

    $sql = "
    SELECT dominio 
    FROM dominios_extraidos 
    WHERE verificado='0' LIMIT 3
    ";

    $stm = $pdo->prepare($sql);
    $stm->execute();

while ($rows = $stm->fetch()) {
    $query = http_build_query(array(
        'domains' => array(
            ''.$rows['dominio'].'',
        )
    ));
    
    
    print_r($query);
    }

创建此输出:

domains%5B0%5D=0002021web.com.br%0Adomains%5B0%5D=007import.com.br%0Adomains%5B0%5D=00pet.com.br%0A

但这是我想要的输出:

domains%5B0%5D=0002021web.com.br&domains%5B1%5D=007import.com.br&domains%5B2%5D=00pet.com.br

可以使用此代码手动生成我想要的输出:

$query = http_build_query(array(
        'domains' => array(
            '0002021web.com.br',
            '007import.com.br',
            '00pet.com.br',
        )
    ));
    
    
    print_r($query);

感谢您的宝贵时间:)

【问题讨论】:

  • 您每次都在覆盖查询。首先建立你的数组,然后使用 http_build_query
  • 为什么有''.%0A 是一个 URL 编码的新行,可能来自那些附加的虚无。
  • 嗨@user3783243 感谢您抽出宝贵时间,您的意思是这部分:''.$rows['dominio'].''?
  • 您好@aynber,感谢您抽出宝贵时间,对,我必须继续在 foreach 中打印 http_build_query 吗?
  • 不,不要在 foreach 中打印 http_build_query。在尝试构建查询之前构建整个数组

标签: php mysql arrays


【解决方案1】:

您想先正确构建数组,使其看起来像您的手动数组,然后使用 http_build_query:

$domains = ['domains' => []];
while ($rows = $stm->fetch()) {
    $domains['domains'][] = trim($rows['dominio']);
}

$query = http_build_query($domains);
print_r($query);

【讨论】:

  • 嘿,谢谢你的回答,但输出与我想要的输出不同,这是我从你的代码中得到的输出:domains%5B0%5D=0002021web.com.br%0A&domains%5B1 %5D=007import.com.br%0A&domains%5B2%5D=00pet.com.br%0A
  • 我已对其进行了更新以修剪数据库结果,这应该会删除换行符。
【解决方案2】:

在循环中创建一个域数组,然后在循环完成后将其作为参数传递给http_build_query()

while ($rows = $stm->fetch()) {
    $doms[] = trim($rows['dominio']);
}

$query = http_build_query( ['domains' => $doms] );
    
print_r($query);

这会产生

domains%5B0%5D=0002021web.com.br%0A&domains%5B1%5D=007import.com.br%0A&domains%5B2%5D=00pet.com.br%0A

相当于

domains[0]=0002021web.com.br
&domains[1]=007import.com.br
&domains[2]=00pet.com.br

【讨论】:

  • 嘿,RiggsFolly 感谢您的回答,但输出与我想要的输出不同,这是我从您的代码中获得的输出:domains%5B0%5D=0002021web.com.br%0A&domains% 5B1%5D=007import.com.br%0A&domains%5B2%5D=00pet.com.br%0A
  • 嗯,我必须像这样创建相同的输出:domains%5B0%5D=0002021web.com.br&domains%5B1%5D=007import.com.br&domains%5B2%5D=00pet.com.br能够使用 API,并且每次调用都会有 1000 个域...你能帮我推荐一些吗?
  • 我认为您必须在数据库列中有换行符?? trim() 应该删除那个 [GIGO] :)
  • 好点,去看看,非常感谢 RiggsFolly !!! :)
【解决方案3】:

0A 解码为\n 或换行; 也许先尝试消毒

$query= trim($query, "\x00..\x20\x7F");

此代码将 ASCII 字符从 00 删除到 20 hex 和 7f hex

【讨论】:

  • OP 应该真正确定新行的来源,而不是为其添加创可贴。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-07-24
  • 1970-01-01
  • 2013-01-14
  • 1970-01-01
  • 2020-01-15
  • 1970-01-01
相关资源
最近更新 更多