问题出在mysql_fetch_array这一步,此方法的第二个参数表示你要获取的数组的类型
MYSQL_ASSOC 关联数组,就是键名是id,name的
MYSQL_NUM 索引数组,键名是数字的
MYSQL_BOTH 以上两种都有
不给第二个参数的话,默认是MYSQL_BOTH,所以就出现了你上面的结果
举例,首先看了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 selfnextset():
pass
query = selfmogrify(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()
connquery(q)
self_do_get_result()
return selfrowcount
#这里获取结果
def _do_get_result(self):
conn = self_get_db()
self_result = result = conn_result
selfrowcount = resultaffected_rows
selfdescription = resultdescription
selflastrowid = resultinsert_id
self_rows = resultrows
self_warnings_handled = False
if not self_defer_warnings:
self_show_warnings()
其实看到这里代码逻辑已经很清楚了,在调用cursorexecute执行SQL的时候,就将MySQL查询的结果放到result这个变量里了,也就是说结果集放到了客户端的内存变量里,那么获取数据的方式也就是从这个内存变量里去获取数据,只是获取的行为有所不同而已了。
def fetchone(self):
"""Fetch the next row"""
self_check_executed()
if self_rows is None or selfrownumber >= len(self_rows):
return None
result = self_rows[selfrownumber]
selfrownumber += 1
return result
def fetchmany(self, size=None):
"""Fetch several rows"""
self_check_executed()
if self_rows is None:
return ()
end = selfrownumber + (size or selfarraysize)
result = self_rows[selfrownumber:end]
selfrownumber = min(end, len(self_rows))
return result
def fetchall(self):
"""Fetch all the rows"""
self_check_executed()
if self_rows is None:
return ()
if selfrownumber:
result = self_rows[selfrownumber:]
else:
result = self_rows
selfrownumber = len(self_rows)
return result
口说无凭,我们直接通过Wireshark抓包来证明一下,首先我在本地执行脚本如下,然后我监听本地的网卡流量
import pymysql
conn = pymysqlconnect(host='xxx', port=3306,
user='xucl', password='xuclxucl', database='xucl')
cursor = conncursor()
cursorexecute("select from t")
注意,我这里并没有执行fetch *** 作,如果监听到的包里面包含了结果,那么就证明我们前面的分析是正确的,话不多说开始实验,Wireshark抓包如下:
果然跟我们之前的预测是一致的,即使没有进行fetch *** 作,MySQL也将结果集发送到客户端了。另外关于结果集发送,可以参考我另外一篇文章:《由一个抓瞎的SQL引申出去》
结论:
客户端执行SQL的时候,MySQL一次性将结果集发送给了客户端
客户端接收到结果集以后存储本地内存变量中
fetch结果只是从这个本地变量中获取,fetchone/fetchmany/fetchall只是获取行为的不通,因此对于MySQL来说并没有什么不通的。
var data={$data};
for (var item in data) {
$(" :radio[name="+item+"][value="+data[item]+"]")attr("checked",true);
}
上面的写法可能有错误,意思就是对数据库取出的值遍历,设置name=item且value=data[item]的checked为true。
当然也可以用模板,这样就不需要遍历,使用if标签判定value值来插入"checked", 比如:<if condition="$dataitem1 eq '10'">checked</if>
<php
$host="localhost";
$username="root";
$password="root";
$db="db4"; //库名
$mysql_table="person"; //表名
//连接数据库,面向过程
$conn=mysqli_connect($host,$username,$password);
if(!$conn){
echo "数据库连接失败";
exit;
}
//选择所要 *** 作的数据库
mysqli_select_db($conn,$db);
//设置数据库编码格式
mysqli_query($conn,"SET NAMES UTF8");
//编写sql获取分页数据 SELECT FROM 表名 LIMIT 起始位置,显示条数
//注意:以下id,name,age,say都是字段节点名,person是表名,db4是数据库名,think是指定的关键字
$sql = 'SELECT id, name, age, say
FROM person
WHERE say LIKE "%think%" order by id ASC LIMIT '($page-1)$pageSize ",{$pageSize}";
// 节点名 关键字 节点名 可指定数量limit后可写一个指定的数字
//$sql="select from $mysql_table"
//把sql语句传送到数据库
$result=mysqli_query($conn,$sql);
//将数据显示到table中,并未table设置格式
echo "<div class='content'>";
echo "<table border=1 cellspacing=0 width=30% align=center>";
echo "<tr><td>ID</td><td>NAME</td><td>say</td></tr>";
while ($row = mysqli_fetch_assoc($result)) {
echo "<tr>";
echo "<td>{$row['id']}</td>";
echo "<td>{$row['name']}</td>";
echo "<td>{$row['say']}</td>";
echo "<tr>";
}
echo "</table>";
echo "</div>";
//释放结果
mysqli_free_result($result);
//关闭数据库
mysqli_close($conn);
<php
$mysql_server = "127001";
$mysql_username = "root";
$mysql_password = "";
$mysql_dbname = "a";
if (isset($_GET['username']) && !empty($_GET['username'])) {
$con = mysql_connect($mysql_server, $mysql_username, $mysql_password) or die ('Could not connect to mysql server!');
mysql_select_db($mysql_dbname) or die('Could not select database!');
$username = $_GET['username'];
$sql = "SELECT 表列名 FROM b";
$arrays=mysql_fetch_assoc(mysql_query($sql));
foreach($arrays['列名'] as $v) { echo $v" "; }
mysql_close($con);
}
>
以上就是关于发现PHP查询MYSQL,遍历结果,会出现2倍数据(数据库1行数据2列,遍历输出4列)全部的内容,包括:发现PHP查询MYSQL,遍历结果,会出现2倍数据(数据库1行数据2列,遍历输出4列)、PHP 中Fetch,FetchAll从数据库中取数据,遍历出来的都是字符串吗、如何将数据库中的结果循环遍历输出到网页中 php jquery等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)