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";
}