【发布时间】:2022-11-24 04:07:22
【问题描述】:
我从 2 个不同的 WordPress 表中提取数据并循环获取适当的数据到表行中。
$tid = $_POST['pqrnum']; //get estimate number
$results = $wpdb->get_results('SELECT * FROM eqnum WHERE id='.$tid); //getting estimate data
$pArray = explode(',', $results[0]->pnum); //creating array of product numbers in estimate
$ptable = "<table>"; //create table
$presults = $wpdb->get_results('SELECT * FROM eparts'); //getting product data
$pres= count($presults); //products array count
for($l = 0; $l <=count($pArray); $l++){ //loop through each product in the array
$item = $pArray[$l]; //getting item number start 0
$titem = $item + 1; //adding 1 to $item without disturbing it because product array starts at 1
for ($x = 1; $x <= $pres; $x++) { //looping through product array
if($titem == $presults[$x-1]->id){ // if estimate item = product number
$ptable .= "<tr><td>item num ". $titem ." presults id ".$presults[$x-1]->id." presults name ".$presults[$x-1]->name."</td></tr>";
}
}
}
$ptable .= "</table>";
不知道为什么,但它似乎打印了额外的一行,在这个特定的例子中应该有 3 行,但这是响应:
项目编号 1 个结果 ID 1 个结果名称 备份警报
item num 10 presults id 10 presults name 机油滤清器
item num 11 结果 id 11 结果名称 Spark Plug
项目编号 1 个结果 ID 1 个结果名称 备份警报
如您所见,第一行和最后一行是相同的,它应该只是前 3 行,而不是前 4 行。 只是想确定为什么额外的行,任何帮助表示赞赏。
【问题讨论】:
-
count()返回数组中的项数,但您从零开始计数,因此您需要<而不是<=。教科书差一个错误。 :) -
虽然与您的问题无关,但 WordPress 的 wpdb 类具有辅助方法来保护您的代码免受注入。根据您提供的内容,您可以使用
$wpdb->get_var($wpdb->prepare("SELECT pnum FROM eqnum WHERE id=%d", $tid));安全地获取该单列值。 -
总的来说,我似乎完全看不出你为什么关心循环索引?对于
$results,它实际上是任意的(尽管是从零开始的),因为它是即时完成的,而且您的所有产品无论如何都有 ID,所以这无关紧要。据我所知,您实际上应该可以使用foreach。 -
此外,您不需要在第二次查询中获取所有产品,您可以只获取与您的第一个查询相关的产品,此代码与一些保护一起执行:3v4l.org/YrObo
-
扩展@ChrisHaas 的评论,如果您有一个索引数组并且确实需要索引,您可能会发现像
foreach ($items as $index => $item) { ... }这样的操作不太容易出错。 (并且不会在每次迭代时产生调用count()的开销。)