【问题标题】:PHP PDO returning single rowPHP PDO 返回单行
【发布时间】:2011-07-24 07:40:00
【问题描述】:

更新 2:

那么这是它可以得到的最优化的吗?

$DBH = new PDO( "connection string goes here" );

$STH = $DBH -> prepare( "select figure from table1" );

$STH -> execute();

$result = $STH -> fetch();

echo $result ["figure"];

$DBH = null;

更新 1:

我知道我可以为 sql 查询添加限制,但我也想摆脱我不应该需要的 foreach 循环。

原始问题:

由于“foreach”部分,我有以下脚本对于从数据库中返回许多行来说是很好的 IMO。

如果我知道我总是只能从数据库中获取 1 行,我该如何优化它。如果我知道我只会从数据库中获取 1 行,我不明白为什么需要 foreach 循环,但我不知道如何更改代码。

$DBH = new PDO( "connection string goes here" );

$STH = $DBH -> prepare( "select figure from table1" );

$STH -> execute();

$result = $STH -> fetchAll();

foreach( $result as $row ) {
    echo $row["figure"];
}

$DBH = null;

【问题讨论】:

  • $STH - $DBH -> prepare 应该是 $STH = $DBH -> prepare 此页面上的多个位置。
  • 可以在break;中使用foreach

标签: php pdo


【解决方案1】:

随便取。只得到一排。所以不需要foreach循环:D

$row  = $STH -> fetch();

示例(ty northkildonan):

$id = 4;
$stmt = $dbh->prepare("SELECT name FROM mytable WHERE id=? LIMIT 1"); 
$stmt->execute([$id]); 
$row = $stmt->fetch();

【讨论】:

  • 如果您在准备语句中使用“LIMIT 1”,则最优化。
  • 太棒了,请给出完整的例子。在上面的例子中,不仅仅是一行必须去的地方。
  • @andrebruton $dbh = new PDO(" --- connection string --- "); $stmt = $dbh->prepare("SELECT name FROM mytable WHERE id=4 LIMIT 1"); $stmt->execute(); $row = $stmt->fetch();
  • 如果您只需要一个键值数组,fetch(PDO::FETCH_ASSOC) 会将返回的数组减半。
  • 你真的需要一直LIMIT 1吗?知道您正在选择 UNIQUE 值。
【解决方案2】:
$DBH = new PDO( "connection string goes here" );
$STH - $DBH -> prepare( "select figure from table1 ORDER BY x LIMIT 1" );

$STH -> execute();
$result = $STH -> fetch();
echo $result ["figure"];

$DBH = null;

您可以同时使用 fetch 和 LIMIT。 LIMIT 的效果是数据库只返回一个条目,因此 PHP 必须处理的数据非常少。使用 fetch 您可以从数据库响应中获得第一个(也是唯一一个)结果条目。

您可以通过设置获取类型进行更多优化,请参阅http://www.php.net/manual/de/pdostatement.fetch.php。如果您仅通过列名访问它,则需要编号数组。

注意 ORDER 子句。使用 ORDER 或 WHERE 获取所需的行。否则,您将一直获得表格中的第一行。

【讨论】:

    【解决方案3】:

    你试过了吗:

    $DBH = new PDO( "connection string goes here" );
    $row = $DBH->query( "select figure from table1" )->fetch();
    echo $row["figure"];
    $DBH = null;
    

    【讨论】:

    • 你实际上可以走得更远,做$row = $DBH->query($query)->fetch()['figure']。如果fetch 因为没有结果而返回false,PHP 将默默地忽略无效的键引用。如果query 出现问题,取决于您设置错误处理的方式,它会抛出异常(在我看来是理想的),或者您会收到Invalid object method reference "fetch" on "false".... 错误,其中的一种形式无论如何你都会得到,因为查询显然失败了。
    【解决方案4】:

    您可以尝试使用 PDO 基于用户输入的数据库 SELECT 查询:

    $param = $_GET['username'];
    
    $query=$dbh->prepare("SELECT secret FROM users WHERE username=:param");
    $query->bindParam(':param', $param);
    $query->execute();
    
    $result = $query -> fetch();
    
    print_r($result);
    

    【讨论】:

    • 我认为你只是度过了糟糕的一天,或者你只是想突出你的个人资料。我的回答证实了使用带有 PDO 查询的 SELECT 函数的变量的相同场景。我将从我的答案中删除 sql 注入评论,只是为了让你的一天(和我的一天)。
    【解决方案5】:

    如果你只想要一个字段,你可以使用 fetchColumn 而不是 fetch - http://www.php.net/manual/en/pdostatement.fetchcolumn.php

    【讨论】:

      【解决方案6】:

      使用limit 0,1进行mysql优化怎么样

      关于你的代码:

      $DBH = new PDO( "connection string goes here" );
      
      $STH - $DBH -> prepare( "select figure from table1" );
      
      $STH -> execute();
      
      $result = $STH ->fetch(PDO::FETCH_ASSOC)
      
      echo $result["figure"];
      
      $DBH = null;
      

      【讨论】:

        【解决方案7】:

        感谢 Steven 对使用 fetchColumn 的建议,这是我的建议,可以从您的代码中缩短一行。

        $DBH = new PDO( "connection string goes here" );
        $STH = $DBH->query( "select figure from table1" );
        $result = $STH->fetchColumn();
        echo $result;
        $DBH = null;
        

        【讨论】:

          猜你喜欢
          • 2019-06-07
          • 2021-09-20
          • 2012-05-03
          • 1970-01-01
          • 1970-01-01
          • 2012-05-10
          • 2012-11-21
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多