【问题标题】:How to read "fetch(PDO::FETCH_ASSOC);"如何阅读“获取(PDO::FETCH_ASSOC);”
【发布时间】:2013-05-30 21:59:07
【问题描述】:

我正在尝试使用 PHP 构建一个 Web 应用程序,并且我正在使用 Memcached 来存储数据库中的用户数据。

例如,假设我有这段代码:

 $sql    = "SELECT * FROM users WHERE user_id = :user_id";
$stmt   = $this->_db->prepare($sql);
$result = $stmt->execute(array(":user_id" => $user_id));
$user   = $stmt->fetch(PDO::FETCH_ASSOC);

我不确定如何读取$user 变量并从中获取数据。我需要能够阅读电子邮件和密码栏。

这是如何工作的?

【问题讨论】:

  • 使用print_r($user);查看返回的内容
  • 它返回一个数组,这是否意味着我只是读取了一个 $user['password']?
  • @PHPDEV:是的。正是:)
  • 谢谢大家。我对 PDO 的了解不是很好,现在我完全明白如何阅读这些东西了。

标签: php pdo


【解决方案1】:

PDOStatement::fetch 从结果集中返回一行。参数PDO::FETCH_ASSOC 告诉 PDO 将结果作为关联数组返回。

数组键将匹配您的列名。如果您的表包含“电子邮件”和“密码”列,则数组的结构如下:

Array
(
    [email] => 'youremail@yourhost.com'
    [password] => 'yourpassword'
)

要从“电子邮件”列中读取数据,请执行以下操作:

$user['email'];

对于“密码”:

$user['password'];

【讨论】:

  • 如何从返回的数据中获取行数?
  • @PHPDEV 你实际上不需要行数
  • @George Cummins :很抱歉多年后看到您的评论并与之相矛盾:rowcount() 仅用于计算受影响的行数(插入、更新、删除)。要计算结果集,它可能适用于某些数据库(如 mysql),但根本无法保证,请参阅php.net/manual/en/pdostatement.rowcount.php。使用fetchAll(),然后使用count() 对数组条目进行计数,或者如果计数是唯一需要的值,则查询select count (*)
【解决方案2】:

像任何其他关联数组一样遍历数组:

while($data = $datas->fetch(PDO::FETCH_ASSOC)){
    print $data['title'] . '<br>';
}

$resultset = $datas->fetchALL(PDO::FETCH_ASSOC);

echo '<pre>' . $resultset . '</pre>';

【讨论】:

    【解决方案3】:

    方法

    $user = $stmt->fetch(PDO::FETCH_ASSOC);
    

    返回一个字典。您可以简单地获取电子邮件和密码:

    $email = $user['email'];
    $password = $user['password'];
    

    其他方法

    $users = $stmt->fetchall(PDO::FETCH_ASSOC);
    

    返回字典列表

    【讨论】:

    • 这比 4 岁接受的这个问题的答案好多少?
    • 最好用“列表”和“字典”来代替“数组”这个词。
    • “关联数组”是“字典”的正确词:)
    • 鉴于我们专门讨论 PHP,术语 listdictionary 是完全不正确的。 PHP 既没有列表也没有字典。它有数组和关联数组。
    【解决方案4】:

    PDO:FETCH_ASSOC 将结果放入一个数组中,其中的值映射到它们的字段名称。

    您可以像这样访问name 字段:$user['name']

    我建议使用PDO::FETCH_OBJ。它获取对象中的字段,您可以像这样访问:$user-&gt;name

    【讨论】:

    • 为什么你推荐这个?为什么它更好或有什么优势?请通过editing (changing) your answer 回复,而不是在 cmets 中(without "Edit:"、"Update:" 或类似的 - 答案应该看起来像是今天写的)。
    【解决方案5】:

    要读取结果,您可以像读取一个简单的 PHP 数组一样读取它。

    例如,获取name 可以像$user['name'] 一样完成,等等。 fetch(PDO::FETCH_ASSOC) 方法只会返回一个元组。如果要获取所有元组,可以使用fetchall(PDO::FETCH_ASSOC)。您可以遍历多维数组并获得相同的值。

    【讨论】:

    • 它不是“像一个数组”,它一个数组。附言tuple 不是 PHP 术语 :)
    【解决方案6】:

    设计模式“表数据网关”

    class Gateway
    {
        protected $connection = null;
    
        public function __construct()
        {
            $this->connection = new PDO("mysql:host=localhost; dbname=db_users", 'root', '');
        }
    
        public function loadAll()
        {
            $sql = 'SELECT * FROM users';
            $rows = $this->connection->query($sql);
    
            return $rows;
        }
    
        public function loadById($id)
        {
            $sql = 'SELECT * FROM users WHERE user_id = ' . (int) $id;
            $result = $this->connection->query($sql);
    
            return $result->fetch(PDO::FETCH_ASSOC);
            // http://php.net/manual/en/pdostatement.fetch.php //
        }
    }
    

    仅打印包含“user_id”列的所有行

    $gateway  = new Gateway();
    $users    = $gateway->loadAll();
    
    $no = 1;
    foreach ($users as $key => $value) {
        echo $no . '. ' . $key . ' => ' . $value['user_id'] . '<br />';
        $no++;
    }
    

    在所有列中打印 user_id = 1

    $user = $gateway->loadById(1);
    
    $no = 1;
    foreach ($user as $key => $value) {
        echo $no . '. ' . $key . ' => ' . $value . '<br />';
        $no++;
    }
    

    打印 user_id = 1 和列 'email and password'

    $user = $gateway->loadById(1);
    
    echo $user['email'];
    echo $user['password'];
    

    【讨论】:

      猜你喜欢
      • 2012-08-19
      • 2016-05-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-08-31
      • 2017-09-11
      • 2023-03-04
      相关资源
      最近更新 更多