【问题标题】:Reversing mysql_fetch_array()反转 mysql_fetch_array()
【发布时间】:2009-03-30 07:51:06
【问题描述】:
function outputscores($mysqlquery,$reverse=false)
{
    while($row = mysql_fetch_array($mysqlquery))
    {
        echo '<img src="img/date.png" /> ' . date("j M Y",strtotime($row['timestamp'])) . '
        <img src="img/time.png" /> ' . date("H:i:s",strtotime($row['timestamp'])) . '
        <img src="img/star.png" /> '.$row['score'].$_GET["scoretype"].'<br />';
    }
}

如果 $reverse 设置为 true,我需要反转数组,但 PHP 说 mysql_fetch_array 的输出不是有效数组。 $mysqlquery 本身也不是。

有什么帮助吗?

哇,我今天问了这么多问题._.

编辑

$result = mysql_query("SELECT * FROM $gid LIMIT 25") or throwerror(mysql_error());

outputscores($result);

EDIT2 另一个可能的调用:

$result = mysql_query("SELECT * FROM ".$gid.",users WHERE users.lastcheck < ".$gid.".timestamp") or throwerror(mysql_error());

outputscores($result);

【问题讨论】:

  • 您可以根据需要提出尽可能多的问题,这里没有任何限制:)。 (但可以问什么是有限制的)
  • 只是对代码的评论——你真的应该研究安全最佳实践——永远不要将未转义的变量直接传递到 SQL 查询或输出中,你的应用程序将容易受到 SQL/XSS 注入的攻击。

标签: php mysql


【解决方案1】:

编辑:将您的 sql 查询更改为:

$mysqlquery="SELECT * FROM $gid";

把你的函数改成这样:

function outputscores($mysqlquery,$reverse=false)
{
    if ($reverse==true)
        $mysqlquery.=" ORDER BY id DESC LIMIT 25";
    else
        $mysqlQuery.=" LIMIT 25";
    $result=mysql_query($mysqlquery);
    while($row = mysql_fetch_array($result))
    {
       //Do output here
    }
}

在这里,通过添加单词ORDER BY id DESC,您将使记录按表中“id”列的降序排列。通过输入ASC 而不是DESC,您可以让它们按升序排列。此外,您可以将“id”替换为表中的任何其他列,例如timestampscore 等。

编辑:或者,您也可以使用不同的函数将LIMITORDER BY 子句添加到查询中。然后你可以这样做:

$reverse=false;//or true
$mysqlquery=addOrderBy("SELECT * FROM $gid",$reverse);
outputScores($mysqlquery);

【讨论】:

    【解决方案2】:

    您可能正在尝试反转整个结果集,请尝试以下操作:

    function outputscores($mysqlres,$reverse=false)
    {
       $results = array();
       while($row = mysql_fetch_array($mysqlres)){
        print('I found a result: <pre>'.print_r($row, false).'</pre>'); //debugging purposes
        $results[] = $row;
       }
       if($reverse) { $results = array_reverse($results); }
       foreach($results as $row)
       {
        echo '<img src="img/date.png" /> ' . date("j M Y",strtotime($row['timestamp'])) .    '
        <img src="img/time.png" /> ' . date("H:i:s",strtotime($row['timestamp'])) . '
        <img src="img/star.png" /> '.$row['score'].$_GET["scoretype"].'<br />';
      }
    }
    

    哦,是的,正如 soulmerge 所说,您应该为函数提供 mysql 资源而不是实际查询。因此像这样:

    $query = "SELECT field FROM table";
    $res = mysql_query($query);
    output_scores($res, true);
    

    关于您的评论,请确保您的查询实际上正在返回结果,在 phpMyAdmin 或其他东西中对其进行测试,或者像我上面所做的那样在 while 循环中添加一个简单的打印。

    【讨论】:

    • 警告:在第 55 行的 snip 中为 foreach() 提供的参数无效
    • 记录应该在SQL查询本身中反转,循环两次记录并通过PHP反转它们效率不高。
    • @click 点赞。让mysql以相反的顺序返回它们确实会更快。但是,OP 专门要求反转数组。
    • IMO 他不知道可以通过 SQL 反转记录,但我同意,你可能是对的
    • 查询不一定返回结果,所以这是一个问题:/
    【解决方案3】:

    如果我做对了,$mysqlquery 应该是一个 mysql 查询结果,而不是一个数组。有两种情况mysql_fetch_array() 确实返回一个数组:

    1. 要么参数不是查询结果资源(用var_dump($mysqlquery))验证,要么
    2. 根本没有结果(mysql_fetch_array() 返回FALSE)。

    我希望您没有将查询本身传递给mysql_fetch_array(),正如变量名称所暗示的那样。您必须先调用mysql_query(),然后才能获取任何内容。

    可以通过获取所有行并调用array_reverse() 来完成反转本身。示例:

    $rows = array();
    while ($row = mysql_fetch_array($result)) {
        $rows[] = $row;
    }
    array_reverse($rows);
    

    【讨论】:

      猜你喜欢
      • 2012-02-18
      • 2012-05-18
      • 2011-07-16
      • 1970-01-01
      • 2010-12-04
      • 2014-11-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多