PHP 中Fetch,FetchAll从数据库中取数据,遍历出来的都是字符串吗
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了PHP 中Fetch,FetchAll从数据库中取数据,遍历出来的都是字符串吗相关的知识,希望对你有一定的参考价值。
举例,首先看了pymysql里面的cursor类,关于execute、fetchone和fetchall定义如下:#调用self._query方法进行查询
def execute(self, query, args=None):
"""Execute a query
:param str query: Query to execute.
:param args: parameters used with query. (optional)
:type args: tuple, list or dict
:return: Number of affected rows
:rtype: int
If args is a list or tuple, %s can be used as a placeholder in the query.
If args is a dict, %(name)s can be used as a placeholder in the query.
"""
while self.nextset():
pass
query = self.mogrify(query, args)
result = self._query(query)
self._executed = query
return result
#调用_do_get_result获取查询结果
def _query(self, q):
conn = self._get_db()
self._last_executed = q
self._clear_result()
conn.query(q)
self._do_get_result()
return self.rowcount
#这里获取结果
def _do_get_result(self):
conn = self._get_db()
self._result = result = conn._result
self.rowcount = result.affected_rows
self.description = result.description
self.lastrowid = result.insert_id
self._rows = result.rows
self._warnings_handled = False
if not self._defer_warnings:
self._show_warnings()
其实看到这里代码逻辑已经很清楚了,在调用cursor.execute执行SQL的时候,就将MySQL查询的结果放到result这个变量里了,也就是说结果集放到了客户端的内存变量里,那么获取数据的方式也就是从这个内存变量里去获取数据,只是获取的行为有所不同而已了。
def fetchone(self):
"""Fetch the next row"""
self._check_executed()
if self._rows is None or self.rownumber >= len(self._rows):
return None
result = self._rows[self.rownumber]
self.rownumber += 1
return result
def fetchmany(self, size=None):
"""Fetch several rows"""
self._check_executed()
if self._rows is None:
return ()
end = self.rownumber + (size or self.arraysize)
result = self._rows[self.rownumber:end]
self.rownumber = min(end, len(self._rows))
return result
def fetchall(self):
"""Fetch all the rows"""
self._check_executed()
if self._rows is None:
return ()
if self.rownumber:
result = self._rows[self.rownumber:]
else:
result = self._rows
self.rownumber = len(self._rows)
return result
口说无凭,我们直接通过Wireshark抓包来证明一下,首先我在本地执行脚本如下,然后我监听本地的网卡流量
import pymysql
conn = pymysql.connect(host='xxx', port=3306,
user='xucl', password='xuclxucl', database='xucl')
cursor = conn.cursor()
cursor.execute("select * from t")
注意,我这里并没有执行fetch操作,如果监听到的包里面包含了结果,那么就证明我们前面的分析是正确的,话不多说开始实验,Wireshark抓包如下:
果然跟我们之前的预测是一致的,即使没有进行fetch操作,MySQL也将结果集发送到客户端了。另外关于结果集发送,可以参考我另外一篇文章:《由一个抓瞎的SQL引申出去》
结论:
客户端执行SQL的时候,MySQL一次性将结果集发送给了客户端
客户端接收到结果集以后存储本地内存变量中
fetch结果只是从这个本地变量中获取,fetchone/fetchmany/fetchall只是获取行为的不通,因此对于MySQL来说并没有什么不通的。 参考技术A MSSQL不支持这样的极限0,10 N个记录必须采取MySQL的语法。值得注意的是寻呼时MSSQL与前N *点击看详细,MSSQL可用于设置偏移mssql_data_seek点击看详细分贝所有操作功能是mssql_在这样mssql_query开头(),mssql_fetch_array()等。本回答被提问者和网友采纳
PDO 循环并打印 fetchAll
【中文标题】PDO 循环并打印 fetchAll【英文标题】:PDO looping through and printing fetchAll 【发布时间】:2010-12-03 22:35:55 【问题描述】:我无法从 fetchAll 获取数据以选择性地打印。
在普通的mysql中我是这样做的:
$rs = mysql_query($sql);
while ($row = mysql_fetch_array($rs))
$id = $row['id'];
$n = $row['n'];
$k = $row['k'];
在 PDO 中,我遇到了麻烦。我绑定了参数,然后像上面一样将获取的数据保存到 $rs 中,目的是以相同的方式循环它..
$sth->execute();
$rs = $query->fetchAll();
现在问题来了。我该怎么做才能获得与上面的while循环匹配的东西?!我知道我可以使用 print_r() 或 dump_var,但这不是我想要的。我需要做以前可以用常规 mysql 做的事情,比如根据需要单独获取 $id、$n、$k。有可能吗?
提前谢谢..
【问题讨论】:
【参考方案1】:应该是
while ($row = $query->fetch(PDO::FETCH_ASSOC))
$id = $row['id'];
$n = $row['n'];
$k = $row['k'];
如果你坚持fetchAll
,那么
$results = $query->fetchAll(PDO::FETCH_ASSOC);
foreach($results as $row)
$id = $row['id'];
$n = $row['n'];
$k = $row['k'];
PDO::FETCH_ASSOC
仅获取列名并省略数字索引。
【讨论】:
非常感谢您的帮助。我选择了 2,因为在循环之前我也必须计算它。所以将它存储在 $results 之前更有意义。 $query->rowCount() 可能返回计数。 它不适用于 SELECT 语句。看到这个问题:***.com/questions/460010/… 你在这一行多了一个右括号:$results = $query->fetchAll(PDO::FETCH_ASSOC));
while 循环没有显示任何内容,至少它也没有中断进程。 foreach 循环显示结果(我使用了一个虚拟查询SHOW TABLES
,这应该不是问题)。我对 foreach 解决方案很好,只是想知道为什么。以上是关于PHP 中Fetch,FetchAll从数据库中取数据,遍历出来的都是字符串吗的主要内容,如果未能解决你的问题,请参考以下文章