0

使用 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 次,但最终它开始很好地坚持下去。这是我的第一个问题……谢谢乔恩。

4

2 回答 2

0

由于您的查询中没有ORDER BY子句,因此结果集未按定义排序。它可能有排序,但这不能保证。

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

ORDER BY something子句附加到查询后,您可以进一步附加ASCDESC控制排序方向并将喜欢的行推到顶部(例如ORDER BY something DESC)。(这使得“最后一行是第一行”或“第一行是最后一行”。)

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

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

于 2014-03-21T18:21:15.507 回答
-1

使用 fetch() 仅选择一条记录

/core/model.php

@select 表中的值

@访问公共

@param string $table 表名

@param 字符串 $fieldname

@param 字符串 $id

@return 成功时将特定行作为对象返回,失败时抛出 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 */ }

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

于 2014-04-05T01:50:09.850 回答