PDO使用Fetch从查询中获取第一行(不首先使用FetchAll?)

时间:2014-03-21 10:45:08

标签: pdo row fetch fetchall

使用PHP,PDO查询我的游戏数据库,以检索可加入的游戏。如果我使用Fetch,它将返回符合条件的最后一行。我想要第一行,所以我目前正在使用FetchAll,然后查看检索到的第一行。有没有办法使用Fetch并告诉它只是获取第一行。使用FetchAll似乎收集了比我要求的更多的数据。

我对这一切都很陌生(通过交易动画制作工具),但是我已经了解了旧的mysql,现在我已经转向使用PDO了,看起来很棒。慢慢构建一个有效的异步游戏服务器。

这是我的代码,但是如果我没有使用FetchAll,我想知道它是否会更有效率。

       //Set variables to use when searching for random game in table
       $player2_id = 0; //if 0 then player 2 slot has not been filled.
       $whose_turn = 2;  //if 2 then its player twos go...so good to join.


        //IS THERE A RANDOM GAME TO JOIN 
        $current_game = $db->prepare("SELECT * FROM games_database WHERE player2_id=? AND whose_turn=?");
        $current_game->execute(array($player_2_id, $whose_turn));

        //Fetch All the results
        $random_game_to_use = $current_game->fetchAll(PDO::FETCH_ASSOC);

        //Get the first of all the results
        $firstAvailableGame = $random_game_to_use[0];
        $rand_game_name = $firstAvailableGame['game_name'];

我希望这是有道理的。我们将非常感激任何帮助或珍珠的智慧。还想说Stackoverflow在我学习PHP和PDO数据库查询编码方面一直是一个非常有用的网站。我可能已经尝试过在我的生活中学习大约4次代码,但最后它开始很好地坚持下去。这是我的第一个问题......感谢Jon。

2 个答案:

答案 0 :(得分:0)

由于查询中没有ORDER BY子句,因此根据定义,结果集未排序。 可能进行排序,但这不能保证。

由于您显然想要“第一”而不是“最后”行,您希望按某种方式排序,因此您应该指定所需的排序,以便数据库实际对结果集进行排序。

只要在查询中附加了ORDER BY something子句,就可以进一步追加ASCDESC来控制排序方向,并将喜欢的行推送到顶部(例如ORDER BY something DESC)。 (这使“最后一行成为第一行”或“第一行成为最后一行”。)

然后您可以(并且应该)LIMIT将结果集设置为一行,因为您只需要一行。因此,请在查询中附加LIMIT 1,以准确检索所需的行。

您现在可以使用fetch()来请求第一行(也是唯一一行),这是您想要的那一行。

答案 1 :(得分:-1)

仅使用fetch()

选择一条记录

<强> /core/model.php

@select table from table

@access public

@param string $ table表的名称

@param string $ fieldname

@param string $ id

@retound将特定行作为成功对象返回,或者在失败时抛出PDOException

@warn:仅选择列中的唯一值

public function dbSelectOne($table, $fieldname=null, $id=null)
{
$this->conn();
$sql = "SELECT * FROM `$table` WHERE `$fieldname`=:id";
$stmt = $this->db->prepare($sql);
$stmt->bindParam(':id', $id);
$stmt->execute();
return $stmt->fetch(PDO::FETCH_OBJ);
}

示例:

$client = $this->pdo->dbSelectOne('clients', 'id_client', $id );
echo $client->name;

注意:如果找不到记录,您必须进行验证。

try {} catch {} 对空对象无用,因为pdo没有抛出任何错误。

if(empty($client)){ /* do something */ }

但是,如果表或字段名称无效,则可以捕获任何错误。