mysql_query函数查询的方式是查询出全部结果后缓存到内存中,这样就会出现超内存的现象,使用另外一个函数mysql_unbuffered_query可以解决这个问题,mysql_unbuffered_query不会缓存结果集,而是查询出来数据后立马对结果集进行操作,也就是便查询边返回,这样就不会出现超出内存的现象,但是使用mysql_unbuffered_query的是时候不能使用 mysql_num_rows() 和 mysql_data_seek()。并且向 MySQL 发送一条新的 SQL 查询之前,必须提取掉所有未缓存的 SQL 查询所产生的结果行。例如:
10年积累的网站设计制作、做网站经验,可以快速应对客户对网站的新想法和需求。提供各种问题对应的解决方案。让选择我们的客户得到更好、更有力的网络服务。我虽然不认识你,你也不认识我。但先网站制作后付款的网站建设流程,更有永城免费网站建设让你可以放心的选择与我们合作。
使用缓存结果集的代码:
function selecttest()
{
try {
$pdo = new PDO("mysql:host=localhost;dbname=test", 'root', '123456');
// 不使用缓存结果集方式
// $pdo-setAttribute(PDO::MYSQL_ATTR_USE_BUFFERED_QUERY, false);
$sth = $pdo-prepare('select * from test');
$sth-execute();
echo '最初占用内存大小:' . memory_get_usage() . "\n";
$i = 0;
while ($result = $sth-fetch(PDO::FETCH_ASSOC)) {
$i += 1;
if ($i 10) {
break;
}
sleep(1);
print_r($result);
echo '占用内存大小:' . memory_get_usage() . "\n";
}
} catch (Exception $e) {
echo $e-getMessage();
}
}
执行时将会报超出内存的错误:
Fatal error: Allowed memory size of 134217728 bytes exhausted (tried to allocate 204800000 bytes) in E:\ProgramDevelopment\RuntimeEnvironment\xampp\htdocs\test\test.php on line 56
Call Stack:
0.0005 135392 1. {main}() E:\ProgramDevelopment\RuntimeEnvironment\xampp\htdocs\test\test.php:0
0.0005 135568 2. test-selecttest() E:\ProgramDevelopment\RuntimeEnvironment\xampp\htdocs\test\test.php:85
0.0050 142528 3. PDOStatement-execute() E:\ProgramDevelopment\RuntimeEnvironment\xampp\htdocs\test\test.php:56
将上面代码中的$pdo-setAttribute(PDO::MYSQL_ATTR_USE_BUFFERED_QUERY, false);一行的注释去掉后将不在缓存结果集,这时运行该函数的结果如下:
最初占用内存大小:144808
Array
(
[id] = 1
[a] = v
[b] = w
[c] = i
)
占用内存大小:145544
Array
(
[id] = 2
[a] = b
[b] = l
[c] = q
)
占用内存大小:145544
Array
(
[id] = 3
[a] = m
[b] = p
[c] = h
)
占用内存大小:145536
Array
(
[id] = 4
[a] = j
[b] = i
[c] = b
)
占用内存大小:145536
可以看到,这时返回一条数据内存占用非常的小,也就700多字节,这样就不会出现超出内存的错误了。
?php
class MySQL{
private $host; //服务器地址
private $name; //登录账号
private $pwd; //登录密码
private $dBase; //数据库名称
private $conn; //数据库链接资源
private $result; //结果集
private $msg; //返回结果
private $fields; //返回字段
private $fieldsNum; //返回字段数
private $rowsNum; //返回结果数
private $rowsRst; //返回单条记录的字段数组
private $filesArray = array(); //返回字段数组
private $rowsArray = array(); //返回结果数组
private $charset='utf8'; //设置操作的字符集
private $query_count=0; //查询结果次数
static private $_instance; //存储对象
//初始化类
private function __construct($host='',$name='',$pwd='',$dBase=''){
if($host != '') $this-host = $host;
if($name != '') $this-name = $name;
if($pwd != '') $this-pwd = $pwd;
if($dBase != '') $this-dBase = $dBase;
$this-init_conn();
}
//防止被克隆
private function __clone(){}
public static function getInstance($host='',$name='',$pwd='',$dBase=''){
if(FALSE == (self::$_instance instanceof self)){
self::$_instance = new self($host,$name,$pwd,$dBase);
}
return self::$_instance;
}
public function __set($name,$value){
$this-$name=$value;
}
public function __get($name){
return $this-$name;
}
//链接数据库
function init_conn(){
$this-conn=@mysql_connect($this-host,$this-name,$this-pwd) or die('connect db fail !');
@mysql_select_db($this-dBase,$this-conn) or die('select db fail !');
mysql_query("set names ".$this-charset);
}
//查询结果
function mysql_query_rst($sql){
if($this-conn == '') $this-init_conn();
$this-result = @mysql_query($sql,$this-conn);
$this-query_count++;
}
//取得字段数
function getFieldsNum($sql){
$this-mysql_query_rst($sql);
$this-fieldsNum = @mysql_num_fields($this-result);
}
//取得查询结果数
function getRowsNum($sql){
$this-mysql_query_rst($sql);
if(mysql_errno() == 0){
return @mysql_num_rows($this-result);
}else{
return '';
}
}
//取得记录数组(单条记录)
function getRowsRst($sql,$type=MYSQL_BOTH){
$this-mysql_query_rst($sql);
if(empty($this-result)) return '';
if(mysql_error() == 0){
$this-rowsRst = mysql_fetch_array($this-result,$type);
return $this-rowsRst;
}else{
return '';
}
}
//取得记录数组(多条记录)
function getRowsArray($sql,$type=MYSQL_BOTH){
!empty($this-rowsArray) ? $this-rowsArray=array() : '';
$this-mysql_query_rst($sql);
if(mysql_errno() == 0){
while($row = mysql_fetch_array($this-result,$type)) {
$this-rowsArray[] = $row;
}
return $this-rowsArray;
}else{
return '';
}
}
//更新、删除、添加记录数
function uidRst($sql){
if($this-conn == ''){
$this-init_conn();
}
@mysql_query($sql);
$this-rowsNum = @mysql_affected_rows();
if(mysql_errno() == 0){
return $this-rowsNum;
}else{
return '';
}
}
//返回最近插入的一条数据库的id值
function returnRstId($sql){
if($this-conn == ''){
$this-init_conn();
}
@mysql_query($sql);
if(mysql_errno() == 0){
return mysql_insert_id();
}else{
return '';
}
}
//获取对应的字段值
function getFields($sql,$fields){
$this-mysql_query_rst($sql);
if(mysql_errno() == 0){
if(mysql_num_rows($this-result) 0){
$tmpfld = @mysql_fetch_row($this-result);
$this-fields = $tmpfld[$fields];
}
return $this-fields;
}else{
return '';
}
}
//错误信息
function msg_error(){
if(mysql_errno() != 0) {
$this-msg = mysql_error();
}
return $this-msg;
}
//释放结果集
function close_rst(){
mysql_free_result($this-result);
$this-msg = '';
$this-fieldsNum = 0;
$this-rowsNum = 0;
$this-filesArray = '';
$this-rowsArray = '';
}
//关闭数据库
function close_conn(){
$this-close_rst();
mysql_close($this-conn);
$this-conn = '';
}
//取得数据库版本
function db_version() {
return mysql_get_server_info();
}
}
在php中,表单POST提交的数据是存放在$_POST变量中.$_POST变量是一个数组,它是一个以表单字段名作索引的数组.比如有以下表单:
form method="post"
p姓名:input type="text" name="name" value=""/p
p年龄:input type="text" name="age" value=""/p
pinput type="submit" value="提交"/p
/form
输入值后提交,按你的要求,在php层处理输出提交的内容,那么可以这样:
?php
echo '你的姓名是:'.$_POST['name'];//其中$_POST['name']中存放的是上面表单名为name的值
echo '你今年'.$_POST['age'].'岁';//其中$_POST['age']中存放的是上面表单名为age的值
?
如果字段内容很多,有时就可能需要循环处理.
foreach($_POST as $val){
echo $val;
}
或直接:
print_r($_POST);
当然处理或输出的格式很多,以上只是一个示例.
首先 将json 解码成数组, 用json_decode 函数 注意 一定要加上第二个参数 否则他会返回一个对象。接下来就是地递归了。这是一个最简单的递归只要逐个遍历即可。
下面是完整的代码:
$data= json_decode($str,true);
$options = getChildren($data);
function getChildren($parent,$deep=0) {
foreach($parent as $row) {
$data[] = array("id"=$row['id'], "name"=$row['name'],"pid"=$row['parentid'],'deep'=$deep);
if ($row['childs']) {
$data = array_merge($data, getChildren($row['childs'], $deep+1));
}
}
return $data;
}
?
select name="" id=""
?php foreach ($options as $row) { ?
option value="?php echo $row['id'] ?"?php echo str_pad("",$row['deep']*3, "-",STR_PAD_RIGHT); ??php echo $row['name']; ?/option
?php } ?
/select
以上代码已测试通过 效果图如下
当异常被触发时,通常会发生:在PHP5中添加了类似于其它语言的错误异常处理模块。在 PHP代码中所产生的异常可被 throw语句抛出并被 catch 语句捕获。需要进行异常处理的代码都必须放入 try 代码块内,以便捕获可能存在的异常。每一个 try 至少要有一个与之对应的 catch。
使用多个 catch 可以捕获不同的类所产生的异常,当 try 代码块不再抛出异常或者找不到 catch 能匹配所抛出的异常时,PHP 代码就会在跳转到最后一个 catch 的后面继续执行。当然,PHP 允许在 catch 代码块内再次抛出(throw)异常,当一个异常被抛出时,其后(译者注:指抛出异常时所在的代码块)的代码将不会继续执行,而 PHP 就会尝试查找第一个能与之匹配的 catch,如果一个异常没有被捕获,而且又没用使用 set_exception_handler() 作相应的处理的话,那么 PHP 将会产生一个严重的错误,并且输出 Uncaught Exception ... (未捕获异常)的提示信息.
1、异常类的层级关系,代码如下:
复制代码 代码如下:
class NotFoundException extends Exception{}
class InputException extends Exception{}
class DBException extends Exception{}
2、配置未捕捉异常的处理器,代码如下:
复制代码 代码如下:
function exception_uncaught_handler(Exception $e) {
header('Content-type:text/html; charset=utf-8');
if ($e instanceof NotFoundException)
exit($e-getMessage());
elseif ($e instanceof DBException)
exit($e-getMessage());
else
exit($e-getMessage());
}
set_exception_handler('exception_uncaught_handler');
3、在数据库连接代码,手动抛出DBException异常但未使用try…catch进行捕获处理,该异常将被PHP自定义异常处理器,exception_uncaught_handler()函数处理:
复制代码 代码如下:
$this-resConn = mysql_connect ($CONFIGS['db_host'], $CONFIGS['db_user'], $CONFIGS['db_pwd']);
if (false == is_resource($this-resConn))
throw new DBException('数据库连接失败。'.mysql_error($this-resConn));
4、业务逻辑一瞥:
复制代码 代码如下:
if (0 != strcmp($curAlbum-interest_id, $it))
throw new NotFoundException('很抱歉,你所访问的相册不存在');
以上就是PHP自定义异常处理器的具体使用方法.
php实例代码如下:
复制代码 代码如下:
?php
class customException extends Exception
{
public function errorMessage()
{
//error message
$errorMsg = 'Error on line '.$this-getLine().' in '.$this-getFile()
.': b'.$this-getMessage().'/b is not a valid E-Mail address';
return $errorMsg;
}
}
$email = "someone@example.com";
try
{
//check if
if(filter_var($email, FILTER_VALIDATE_EMAIL) === FALSE)
{
//throw exception if email is not valid
throw new customException($email);
}
//check for "example" in mail address
if(strpos($email, "example") !== FALSE)
{
throw new Exception("$email is an example e-mail");
}
}
catch (customException $e)
{
echo $e-errorMessage();
}
catch(Exception $e)
{
echo $e-getMessage();
}
?
例子解释:上面的代码测试了两种条件,如何任何条件不成立,则抛出一个异常.
1.customException() 类是作为旧的 exception 类的一个扩展来创建的,这样它就继承了旧类的所有属性和方法.
2.创建 errorMessage() 函数,如果 e-mail 地址不合法,则该函数返回一个错误消息.
3.执行 "try" 代码块,在第一个条件下,不会抛出异常.
4.由于 e-mail 含有字符串 "example",第二个条件会触发异常.
5."catch" 代码块会捕获异常,并显示恰当的错误消息.
如果没有捕获 customException,紧紧捕获了 base exception,则在那里处理异常,重新抛出异常,有时,当异常被抛出时,您也许希望以不同于标准的方式对它进行处理,可以在一个 "catch" 代码块中再次抛出异常,代码如下:
总结:PHP异常的使用方法分三步:
第一步:定义异常类,如果不定义就用系统默认的异常类;
第二步:当出现异常时用 throw 抛出异常,例如 ex1($num2);异常的参数是$num2用该异常的getMessage()获取;
第三步:触发异常,用try子句,当满足条件时 throw new ex1($num);
第四步:catch捕获异常 catch (ex2 $e),相当于实例化一个定义好的异常类ex2为$e;
注意,异常可以定义多个,但是只能触发一个,也就是说只能用catch捕获一个异常.
基本异常类,创建可抛出一个异常的函数:
复制代码 代码如下:
function num($num){
if ($num1){//异常抛出条件
$msg="数值不能大于1″;//异常提示信息
throw new Exception($msg);//抛出异常
}
echo "数值小于1″;
}
//在 "try" 代码块中触发异常
try {
num(3);
echo "执行正常";
}
//捕获异常
catch (Exception $e){
echo "错误信息:".$e-getMessage();//Exception()的系统方法获取异常信息
echo "错误文件:".$e-getFile();//Exception()的系统方法获取异常文件名
echo "行数:".$e-getLine();//Exception()的系统方法获取异常行数
}
//======================================================================
echo "br========================================================br";
//扩展基本异常类
function checkEmail($email){//定义一个可以抛出异常的判断EMAIL合法性的函数
if (filter_var($email,FILTER_VALIDATE_EMAIL)==false){
throw new checkEmailException($email);//抛出异常用EMAIL做参数
}
echo "邮件合法";
}
class checkEmailException extends Exception{//定义扩展异常类
public function errormsg(){
$msg="错误原因:".$this-getMessage()."不是一个合法的EMAIL地址!";
$msg.="错误文件名:".$this-getFile();
$msg.="错误行数:".$this-getLine();
echo $msg;
}
}
$email="email…..@chhua.com";
try {//触发异常
checkEmail($email);
}
//捕获异常
catch (checkEmailException $e){
$e-errormsg();
}
//==================================多个异常的捕获
echo "br===================================================br";
class ex1 extends Exception{//定义一个异常类
public function msg(){
$msg="错误原因:".$this-getMessage()."大于100br";
$msg.="错误文件:".$this-getFile()."Br";
$msg.="错误代码:".$this-getCode()."br";
$msg.="行数:".$this-getLine()."br";
echo $msg;
}
}
class ex2 extends Exception{//定义一个异常类
public function msg(){
$msg="错误原因:".$this-getMessage()."等于100br";
$msg.="错误文件:".$this-getFile()."Br";
$msg.="行数:".$this-getLine()."br";
echo $msg;
}
}
$num2=100;
try {
if ($num2100){//当条件满足时触发
throw new ex1($num2);
}
if ($num2==100){//当条件满足时触发
throw new ex2($num2);
}
}
catch (ex2 $e){//捕获触发的异常
$e-msg();
}
catch (ex1 $e){//捕获触发的异常
$e-msg();
}
使用for循环
定义变量$i,配合select * from table where ………… limit $i,100
这样就可以了
我之前就做过,但因为换了工作,代码在之前的公司,否则就可以让你参考下了
另外,我觉得100太少了,最起码得改成1000才行