首页 > 后端开发 > 正文

PHP 中Fetch,FetchAll从数据库中取数据,遍历出来的都是字符串吗

2024-09-07 03:39:07 | 我爱编程网

最近经常有小伙伴私信询问PHP 中Fetch,FetchAll从数据库中取数据,遍历出来的都是字符串吗相关的问题,今天,我爱编程网小编整理了以下内容,希望可以对大家有所帮助。

本文目录一览:

PHP 中Fetch,FetchAll从数据库中取数据,遍历出来的都是字符串吗

PHP MYSQL 的多级分类树结构

打开数据库那就不写了。
前几天刚写了一个。你看下


/* 表结构

CREATE TABLE `lh_categroy` (

`id` int(10) NOT NULL auto_increment,

`parentid` int(6) NOT NULL,

`name` varchar(255) NOT NULL,

`keyword` varchar(255) NOT NULL COMMENT '关键字',

`des` varchar(255) NOT NULL COMMENT '描述',

PRIMARY KEY  (`id`),

UNIQUE KEY `name` (`name`)

) ENGINE=MyISAM AUTO_INCREMENT=44 DEFAULT CHARSET=utf8;

*/

/**

* 获得所有栏目排序后的列表

* @return array

*/

function getAllOrderColumns($id = 0) {

global $columns;

$result = array();

if ($id) $result[$id] = $columns[$id];

foreach ($columns as $column) {

if ($column['parentid'] == $id) {

$column['level'] = 0;

$result[$column['id']] = $column;

getColumns($columns, $column['id'], $result, 1);

}

}

return $result;

}

function getColumns($columns, $cid, &$result, $l = 1) {

foreach ($columns as $c) {

if ($c['parentid'] == $cid) { 我爱编程网

$c['level'] = $l;

$result[$c['id']] = $c;

getColumns($columns, $c['id'], $result, $l + 1);

}

}

}

$sql = 'select * from lh_categroy';

$query = mysql_query($sql);

while($row = mysql_fetch_assoc($query)){

$columns[]=$row;

}

$fenlei = '';

$fenlei =  '<select name="cid" >

<option value="0">请选择分类</option>';

foreach(getAllOrderColumns() as $v){

$v[name] = $v[level] ? ($v[level]==1 ? '&nbsp;&nbsp;|-'.$v[name]:'&nbsp;&nbsp;&nbsp;|-'.$v[name]) : $v[name];

$fenlei .= "<option value='$v[id]'>$v[name]</option>";

}

$fenlei .= '</select>';

echo $fenlei;

PHP 中Fetch,FetchAll从数据库中取数据,遍历出来的都是字符串吗

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来说并没有什么不通的。

PHP 中Fetch,FetchAll从数据库中取数据,遍历出来的都是字符串吗

用php调用mysql数据表中指定id下所有的子子孙孙数据;

我爱编程网(https://www.52biancheng.com)小编还为大家带来用php调用mysql数据表中指定id下所有的子子孙孙数据;的相关内容。

写一个递归函数即可。

$host = '';
$dbname = '';
$dsn = "mysql:host=$host,dbname=$dbname";

try {
    $dbh = new PDO($dsn, 'root', 'root');
} catch (PDOException $e) {
    die($e -> getMessage());
}

$child = function ($id) use($dbh) {
    static $final = [];
    $sql = "SELECT * FROM tablename WHERE id = $id"; // 找出需要查询的数据
    $data = $dbh -> query($sql) -> fetch(PDO::FETCH_ASSOC);
    $final[] = $data;
    
    $sql = "SELECT * FROM tablename WHERE pid = " . $data['id']; // 找出当前数据的子孙数据
    $datas = $dbh -> query($sql) -> fetchall(PDO::FETCH_ACCOS);
    foreach ($datas as $value) {
        child($value['id']);  // 无限递归
    }
    
    return $final;
}

$id = 1;   // 需要查询的数据ID
$final = $child($id);

var_dump($final);

以上就是我爱编程网小编整理的内容,想要了解更多相关资讯内容敬请关注我爱编程网。更多相关文章关注我爱编程网:www.52biancheng.com

免责声明:文章内容来自网络,如有侵权请及时联系删除。
与“PHP 中Fetch,FetchAll从数据库中取数据,遍历出来的都是字符串吗”相关推荐
php 字符串中取整数 如: $str='12|字符串'; 从$str中去前面的12出来.(php取整的几种方式)
php 字符串中取整数 如: $str='12|字符串'; 从$str中去前面的12出来.(php取整的几种方式)

php字符串中取整数如:$str='12|字符串';从$str中去前面的12出来.&lt;?php$str='12|字符串';echo(int)$str;//输出12如果你喜欢正则来解的&lt;?php$str='12|字符串';echopreg_replace('/(\d+).*/','\\1',$str);php取整的几种方式PHP取整的几种方

2024-12-09 14:04:00
php如何用foreach遍历不同数据库最后统计总数?
php如何用foreach遍历不同数据库最后统计总数?

php如何用foreach遍历不同数据库最后统计总数?php如何用foreach遍历不同数据库最后统计总数?下面适用所有一维数组.$i=0;$arr_n=count($ar)-1;foreach($aras$f){if($arr_n!=$i){echo$f."&lt;br&gt;";}$i++;}类似于$arr_n=count($ar);fo

2024-12-08 00:05:34
php数组函数遍历 PHP语言中 foreach 遍历数组用法
php数组函数遍历 PHP语言中 foreach 遍历数组用法

PHP语言中foreach遍历数组用法第一种格式遍历给定的$a数组。每次循环中,当前单元的值被赋给$b并且数组内部的指针向前移一步(因此下一次循环中将会得到下一个单元)。自PHP5起,可以很容易地通过在$b之前加上&amp;来修改数组的单元。此方法将以引用赋值而不是拷贝一个值。例如:&lt;?php$arr=array(1,2,3,4);foreach($arras&amp

2025-01-12 08:35:52
在php环境中,从oracle中获取数据如何提取具体值?
在php环境中,从oracle中获取数据如何提取具体值?

PHP中处理异常有几种方式?请详述php中异常处理方法总结:当异常被触发时,通常会发生:在PHP5中添加了类似于其它语言的错误异常处理模块。在PHP代码中所产生的异常可被throw语句抛出并被catch语句捕获。需要进行异常处理的代码都必须放入try代码块内,以便捕获可能存在的异常。每一个try至少要有一个与之对应的catch。使用多个catch可以捕获不同的类所产生的异常。当try

2024-12-21 01:46:10
抓取网页数据怎么保存到数据库 php
抓取网页数据怎么保存到数据库 php

抓取网页数据怎么保存到数据库php给一个例子你看看吧.if($pro_list_contents=@file_get_contents('-luxury.com/louis-vuitton-c-82.html')){preg_match_all("/&lt;tdwidth=\"50%\"valign=\"top\"&gt;(.*)&lt;tdwidth=\"10\"&gt;

2024-08-31 07:52:53
java 写入错误 用java向access数据库中读取和写入数据。读取时正常 但是写入时出现了错误:
java 写入错误 用java向access数据库中读取和写入数据。读取时正常 但是写入时出现了错误:

java写入错误你的class和app1_1连着了,这里一定要分开,并且app首字母要大写,改成这样的:publicclassApp1_1{publicstaticvoidmain(Stringargs[]){//这里里面的参数String和args也要分开,不要把中间的空格丢了。...}}最后就是文件名一定记得也要改成:App1_1java的各种异常JavaE

2024-06-22 15:34:23
数据库原理中ob是什么意思
数据库原理中ob是什么意思

数据库原理中ob是什么意思相关函数简介:1、Flush:刷新缓冲区的内容,输出。函数格式:flush()说明:这个函数经常使用,效率很高。2、ob_start:打开输出缓冲区函数格式:voidob_start(void)说明:当缓冲区激活时,所有来自PHP程序的非文件头信息均不会发送,而是保存在内部缓冲区。为了输出缓冲区的内容,可以使用ob_end_flush()或f

2024-12-13 22:24:13
php怎么将数据库中的所有数据赋值给变量
php怎么将数据库中的所有数据赋值给变量

php怎么将数据库中的所有数据赋值给变量第一种:数组$allbrand = array();while ($testingrow = mysqli_fetch_array ($testingquery)) {    $allbrand[] = $testingrow[2];}第二种:字符串$allbrand = '';while ($testingrow = mysqli_fetch_arr

2024-09-26 07:06:40