【问题标题】:PDO use Fetch to get the first row from a query (without using FetchAll first?)PDO 使用 Fetch 从查询中获取第一行(不先使用 FetchAll?)
【发布时间】:2014-04-28 16:34:09
【问题描述】:

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

【问题讨论】:

  • 试试SELECT * FROM games_database WHERE player2_id=? AND whose_turn=? LIMIT 1。然后使用fetch()
  • 感谢今晚尝试 LIMIT 1...

标签: pdo row fetch fetchall


【解决方案1】:

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

/core/model.php

@从表中选择值

@access 公开

@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 */ }

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

【讨论】:

  • 请不要使用这样的功能
  • 你能解释一下为什么吗?
  • 可能的原因。您立即使此功能不安全且不灵活。这样的函数应该只接受两个参数 - 一个查询和一个包含数据的数组以执行
  • 核心/模型中只有1个功能。
  • 那又怎样?它并没有让它变得更好
【解决方案2】:

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

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

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

那么你可以(并且应该)LIMIT 你的结果集为一行,因为你只想要一行。因此,将 LIMIT 1 附加到您的查询中,以准确检索您想要的行。

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

【讨论】:

  • 感谢今晚将尝试使用 LIMIT 1...以及使用 ORDER 的其他想法...非常感谢您抽出宝贵时间提供帮助。
猜你喜欢
  • 1970-01-01
  • 2018-11-14
  • 2014-11-19
  • 2014-11-05
  • 2011-02-15
  • 1970-01-01
  • 2012-08-19
  • 2021-11-26
  • 1970-01-01
相关资源
最近更新 更多