Php 在while循环中移动foreach循环未按预期方式工作

Php 在while循环中移动foreach循环未按预期方式工作,php,foreach,while-loop,Php,Foreach,While Loop,我需要一些关于如何正确完成这一切的帮助和说明,因为看起来我做得不对,而且不是最理想的方式,所以浪费了我的服务器资源 这是我的代码,它可以工作,但我认为如果将foreach放在while循环中,而不是像这样包装它,它可以优化以获得更快的性能: $link_id = explode(',', $ref_links_id); foreach($link_id as $key => $value){ $additional_links_query = 'SELECT * F

我需要一些关于如何正确完成这一切的帮助和说明,因为看起来我做得不对,而且不是最理想的方式,所以浪费了我的服务器资源

这是我的代码,它可以工作,但我认为如果将
foreach
放在
while
循环中,而不是像这样包装它,它可以优化以获得更快的性能:

$link_id = explode(',', $ref_links_id);
    foreach($link_id as $key => $value){
        $additional_links_query = 'SELECT * FROM additional_links WHERE id = '.$value.' ORDER BY ID asc';
        $res = $db->prepare($additional_links_query);
        $res->execute();
        while ($info = $res -> fetch()){
            $li_text = ($info['_ad_text'] == NULL)? '' : ' - '.$info['_ad_text'];
            $li_target = ($info['_ad_url_target'] == NULL)? '' : ' target="'.$info['_ad_url_target'].'"' ;
            $li_nofollow = ($info['_ad_nofollow'] == 1)? ' rel="nofollow"' : '';
            $li_cont = '<li><a href="'.$info['_ad_url'].'"'.$li_target.$li_nofollow.'>'.$info['_ad_anchor'].'</a>'.$li_text.'</li>';
        print<<<END
        $li_cont\n
        END;
    }
}
$link\u id=explode(“,”,$ref\u links\u id);
foreach($key=>$value的链接id){
$additional_links_query='SELECT*FROM additional_links,其中id='。$value.'ORDER BY id asc';
$res=$db->prepare($additional\u links\u query);
$res->execute();
而($info=$res->fetch()){
$LIU text=($info[''广告文本']==NULL)?'':'-'.$info[''广告文本'];
$li_target=($info[''u ad_url_target']==NULL)?“'target=“”。$info[''u ad_url_target'].””;
$li_nofollow=($info[''ad_nofollow']==1)?'rel=“nofollow”“:'';
$li_cont=“
  • ”。$li_text.“
  • ”; 打印注释行

    $res->execute();
    

    因为您正在尝试执行并获取..

    您已经在使用一个准备好的语句,所以您最好在注入数据库之前绑定数据:

    $additional_links_query = 'SELECT * FROM additional_links WHERE id = :value ORDER BY ID asc';
    $res->bindValue(':value',$amount);
    $res = $db->prepare($additional_links_query);
    $res->execute();
    
    如果您不想直接遍历结果,可以执行
    PDO::FETCH_ASSOC
    。当然,这将返回一个关联数组,您将不得不在以后解析该数组

    $res->fetch(PDO::FETCH_ASSOC);
    print_r($res);
    

    如果我理解正确,您需要从代码中删除一个
    foreach
    while
    循环

    请参阅我从PHP中删除的
    foreach
    代码,并将
    中的
    命令添加到SQL查询中:

    $additional_links_query = 'SELECT * FROM additional_links WHERE id IN ('.implode(",", $ref_links_id).') ORDER BY ID asc';
    $res = $db->prepare($additional_links_query);
    $res->execute();
    while ($info = $res -> fetch()){
        $li_text = ($info['_ad_text'] == NULL)? '' : ' - '.$info['_ad_text'];
        $li_target = ($info['_ad_url_target'] == NULL)? '' : ' target="'.$info['_ad_url_target'].'"' ;
        $li_nofollow = ($info['_ad_nofollow'] == 1)? ' rel="nofollow"' : '';
        $li_cont = '<li><a href="'.$info['_ad_url'].'"'.$li_target.$li_nofollow.'>'.$info['_ad_anchor'].'</a>'.$li_text.'</li>';
    print<<<END
    $li_cont\n
    END;
    
    $additional\u links\u query='SELECT*从id位于('.infrade(“,”,$ref\u links\u id.))中的附加链接按id排序asc';
    $res=$db->prepare($additional\u links\u query);
    $res->execute();
    而($info=$res->fetch()){
    $LIU text=($info[''广告文本']==NULL)?'':'-'.$info[''广告文本'];
    $li_target=($info[''u ad_url_target']==NULL)?“'target=“”。$info[''u ad_url_target'].””;
    $li_nofollow=($info[''ad_nofollow']==1)?'rel=“nofollow”“:'';
    $li_cont=“
  • ”。$li_text.“
  • ”;
    print看起来您可以在一个查询中完成这项工作,也可以使用以下方法正确使用MySQLI:

    $ref\u links\u arr=分解(',',$ref\u links\u id);
    //我们需要一系列参数占位符,例如?,?,?
    //每个参考链接id一个,将在
    //在in()子句列表中作为占位符查询。
    $ref_links_params=内爆(“,”,数组填充(0,计数($ref_links_arr),“?”);
    //使用IN(),请参阅下面的链接以获取MySQL手动条目。
    $additional\u links\u query=”
    选择*
    从其他链接
    其中id为($ref_links_参数)
    按ID订购asc
    ";
    $res=$db->prepare($additional\u links\u query);
    $res->execute();
    //在这里,我们将用替换每个?占位符
    //$ref\u links\u arr中相应的ref\u link\u id。
    而($ref\u link\u id=array\u shift($ref\u links\u arr)){
    //“i”表示“整数”,因此如果您的id字段为
    //字符串,使用“s”
    $res->bind_参数(“i”,$ref_links_id);
    }
    而($info=$res->fetch()){
    $LIU text=($info[''广告文本']==NULL)?'':'-'.$info[''广告文本'];
    $li_target=($info[''u ad_url_target']==NULL)?“'target=“”。$info[''u ad_url_target'].””;
    $li_nofollow=($info[''ad_nofollow']==1)?'rel=“nofollow”“:'';
    $li_cont=“
  • ”。$li_text.“
  • ”; 打印“$LIU cont\n”; }

    问题是$ref\u links\u id是一个数组,它不会像那样工作。我实际上需要的是在while循环中移动foreach,而不是在forach循环中移动foreach。好的,我将
    $ref\u links\u id
    更改为
    内爆(,,,,$ref\u links\u id)
    IN()
    需要
    ()
    围绕值列表。还要注意,如果值是字符串,这将失败,
    'A,B,C'
    将需要
    在集合中查找(id,'A,B,C')
    。@AlexB不会被通知您的问题,除非您在注释中使用
    @AlexB
    进行通知。
    $ref_links_arr = explode(',', $ref_links_id);
    
    // We need a series of parameter placeholders, e.g., ?,?,?
    // One for each ref_link_id, which will be used in the
    // query as placeholders in the IN() clause list.
    $ref_links_params = implode(',', array_fill(0, count($ref_links_arr ), '?'));
    
    // Using IN(), see the links below for the MySQL manual entry.
    $additional_links_query = "
    SELECT * 
    FROM additional_links 
    WHERE id IN($ref_links_params) 
    ORDER BY ID asc
    ";
    
    $res = $db->prepare($additional_links_query);
    $res->execute();
    
    // Here, we're going to replace each ? placeholder with
    // a corresponding ref_link_id from $ref_links_arr.
    while ($ref_link_id = array_shift($ref_links_arr)) {
        // "i" is for "integer", so if your id field is
        // string, use "s"
        $res->bind_param("i", $ref_links_id);
    }
    
    while ($info = $res->fetch()){
        $li_text = ($info['_ad_text'] == NULL)? '' : ' - '.$info['_ad_text'];
        $li_target = ($info['_ad_url_target'] == NULL)? '' : ' target="'.$info['_ad_url_target'].'"';
        $li_nofollow = ($info['_ad_nofollow'] == 1)? ' rel="nofollow"' : '';
        $li_cont = '<li><a href="'.$info['_ad_url'].'"'.$li_target.$li_nofollow.'>'.$info['_ad_anchor'].'</a>'.$li_text.'</li>';
    
        print "$li_cont\n";
    }