使用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。
答案 0 :(得分:0)
由于查询中没有ORDER BY
子句,因此根据定义,结果集未排序。 可能进行排序,但这不能保证。
由于您显然想要“第一”而不是“最后”行,您希望按某种方式排序,因此您应该指定所需的排序,以便数据库实际对结果集进行排序。
只要在查询中附加了ORDER BY something
子句,就可以进一步追加ASC
或DESC
来控制排序方向,并将喜欢的行推送到顶部(例如ORDER BY something DESC
)。 (这使“最后一行成为第一行”或“第一行成为最后一行”。)
然后您可以(并且应该)LIMIT
将结果集设置为一行,因为您只需要一行。因此,请在查询中附加LIMIT 1
,以准确检索所需的行。
您现在可以使用fetch()
来请求第一行(也是唯一一行),这是您想要的那一行。
答案 1 :(得分:-1)
<强> /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 */ }
但是,如果表或字段名称无效,则可以捕获任何错误。