【问题标题】:Single result from database using mysqli使用 mysqli 来自数据库的单个结果
【发布时间】:2022-01-18 19:59:10
【问题描述】:

我是第一次尝试使用 mySQLi。在循环的情况下我已经做到了。循环结果正在显示,但是当我尝试显示单个记录时我被卡住了。这是正在运行的循环代码。

<?php
// Connect To DB
$hostname="localhost";
$database="mydbname";
$username="root";
$password="";

$conn = mysqli_connect($hostname, $username, $password, $database);
?>

<?php
$query = "SELECT ssfullname, ssemail FROM userss ORDER BY ssid";
$result = mysqli_query($conn, $query);
$num_results = mysqli_num_rows($result);
?>

<?php
/*Loop through each row and display records */
for($i=0; $i<$num_results; $i++) {
$row = mysqli_fetch_assoc($result);
?>

Name: <?php print $row['ssfullname']; ?>
<br />
Email: <?php print $row['ssemail']; ?>
<br /><br />

<?php 
// end loop
} 
?>

如何从第一行或其他任何地方显示一条记录、任何记录、姓名或电子邮件,仅显示一条记录,我该怎么做? 在单个记录的情况下,考虑删除所有上述循环部分,让我们显示没有循环的任何单个记录。

【问题讨论】:

  • ...ORDER BY ssid LIMIT 1 也删除 for($i = ..){}
  • 实际上我想删除循环部分,并且没有限制我想获得一条带有查询的记录以显示单个记录。

标签: php loops mysqli


【解决方案1】:

如果只需要一个结果,则不应使用循环。立即获取该行。

  • 如果您需要将整行提取到关联数组中:

      $row = $result->fetch_assoc();
    
  • 如果您只需要一个值

      $row = $result->fetch_row();
      $value = $row[0] ?? false;
    

最后一个示例将返回第一个返回行的第一列,如果没有返回行,则返回 false。也可以缩短为一行,

$value = $result->fetch_row()[0] ?? false;

以下是不同用例的完整示例

要在查询中使用的变量

如果要在查询中使用变量,则必须使用准备好的语句。例如,假设我们有一个变量$id

$query = "SELECT ssfullname, ssemail FROM userss WHERE id=?";
$stmt = $conn->prepare($query);
$stmt->bind_param("s", $id);
$stmt->execute();
$result = $stmt->get_result();
$row = $result->fetch_assoc();

// in case you need just a single value
$query = "SELECT count(*) FROM userss WHERE id=?";
$stmt = $conn->prepare($query);
$stmt->bind_param("s", $id);
$stmt->execute();
$result = $stmt->get_result();
$value = $result->fetch_row()[0] ?? false;

以上过程的详细解释可以看我的article。至于为什么你必须遵循它,在这个著名的question中有解释

查询中没有变量

在您的情况下,查询中没有使用变量,您可以使用query() 方法:

$query = "SELECT ssfullname, ssemail FROM userss ORDER BY ssid";
$result = $conn->query($query);
// in case you need an array
$row = $result->fetch_assoc();
// OR in case you need just a single value
$value = $result->fetch_row()[0] ?? false;

顺便说一句,虽然在学习的同时使用原始 API 是可以的,但将来考虑使用一些数据库抽象库或至少一个辅助函数:

// using a helper function
$sql = "SELECT email FROM users WHERE id=?";
$value = prepared_select($conn, $sql, [$id])->fetch_row[0] ?? false;

// using a database helper class
$email = $db->getCol("SELECT email FROM users WHERE id=?", [$id]);

如您所见,虽然辅助函数可以减少代码量,但类的方法可以将所有重复代码封装在里面,让您只编写有意义的部分——查询、输入参数和所需的结果格式(以方法名称的形式)。

【讨论】:

  • 是的,这就是面向对象的编程。这让我害怕,因为这似乎很难。但是我很想学它。请推荐一个地方/来源,我可以在那里了解类以及类和对象的使用等。
  • 您只需要了解 OOP 才能编写类。虽然使用它们不需要特殊知识,但它就像调用常规函数一样简单。唯一的区别是函数名前有一个小前缀$class-&gt;。其余的都是一样的。
【解决方案2】:

从 PHP 8.1 开始,mysqli_result::fetch_column() 可用

您可以使用mysqli_result::fetch_column() 从结果集中获取单个标量值。

新方法接受您要读取的列的从 0 开始的位置。默认值为 0。

$query = "SELECT ssfullname, ssemail FROM userss WHERE ud=?";
$stmt = $conn->prepare($query);
$stmt->execute([$id])
$result = $stmt->get_result();
$ssemail = $result->fetch_column(1);

请注意,此方法会将内部指针移动到下一行,就像其他 fetch_* 方法一样。当它到达末尾时,它将返回false。因此,在上面的示例中,您最好使用fetch_assoc() 将整行提取到一个数组中。

也可以和mysqli::query()一起用于不带参数的SQL语句。

$query = "SELECT count(*) FROM userss";
$count = $conn->query($query)->fetch_column();

【讨论】:

    【解决方案3】:

    第一个答案将完成这项工作,但在这种情况下,您不需要循环结果。

    $row = $result->fetch_row();
    

    只需回显该列

      echo   $row['column']; 
    

    这应该可以解决问题

    【讨论】:

      【解决方案4】:

      不要使用 $row = $query-&gt;fetch(); 尝试使用:

      $result = $query->get_result();
      $row=$result->fetch_assoc();
      

      每次你可以通过显示它们来检查你是否从 mysql 表中获取数据:

      var_export( $row['put your column name here'] );

      【讨论】:

        【解决方案5】:

        如果您只假设一个结果,您可以按照 Edwin 的建议通过使用特定用户 ID 来执行此操作。

        $someUserId = 'abc123';
        
        $stmt = $mysqli->prepare("SELECT ssfullname, ssemail FROM userss WHERE user_id = ?");
        $stmt->bind_param('s', $someUserId);
        
        $stmt->execute();
        
        $stmt->bind_result($ssfullname, $ssemail);
        $stmt->store_result();
        $stmt->fetch();
        
        ChromePhp::log($ssfullname, $ssemail); //log result in chrome if ChromePhp is used.
        

        或作为“您的常识”,仅选择一个用户。

        $stmt = $mysqli->prepare("SELECT ssfullname, ssemail FROM userss ORDER BY ssid LIMIT 1");
        
        $stmt->execute();
        $stmt->bind_result($ssfullname, $ssemail);
        $stmt->store_result();
        $stmt->fetch();
        

        除了 PHP v.5 之外,与上述没有什么真正不同

        【讨论】:

          【解决方案6】:

          使用mysqli_fetch_row()。试试这个,

          $query = "SELECT ssfullname, ssemail FROM userss WHERE user_id = ".$user_id;
          $result = mysqli_query($conn, $query);
          $row   = mysqli_fetch_row($result);
          
          $ssfullname = $row['ssfullname'];
          $ssemail    = $row['ssemail'];
          

          【讨论】:

          • 你不能用 mysqli_fetch_row 做到这一点,因为它返回一个枚举数组。例如:$row[0], $row[1] 如果要指定字段名称,则需要使用返回关联数组的 mysqli_fetch_assoc。例如:$row['ssfullname'];
          猜你喜欢
          • 2023-01-02
          • 2011-05-03
          • 2013-11-17
          • 2012-08-15
          相关资源
          最近更新 更多