【问题标题】:PHP PDO how do i include fetch assoc and numrowsPHP PDO 我如何包含 fetch assoc 和 numrows
【发布时间】:2012-09-01 17:22:18
【问题描述】:

试图将我所有旧的 mysql_* 操作转换为新的,并且据我所知,改进了 PDO,但是这个查询似乎不会成功运行,我试图从用户名 = 的表 PEOPLE 中选择所有$username(之前声明为$username = $_SESSION['username'];

$query = "SELECT  * FROM people WHERE username=?";
$stmt = $conn->prepare($query);
$stmt->bindParam(1, $username);   
$stmt->execute();
$num_rows = $stmt->fetchColumn();

if ($num_rows == 1) {
    // ...
}

工作代码是:

$query = "SELECT  * FROM people 
             WHERE username=?";
$stmt = $conn->prepare($query);
$stmt->bindParam(1, $username);   
$stmt->execute();
$num_rows = $stmt->fetchColumn();
$user = $stmt->fetchObject();

if ($user) {

//do something

}

【问题讨论】:

  • 我建议,在这种情况下,LIMIT 1 在您的查询结束时。您知道您将拥有 1 个或 0 个具有任何给定用户名的用户,对吧?

标签: php mysql database pdo


【解决方案1】:

$stmt->fetchColumn 不获取行数;在这种情况下,它将从结果集的第一行中获取第一列。由于这不等于1,因此您的测试通常会失败。

在这种情况下,实际上也不需要计算返回的行数,因为您期望的是 1 或 0(如果用户名不存在)。所以你可以简单地做:

$stmt->execute();
$user = $stmt->fetchObject();
if (!$user) {
    // not found
}
else {
    echo "User $user->username found!";
}

if(!$user) 测试有效,因为如果没有要获取的行,$user 将是false(请参阅fetchObject 的文档)。

【讨论】:

  • 感谢您的回复,好的,我将如何获取行数
  • @neeko:查看更新后的答案。几乎所有时间都不需要获取行数,只需遍历它们即可。如果你需要计算一些东西,最好使用SELECT COUNT(...)
  • 谢谢!!现在正在工作!慢慢地我试图改变我的旧操作,我想知道你是否知道使用 PDO 执行查询比使用旧的 mysql_* 有什么好处?
  • @neeko:有几个好处。首先是防止 SQL 注入攻击。
  • 谢谢,另外,您如何评价问题中工作声明的安全性?
【解决方案2】:
$query = "SELECT * FROM people WHERE username = :username";
$stmt = $conn->prepare($query);
$stmt->bindParam(':username', $username);   
$stmt->execute();

while ($row = $stmt->fetchObject()) {
    // do stuff
}

【讨论】:

    【解决方案3】:

    你想要

    if ($stmt->num_rows == 1) {
    

    改为。

    【讨论】:

      【解决方案4】:

      使用 PDOStatement::rowCount 作为 num_rows 和 PDOStatement::fetch(PDO::FETCH_ASSOC) 作为 fetch_assoc 等效项。

      【讨论】:

      • 每个人都错过了获取(PDO::FETCH_ASSOC)
      猜你喜欢
      • 1970-01-01
      • 2016-07-23
      • 2017-10-17
      • 2015-02-12
      • 1970-01-01
      • 1970-01-01
      • 2012-11-17
      • 1970-01-01
      • 2013-03-01
      相关资源
      最近更新 更多