【问题标题】:mysql_fetch_array and array keysmysql_fetch_array 和数组键
【发布时间】:2011-08-29 12:01:46
【问题描述】:

此代码有效:

$row = array(5,6,89,97,101);
$found = array();
$post = 89;
$count_row = count($row);
for($i = 0; $i < $count_row; $i++){
    if($row[$i]==$post){
        $found[] = $row[$i-2];
        $found[] = $row[$i-1];
        $found[] = $row[$i];
        $found[] = $row[$i+1];
        $found[] = $row[$i+2];
        var_dump($found);
    }
}

这并没有,可能在 mysql_fetch_array 中做错了;

$found = array();
        $q = "SELECT object_id FROM wp_term_relationships WHERE term_taxonomy_id='$term_tax_id'";
        $rs = mysql_query($q) or die(mysql_error());
        $row = mysql_fetch_array($rs, MYSQL_NUM);
        $count_row = count($row);
        for($i = 0; $i < $count_row; $i++){
        print_r($row);
            if($row[$i]==$post){
                $found[] = $row[$i-2];
                $found[] = $row[$i-1];
                $found[] = $row[$i];
                $found[] = $row[$i+1];
                $found[] = $row[$i+2];
                var_dump($found);
            }
        }

如果帖子大于 1,则不显示任何内容。 有谁知道解决这个问题的方法吗?

【问题讨论】:

  • 试试print_r($row):输出是什么?更多:在第二个示例中,我没有看到 $found 和 $post 初始化...
  • 请定义“不起作用”?
  • 所以,您的查询是错误的,或者没有返回您所期望的我认为...如果您希望我们帮助您,请向我们展示一些代码!!!
  • @Marco 添加了查询,查询有效,我用 while 循环并检查了它。
  • 任何时候循环的主体都是if 语句,这都是一种浪费,尤其是当if 的主体只会被输入一次时。如果您只对 5 条记录感兴趣,请仅获取这 5 条记录。

标签: php mysql arrays loops


【解决方案1】:

mysql_fetch_array() 获取一行,在您的情况下,它恰好包含一列。

您应该一次查询结果集中的所有行(我不知道它是如何工作的),或者您应该这样做:

$q = "SELECT object_id FROM wp_term_relationships WHERE term_taxonomy_id='$term_tax_id'";
$rs = mysql_query($q) or die(mysql_error());
$data = array();
while ($row = mysql_fetch_array($rs, MYSQL_NUM)) {
    $data[] = $row[0];
}
for($i = 2; $i < count($data) - 2; $i++){ // adjusted boundaries
    if($data[$i]==$post){
        $found[] = $data[$i-2];
        $found[] = $data[$i-1];
        $found[] = $data[$i];
        $found[] = $data[$i+1];
        $found[] = $data[$i+2];
        var_dump($found);
    }
}

}

我也调整了边界:如果你对$i-2$i+2 的范围感兴趣,你应该只从2end-2 运行。

【讨论】:

  • 代码的工作方式几乎与我想要的一样。如果帖子少于 4 则不显示任何内容。您知道如何解决此问题吗?
  • 不要调整边界,而是在循环内进行边界检查,因此如果您在 $i == 0,请不要添加 $data[$i-2]$data[$i-1] 等。
【解决方案2】:

应该重写 select 语句,以便只返回您正在寻找的值。一种方法是使用两个选择的UNION,一个返回较小的对象 ID,一个返回较大的对象 ID。您还应该使用 WordPress 的 wpdb 类。一方面,站点管理员可以将表前缀从“wp_”更改为其他内容; $wpdb-&gt;term_relationships 将为表提供正确的名称。

$statement = $wpdb->prepare(
   "  (SELECT object_id 
        FROM $wpdb->term_relationships 
        WHERE term_taxonomy_id= %d 
          AND object_id <= %d
        ORDER BY object_id DESC 
        LIMIT 3)
    UNION
      (SELECT object_id 
        FROM $wpdb->term_relationships 
        WHERE term_taxonomy_id= %d
          AND object_id > %d
        ORDER BY object_id ASC 
        LIMIT 2)
      ORDER BY object_id", $term_tax_id, $post, $term_tax_id, $post);
$found = $wpdb->get_results($statement);

这还具有在中心之前或之后少于两个术语关系(ID为$post的对象)时工作的优势。

【讨论】:

  • 它似乎工作,但我如何循环它们?谢谢!我试过echo $found[0]['object_id'];
  • 不需要循环来构建结果数组。 wpdb::get_results 将所有结果作为数组返回。默认情况下,此数组中的项目是对象。将get_results 的第二个参数设置为文档中提到的不同项目类型的常量之一。在此特定示例中,您可以改用 wpdb::get_col
  • 感谢您的帮助,非常感谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-08
  • 1970-01-01
  • 1970-01-01
  • 2020-09-28
  • 2011-01-09
相关资源
最近更新 更多